1. 用戶自定義變量
(1)變量設置規則
① 變量名稱可由字母、數字和下划線組成,但不能以數字開頭;
② 變量的默認類型為字符串類型,如果要對數值運算,則必須指定變量類型為數值型;
③ 變量用等號連接值,且等號兩側不能有空格;
④ 變量的值如果有空格,需使用單引號或雙引號括起;
⑤ 變量的值中,可使用"\"轉義符;
⑥ 如果需要增加變量的值,可以進行變量值的疊加,不過變量需要用雙引號包含,即"$變量名",或者用${變量名}包含;
⑦ 如果是把命令的結果作為變量值賦予變量,則需要使用反引號或$()包含命令;
⑧ 環境變量名建議大寫,便於區分。
(2)變量分類
① 用戶自定義變量;
② 環境變量:主要保存與系統操作環境相關的數據;
③ 位置參數變量:用於向腳本當中傳遞參數或數據的,變量名不能自定義,變量作用是固定的;
④ 預定義變量:是Bash中已經定義好的變量,變量名不能自定義,變量的作用也是固定的。
(3)本地變量
① 變量定義:
[root@localhost ~]# name="ws" [root@localhost ~]# echo "$name" ws
② 變量疊加:
[root@localhost ~]# aa=123 [root@localhost ~]# aa="$aa"456 [root@localhost ~]# aa=${aa}789 [root@localhost ~]# echo $aa 123456789
③ 變量查看:
[root@localhost ~]# set aa=123456789 colors=/etc/DIR_COLORS name=ws
④ 變量刪除
[root@localhost ~]# unset name
2. 環境變量
1)用戶自定義變量只在當前的shell中生效,而環境變量會在當前shell和該shell的所有子shell中生效。如果把環境變量寫入相應的配置文件中,那么該環境變量就會在所有的shell中生效。
父shell中創建子shell,可在當前shell中通過命令bash或csh來創建。可通過pstree命令(功能:確定進程數)來查看父shell與子shell的關系。
例:
[root@localhost ~]# bash [root@localhost ~]# pstree ........ sshd───sshd───bash───bash───pstree
其中,sshd為遠程連接工具,第一個bash為父shell,第二個bash是子shell,退出子shell只需輸入命令exit即可。
2)設置環境變量
格式為:export 變量名=變量值
例:
#將age和sex變量設置為環境變量
[root@localhost ~]# name=ws [root@localhost ~]# export age=26 [root@localhost ~]# sex=male [root@localhost ~]# export sex
#然后在當前shell和子shell中進行查看
[root@localhost ~]# set name=ws age=26 sex=male [root@localhost ~]# bash age=26 sex=male
3)查詢環境變量的命令為:env,刪除變量的命令為:unset 變量名
4)系統常見環境變量
① PATH:系統查找命令的路徑,系統命令並沒有寫路徑就可執行,如ls,是由於PATH環境變量的作用。因此自己寫的腳本拷貝到PATH指定的路徑中,無需寫路徑即可直接執行。
例:
[root@localhost ~]# env | grep PATH PATH=/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin #PATH變量疊加 PATH="$PATH":/root/sh
② PS1:定義系統提示符的變量
提示符 |
含義 |
\d |
顯示日期,格式為"星期 月 日" |
\h |
顯示簡寫主機名 |
\T |
顯示12小時制時間,格式為"HH:MM:SS" |
\A |
顯示24小時制時間,格式為"HH:MM" |
\u |
顯示當前用戶名 |
\w |
顯示當前所在路徑的完整名稱 |
\W |
顯示當前所在目錄的最后一個目錄 |
\# |
執行的第幾個命令 |
\$ |
提示符,root用戶為"#",普通用戶為"$" |
例:
[root@localhost ~]# PS1='[\u@\t \w]\$ ' [root@05:46:29 ~]# PS1='[\u@\h \# \W]\$ ' [root@localhost 12 ~]# PS1='[\u@\h \W]\$ ' [root@localhost ~]#
3. 位置參數變量
1)
位置參數變量 |
作用 |
$n |
n為數字,$0代表命令本身,$1-$9代表第一至第九個參數,十以上的參數需要用大括號包含,如${10} |
$* |
代表命令行中所有的參數,$*把所有的參數看成一個整體 |
$@ |
也代表命令行中所有的參數,不過$@把每個參數區分對待 |
$# |
代表命令行中所有參數的個數 |
例1:寫param.sh腳本
[root@localhost sh]# vim param.h #!/bin/sh echo $0 echo $1 echo $2 echo $3
驗證$n,向腳本中傳遞參數
[root@localhost sh]# ./param.h 11 12 13 1 2 ./param.h 11 12 13
例2:param1.sh腳本
[root@localhost sh]# vim param1.h #!/bin/bash num1=$1 num2=$2 sum=$(( $num1 + $num2 )) echo $sum
驗證:
[root@localhost sh]# ./param1.sh 1 2 3
例3:寫param3.sh
[root@localhost tmp]# vim param3.sh #!/bin/bash #使用$#代表所有參數個數 echo "A total of $# parameters" #使用$*代表所有的參數 echo "The parameter is:$*" #使用$@也代表所有參數 echo "The parameter is:$@"
驗證:
[root@localhost tmp]# ./param3.sh 1 2 3 4 5 A total of 5 parameters The parameter is:1 2 3 4 5 The parameter is:1 2 3 4 5
例4:$*與$@的區別
[root@localhost sh]# vim param4.sh #!/bin/bash # $*中所有參看成是一個整體,所以for只執行一次 for i in "$*" do echo "The parameter is:$i" done # $@中每個參數都看成是獨立的,會循環多次 x=1 for y in "$@" do echo "The parameter $x is:$y" x=$(( $x + 1 )) done
驗證:
[root@localhost sh]# ./param4.sh 1 2 3 4 5 The parameter is:1 2 3 4 5 The parameter 1 is:1 The parameter 2 is:2 The parameter 3 is:3 The parameter 4 is:4 The parameter 5 is:5
4. 預定義變量
1)
預定義變量 |
作用 |
$? |
shell中最后一次執行命令的返回狀態。如果這個變量的值為0,證明上一個命令正確執行;如果這個變量的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確 |
$$ |
當前進程的進程號(PID) |
$! |
后台運行的最后一個進程的進程號(PID) |
邏輯"&&"和"||"可以通過$?來判斷是否正確。
例:編寫variable.sh腳本
[root@localhost sh]# vim variable.sh #!/bin/bash #輸出當前進程PID,該PID即為variable.sh腳本執行時,生成的進程的PID echo "The current process is $$" # &可以將命令放入后台 find /root -name hello.sh & echo "The last one Daemon process is $!"
驗證:
[root@localhost sh]# ./variable.sh The current process is 1617 The last one Daemon process is 1618
2)read:接收鍵盤的輸入,其格式為:
read [選項] [變量名]
其中,-p "提示信息":在等待read輸入時,輸出提示信息;
-t 秒數:read命令會一直等待用戶輸入,使用此選項,可指定等待時間;
-n 字符數:read命令只接受指定的字符數;
-s:隱藏輸入的數據,適用於機密信息的輸入。
例:
[root@localhost sh]# vim readtest.sh #!/bin/bash # 提示"請輸入姓名"並等待30s,把用戶的輸入保存入變量 read -t 30 -p "Please input your name:" name echo "name is $name" # 使用-s選項隱藏輸入年齡 read -t 30 -s -p "Please enter your age:" age echo -e "\n" echo "age is $age" # 使用-n 1選項只接收一個輸入字符就會執行(不用輸入回車) read -n 1 -t 30 -p "Please select your gender [M/F]:" gender echo -e "\n" echo "sex is $gender"
驗證:
[root@localhost sh]# ./readtest.sh Please input your name:ws name is ws Please enter your age: age is 26 Please select your gender [M/F]:M sex is M
5. Bash的運算符
(1)數值運算與運算符
1)declare聲明變量類型,其格式為:
declare [+/-] [選項] 變量名
其中,"-"選項表示給變量設定類型屬性,"+"選項表示取消變量的類型屬性,-i選項表示將變量聲明為整數型,-x選項表示將變量聲明為環境變量,-p選項顯示指定變量被聲明的類型。
例1:
# 定義變量aa和bb [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # 聲明變量cc,並保存aa和bb的和 [root@localhost ~]# declare -i cc="$aa"+"$bb" # 顯示cc的類型 [root@localhost ~]# declare -p cc declare -i cc="33" # 取消cc的類型屬性 [root@localhost ~]# declare +i cc [root@localhost ~]# declare -p cc declare -- cc="33"
例2:expr或let數學運算工具(使用較少)
# 給變量aa和bb賦值 [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # dd為aa和bb的和,且注意"+"左右兩側必須有空格 [root@localhost ~]# dd=$(expr "$aa" + "$bb") [root@localhost ~]# echo $dd 33
例3:"$(( 運算式 ))"或"$[ 運算式 ]"(使用較多)
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ee=$(( $aa+$bb )) [root@localhost ~]# echo $ee 33 [root@localhost ~]# ff=$[ $aa+$bb ] [root@localhost ~]# echo $ff 33
(2)運算符
優先級 |
運算符 |
說明 |
13 |
-,+ |
單目負、單目正 |
12 |
!,~ |
邏輯非、按位取反或補碼 |
11 |
*,/,% |
乘、除、取模 |
10 |
+,- |
加、減 |
9 |
<<,>> |
按位左移、按位右移 |
8 |
<=,>=,<,> |
小於等於,大於等於,小於,大於 |
7 |
==,!= |
等於、不等於 |
6 |
& |
按位與 |
5 |
^ |
按位異或 |
4 |
| |
按位或 |
3 |
&& |
邏輯與 |
2 |
|| |
邏輯或 |
1 |
=,+=,-=,*=,/=,%=, &=,^=,|=,<<=,>>= |
賦值、運算且賦值 |
例:
# 雖然乘和除的優先級高於加,但通過小括號可調整運算的優先順序 [root@localhost ~]# aa=$(( (11+3)*3/2 )) [root@localhost ~]# echo $aa 21 # 14不能被3整除,余數是2 [root@localhost ~]# bb=$(( 14%3 )) [root@localhost ~]# echo $bb 2 # 邏輯與運算 [root@localhost ~]# cc=$(( 1&&0 )) [root@localhost ~]# echo $cc 0
(3)變量測試與內容替換
變量置換方式 |
變量y沒有設置 |
變量y為空值 |
變量y設置值 |
x=${y-新值} |
x=新值 |
x為空 |
x=$y |
x=${y:-新值} |
x=新值 |
x=新值 |
x=$y |
x=${y+新值} |
x為空 |
x=新值 |
x=新值 |
x=${y:+新值} |
x為空 |
x為空 |
x=新值 |
x=${y=新值} |
x=新值 y=新值 |
x為空 y值不變 |
x=$y y值不變 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不變 |
x=${y?新值} |
新值輸出到標准錯誤輸出(即屏幕) |
x為空 |
x=$y |
x=${y:?新值} |
新值輸出到標准錯誤輸出 |
新值輸出到標准錯誤輸出 |
x=$y |
例:變量測試:x=${y-新值}
[root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x new [root@localhost ~]# y="" [root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x [root@localhost ~]# y=234 [root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x 234
6. 環境變量配置文件
(1)簡介
1)source命令--環境變量配置文件的內容需要重新登錄才能生效,source命令的作用是讓其直接生效,無需重新登錄。其格式為:
source 配置文件 或 . 配置文件
注意:.與配置文件中間有空格,且.的作用即為source的作用。
2)環境變量配置文件中主要是定義對系統的操作環境生效的系統默認環境變量,如:PATH,HISTSIZE,PS1,HOSTNAME等默認環境變量。
系統中的環境變量配置文件主要有:
/etc/profile ; /etc/profile.d/*.sh ; ~/.bash_profile ; ~/.bashrc ; /etc/bashrc
(2)作用
環境變量配置文件的先后調用順序如下圖所示:
1)/etc/profile的作用有:USER變量;LOGNAME變量;MAIL變量;PATH變量;HOSTNAME變量;HISTSIZE變量;umask;調用/etc/profile.d/*.sh文件;
2)~/.bash_profile的作用: 調用了~/.bashrc文件;在PATH變量后面加入了":$HOME/bin"目錄;
3)~/.bashrc的作用:定義默認別名;調用/etc/bashrc;
4)/etc/bashrc的作用:PS1變量;umask變量;PATH變量;調用/etc/profile.d/*sh文件。注意:與/etc/profile不同,/etc/bashrc針對的是沒有登錄的shell,即不用輸入用戶名、密碼,直接在shell中進行用戶切換的情景。
(3)其他配置文件和登錄信息
1)注銷時生效的環境變量配置文件:~/.bash_logout;
2)其他配置文件:~/bash_history,當系統出現錯誤時,一個重要的排錯手段;
3)shell登陸信息:
對於本地終端歡迎信息:/etc/issue
轉義符 |
作用 |
\d |
顯示當前系統日期 |
\s |
顯示操作系統名稱 |
\l |
顯示登錄的終端號,比較常用 |
\m |
顯示硬件體系結構,如i386,i686等 |
\n |
顯示主機名 |
\o |
顯示域名 |
\r |
顯示內核版本 |
\t |
顯示當前系統時間 |
\u |
顯示當前登錄用戶的序列號 |
Linux本地支持6個本地字符終端,用Alt+F1~F6進行切換,則可通過\l顯示當前登錄的是哪個終端。
注意:/etc/issue只對本地登錄有效,對遠程登錄沒有作用。
遠程終端的歡迎信息:/etc/issue.net,轉義符在該文件中不能使用,是否顯示此歡迎信息,是由ssh的配置文件(/etc/sshd/sshd_configure)決定的,在該文件中找到"Banner"子串,然后加入"Banner /etc/issue.net"行才能顯示。寫完之后記得輸入service sshd restart命令進行重啟ssh服務。
登陸后的歡迎信息:/etc/motd,不管是本地登錄還是遠程登錄,都可以顯示此歡迎信息。