一、井號 #
1、在腳本文件中對一行進行注釋。
2、在引號和\符號后不是注釋,只是#號本身:
echo "12 # hehe"
echo '12 # hehe'
echo 12 \# hehe
3、參數替代
echo $(PATH#*:)
4、進制數轉換
echo $((16#a));將十六進制數a轉換為十進制數表示出來
echo $((5#3));將5進制數3轉換為十進制數表示出來
5、模式匹配
echo ${#string};獲得變量string所含字符的個數,如果string是個數組,則獲得數組第一個元素所含字符個數。
二、分號 ;
1、分割符,在同一行中用分號可以隔開兩個命令:
ls;cat hello
2、在引號和\符號后不是分割符,只是;號本身。
三、;;
1、兩個分號,作為case選項的終結符:
case "$variable" in
abc) echo "$variable = abc" ;;
xyz) echo "$variable = xyz" ;;
esac
四、句號 .
1、點開頭的文件是隱藏文件,要用ls -a才能看到。
2、一個點指代當前目錄,兩個點指代上級目錄。
五、引號
1、雙引號 ""
雙引號中的大多數字母或符號都代表它本身
2、單引號 ‘’
單引號中的所有字母或符號都代表它本身
六、逗號 ,
逗號用於分開多個算術表達式,對每個表達式都進行計算,但僅僅返回最后一個表達式的值。
let "t = (a = 9,5+3)"#該表達式中,對a賦值為9,計算出來t為8
七、反斜杠 \
\號表示后面的符號僅僅代表該符號本身,但只有一位有效。比如
\a就和'a'一個效果
八、正斜杠 /
1、文件名分割符,如
/usr/locale/share/
2、除法符號
九、反引號 ``
命令取代?
十、冒號 :
1、空命令,返回值為0,和true命令一樣,可以在做無限循環的條件。
2、提醒后面有一個二進制命令需要執行
: ${username = `whoami`}#如果沒有:則該行會出錯
3、參數取代?
: ${HOSTNAME?}
4、與>重定向符號一起創建一個文件(如果沒有),或者截斷一個文件(該文件已存在),該文件的長度為0
: > data.exe 和cat /dev/null > data.exe效果相同
5、與>>重定向符號一起更新一個文件的訪問及修改時間,如果沒有該文件,則創建之。和touch功效相同
注意,4、5兩條都僅對規則文件起作用,對管道,軟連接以及一些特殊文件都沒有用
6、域分割符
如$PATH變量中間的冒號
十一、感嘆號 !
1、非號,把退出狀態變成由0變成1,由等於變成不等 = ,!=
2、間接變量參考?
3、兩個感嘆號表示上一個命令 !!
十二、星號 *
1、通配符,可以在正則表達式中代替任何字符或者數字
2、乘號
3、兩個星號表示指數 **
十三、問號 ?
1、測試符號,用於條件測試?
2、通配符,可以在正則表達式中代替一個字符或者數字
十四、$
1、變量符號
2、表示一行的終止
3、${}變量取代
4、$1,$2,$3等等,指從命令行向腳本輸入的第一個,第二個,第三個參數。$0指腳本本身。
5、$#,指從命令行向腳本輸入的參數個數。
6、$*,指從命令行向腳本輸入的所有參數,但是看成一個詞。
7、$@,指從命令行向腳本輸入的所有參數,但是每個參數是根據IFS變量分開的。
比如:export IFS=':',再echo $PATH,得到的結果是:/usr/local/sbin /usr/sbin /sbin /usr/local/bin /usr/bin /bin /usr/games /usr/lib/apache-ant/bin /usr/lib/java/bin /usr/lib/java/jre/bin /usr/lib/qt/bin /usr/share/texmf/bin
8、$?,退出狀態變量。
9、$$,進程的ID號碼。
十五、圓括號 ()
1、命令組
(a = 123;echo $a)
該命令組寫了一個子腳本,子腳本中的變量對子腳本外的一切腳本均不可見。
2、數組初始化
array = (element1 element2 element3)
十六、大括號 {}
1、括號擴展?比如
grep linux file*.{txt,htm*}
在file2.txt,file1.htm,file1.html等文件中查找linux字符串
2、代碼塊,作為子函數,不能用於終端中,子函數中的變量對其他腳本還是可見的。
3、代碼塊中的函數可以進行輸入輸出重定向。
{
read line1
read line2
} < /etc/fstab
=====================================================
缺省值(:-)
如果變量后面跟着冒號和減號,則變量后面跟着是這個變量的缺省值。
$ COMPANY=
$ printf “%s/n” “${COMPANY:-Unknown Company}”
Unknown Company
變量的實際值可以保持不變。
冒號也可以省略掉不用:
$ COMPANY=
$ printf “%s/n” “${COMPANY-Nightlight Inc.}”
$
指定缺省值(:=)
如果變量后面跟着冒號和等號,則給空變量指定一個缺省值。
$ printf “%s/n” “${COMPANY:=Nightlight Inc.}”
Nightlight Inc.
$ printf “%s/n” “$COMPANY”
Nightlight Inc.
變量的實際值已經改變了。
去除冒號,則不會指定缺省值。
變量是否存在檢查(:?)
如果變量后面跟着冒號和問號,則根據變量是否存在,顯示不同的信息。信息不是必選的。
printf “Company is %s/n” /
“${COMPANY:?Error: Company has notbeen defined—aborting}”
如果沒有冒號則不會進行檢查。
覆蓋缺省值(:+)
如果變量后面跟着冒號和加號,則加好后面的字符串替換默認字符串。
$ COMPANY=”Nightlight Inc.”
$ printf “%s/n” “${COMPANY:+Company has been overridden}”
Company has been overridden
如果沒有冒號,變量也被字符串所替換,變量本身的值不改變。
替換部分字符串(:n)
如果變量后面跟着一個冒號和數字,則返回該數字開始的一個子字符串,如果后面還跟着一個冒號和數字。則第一個數字表示開始的字符,后面數字表示字符的長度。
$ printf “%s/n” “${COMPANY:5}”
light Inc.
$ printf “%s/n” “${COMPANY:5:5}”
light
根據模板刪除字串(%,#,%%,##)
如果變量后面跟着井號,則返回匹配模板被刪除后的字串。一個井號為最小可能性的匹配,兩個井號為自大可能性的匹配。表達式返回模板右邊的字符。
$ printf “%s/n” “${COMPANY#Ni*}”
ghtlight Inc.
$ printf “%s/n” “${COMPANY##Ni*}”
$ printf “%s/n” “${COMPANY##*t}”
Inc.
$ printf “%s/n” “${COMPANY#*t}”
light Inc.
使用百分號,表達式返回模板左邊的字符
$ printf “%s/n” “${COMPANY%t*}”
Nightligh
$ printf “%s/n” “${COMPANY%%t*}”
Nigh
(在我的Linux系統中上述命令不起取用)
使用模板進行子字符串的替換(//)
如果變量后只有一個斜杠,則兩個斜杠中間的字符串是要被替換的字符串,而第二個斜杠后面的字符串是要替換的字符串。如果變量后面跟着兩個斜杠,則所有出現在兩個斜杠中間的字符都要被替換為最后一個斜杠后面的字符。
$ printf “%s/n” “${COMPANY/Inc./Incorporated}”
Nightlight Incorporated
$ printf “You are the I in %s” “${COMPANY//i/I}”
You are the I in NIghtlIght Inc.
如果模板一#號開始,則匹配以模板開始的字符,如果模板以%號結尾,則匹配以模板結尾的字符。
$ COMPANY=”NightLight Night Lighting Inc.”
$ printf “%s/n” “$COMPANY”
NightLight Night Lighting Inc.
$ printf “%s” “${COMPANY//Night/NIGHT}”
NIGHTLight NIGHT Lighting Inc.
$ printf “%s” “${COMPANY//#Night/NIGHT}”
NIGHTLight Night Lighting Inc.
(我的Linux中這個不起作用)
如果沒有指定新的值,則匹配的字符會被刪除。
$ COMPANY=”Nightlight Inc.”
$ printf “%s/n” “${COMPANY/light}”
Night Inc.
也可以使用范圍符號。例如:刪除所有字符串中的標點符號,使用范圍[:punct:]。
$ printf “%s” “${COMPANY//[[:punct:]]}”
Nightlight Inc
使用星號或@符號替換變量會替換外殼腳本中所有的參數,同樣,在數組中使用星號或@符號也會替換數組中的所有元素
變量說明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后運行的后台Process的PID
$?
最后運行的命令的結束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$#
添加到Shell的參數個數
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。