Linux 腳本:node
腳本通常爲文本文件,運行腳本事實上是運行一個bash進程,此進程負責從腳本文件中讀取一個執行邏輯,然後由bash進程負責解析並運行此邏輯;shell
啓動腳本:vim
(1) # bash /PATH/TO/SCRIPT_FILEbash
(2) 一個執行權限, ide
# ./PATH/TO/SCRIPT_FILE 測試
[root@iZ28qzns9m4Z ~]# vi date.sh [root@iZ28qzns9m4Z ~]# sh date.sh #第一種執行方法 Thu, 17 Sep 2015 12:43:37 +0800 [root@iZ28qzns9m4Z ~]# ll total 4 -rw-r--r-- 1 root root 22 Sep 17 12:43 date.sh [root@iZ28qzns9m4Z ~]# chmod +x date.sh #第二種執行方法 [root@iZ28qzns9m4Z ~]# ll total 4 -rwxr-xr-x 1 root root 22 Sep 17 12:43 date.sh [root@iZ28qzns9m4Z ~]# ./date.sh Thu, 17 Sep 2015 12:44:05 +0800 [root@iZ28qzns9m4Z ~]#
bash腳本的經常使用選項:
ui
-n: 檢查腳本中的語法錯誤;spa
-x:調試執行腳本;調試
命令狀態結果:orm
bash進程用於追蹤執行的命令成功與否的狀態:
0: 成功
1-255:失敗
[root@iZ28qzns9m4Z ~]# vim date.sh [root@iZ28qzns9m4Z ~]# sh -n date.sh [root@iZ28qzns9m4Z ~]# sh -x date.sh + date -s date: option requires an argument -- 's' Try 'date --help' for more information. [root@iZ28qzns9m4Z ~]# vi date.sh [root@iZ28qzns9m4Z ~]# sh -n date.sh [root@iZ28qzns9m4Z ~]# sh -x date.sh + date -R Thu, 17 Sep 2015 14:36:06 +0800 [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]# vi date.sh [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]# sh date.sh date: option requires an argument -- 's' Try 'date --help' for more information. [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]#
自定義腳本的狀態結果:
exit n
[root@localhost bashtest]# vim t1.sh [root@localhost bashtest]# sh -x t1.sh + useradd test001 useradd: user 'test001' already exists + echo test001 + passwd --stdin test001 Changing password for user test001. passwd: all authentication tokens updated successfully. + exit 9 [root@localhost bashtest]# echo $? 9 [root@localhost bashtest]#
注意:腳本中任何位置執行了exit命令即會終止當前shell進程;
條件測試:test
界定程序執行環境;
(1) 根據運行的命令的狀態結果;
(2) 測試表達式
test 命令
[空格 命令 空格 ]
[[空格 命令 空格]]
[root@iZ28qzns9m4Z ~]# test -e /test [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]# [ -e /test ] [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]# [root@iZ28qzns9m4Z ~]# [[ -e /var ]] [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]#
整數測試:隱含着作數值大小比較,因此不要給變量引用加引用;
$A -gt $B:是否大於;是則爲「真」,不然爲「假」;
$A -ge $B: 是否大於等於;
$A -lt $B:是否小於;
$A -le $B: 是否小於等於;
$A -eq $B: 是否等於;
$A -ne $B:是否不等於;
[root@iZ28qzns9m4Z ~]# a=9 [root@iZ28qzns9m4Z ~]# b=12 [root@iZ28qzns9m4Z ~]# [[ $a -gt $b ]] [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]# [[ $a -ge $b ]] [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]# [[ $a -lt $b ]] [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]# [[ $a -le $b ]] [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]# [[ $a -eq $b ]] [root@iZ28qzns9m4Z ~]# echo $? 1 [root@iZ28qzns9m4Z ~]# [[ $a -ne $b ]] [root@iZ28qzns9m4Z ~]# echo $? 0 [root@iZ28qzns9m4Z ~]#
字符串測試:
"$A" > "$B":是否大於;
"$A" < "$B":是否小於;
"$A" == "$B":是否等於;
"$A" != "$B":是否不等於;
-z "$A":是否爲空;空則爲「真」,不然爲「假」
-n "$A":是否不空;不空則「真」,空則爲「假」
[root@iZ28qzns9m4Z ~]# a=glancesli #103 108 97 110 99 101 115 108 105 [root@iZ28qzns9m4Z ~]# b=nancy #110 97 110 99 121 [root@iZ28qzns9m4Z ~]# test "$a" = "$b" && echo Ture||echo false false [root@iZ28qzns9m4Z ~]# [ "$a" == "$b" ] && echo Ture || echo false false [root@iZ28qzns9m4Z ~]# [ "$a" != "$b" ] && echo Ture || echo false Ture [root@iZ28qzns9m4Z ~]# [ -z "$a" ] && echo Ture || echo false false [root@iZ28qzns9m4Z ~]# [ -n "$a" ] && echo Ture || echo false Ture [root@iZ28qzns9m4Z ~]# test "$a" \> "$b" && echo ture||echo false false [root@iZ28qzns9m4Z ~]# test "$a" \< "$b" && echo ture||echo false ture [root@iZ28qzns9m4Z ~]# [[ "$a" < "$b" ]] && echo Ture || echo false Ture [root@iZ28qzns9m4Z ~]# [[ "$a" > "$b" ]] && echo Ture || echo false false [root@iZ28qzns9m4Z ~]#
注:字符串比較大於小於號必須轉義,即加反斜線。字符串比較的順序是按ASCII表的順序的,大寫字母比小寫字母的值小。
文件測試:測試文件的存在性以及屬性;
-e $file: 是否存在;存在則爲「真」,不然爲「假」;
-a $file: 同上;
-f $file:文件是否存在且爲普通文件;
-d $file:文件是否存在且爲目錄;
-h $file:是否存在且爲符號連接文件;
-L $file: 同上
-b $file:是否存在且爲塊設備文件;
-c $file:是否存在且爲字符設備文件;
-S $file:是否存在且爲套接字文件;
-p $file: 是否存在且爲管道文件;
-r $file: 當前用戶對文件是否擁有讀權限;
-w $file:當前用戶對文件是否擁有寫權限;
-x $file:當前用戶對文件是否擁有執行權限;
-u $file:文件是否擁有SUID權限;
-g $file:文件是否擁有SGID權限;
-k $file:文件是否擁有sticky權限;
-O $file: 當前用戶是否爲指定文件的屬主;
-G $file: 當前用戶是否爲指定文件的屬組;
[root@iZ28qzns9m4Z home]# mkdir abc [root@iZ28qzns9m4Z home]# ll total 12 drwxr-xr-x 2 root root 4096 Sep 17 17:13 abc drwxr-xr-x 2 root root 4096 Sep 17 17:01 bashtest drwx------ 2 user001 user001 4096 Sep 17 15:13 user001 [root@iZ28qzns9m4Z home]# test -e abc [root@iZ28qzns9m4Z home]# test -e abc && echo true || echo false true [root@iZ28qzns9m4Z home]# test -e bcd && echo true || echo false false [root@iZ28qzns9m4Z home]# test -a bcd && echo true || echo false false [root@iZ28qzns9m4Z home]# test -a abc && echo true || echo false true [root@iZ28qzns9m4Z home]# test -f abc && echo true || echo false false [root@iZ28qzns9m4Z home]# test -d abc && echo true || echo false true [root@iZ28qzns9m4Z home]# ln -s abc/ cde [root@iZ28qzns9m4Z home]# ll total 12 drwxr-xr-x 2 root root 4096 Sep 17 17:13 abc drwxr-xr-x 2 root root 4096 Sep 17 17:01 bashtest lrwxrwxrwx 1 root root 4 Sep 17 17:15 cde -> abc/ drwx------ 2 user001 user001 4096 Sep 17 15:13 user001 [root@iZ28qzns9m4Z home]# test -h abc && echo true || echo false false [root@iZ28qzns9m4Z etc]# test -L system-release && echo true || echo false true [root@iZ28qzns9m4Z etc]# test -h system-release && echo true || echo false true [root@iZ28qzns9m4Z home]# test -b abc && echo true || echo false false [root@iZ28qzns9m4Z home]# test -c abc && echo true || echo false false [root@iZ28qzns9m4Z home]# test -r abc && echo true || echo false true [root@iZ28qzns9m4Z home]# vim te1.sh [root@iZ28qzns9m4Z home]# test -rxw abc && echo true || echo false -bash: test: -rxw: unary operator expected false [root@iZ28qzns9m4Z home]# test -w abc && echo true || echo false true [root@iZ28qzns9m4Z home]# test -x abc && echo true || echo false true [root@iZ28qzns9m4Z home]# test -u abc && echo true || echo false false [root@iZ28qzns9m4Z home]# test -O abc && echo true || echo false true [root@iZ28qzns9m4Z home]# test -G abc && echo true || echo false true
雙目操做符:
$file1 -nt $file2: file1是否新於file2, file1的最近一次的修改時間戳是否晚於file2的;
$file1 -ot $file2: file1是否舊於file2, file1的最近一次的修改時間戳是否早於file2的;
$file1 -ef $file2:file1與file2是否指向了同一個inode;測試兩者是否爲同一個文件的硬連接;
[root@iZ28qzns9m4Z bashtest]# ll total 8 -rwxr-xr-x 1 root root 140 Sep 17 15:42 1.sh -rw-r--r-- 1 root root 74 Sep 17 15:43 2.sh -rw-r--r-- 1 root root 0 Sep 17 17:01 nancy [root@iZ28qzns9m4Z bashtest]# test 2.sh \-ot 1.sh && echo true || echo false false [root@iZ28qzns9m4Z bashtest]# test 2.sh \-nt 1.sh && echo true || echo false true [root@iZ28qzns9m4Z bashtest]# test 2.sh \-ef 1.sh && echo true || echo false false [root@iZ28qzns9m4Z bashtest]# [root@iZ28qzns9m4Z bashtest]# ln -s nancy n1.sh [root@iZ28qzns9m4Z bashtest]# ln -s nancy n2.sh [root@iZ28qzns9m4Z bashtest]# test n2.sh \-ef n1.sh && echo true || echo false true [root@iZ28qzns9m4Z bashtest]#
測試表達式:
整數測試:-gt, -lt, -ge, -le, -eq, -ne
字符串測試:==, >, <, !=, -z, -n, =~
注意:
(1) 字符串等會比較測試:[ "$hostname" == 'localhost' ]
(2) 模式匹配測試:[[ "STRING" =~ PATTERN ]]
組合測試條件:
條件間邏輯運算:
與:多個條件要同時知足;
或:多個條件知足其一便可;
非:對指定的條件取反;
表達式組合:
與:` CONDITION1 -a CONDITION2 `
或:` CONDITION1 -o CONDITION2 `
非:[ ! CONDITION ]
命令組合:
與:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
或:COMMAND1 || COMMAND2
非:! COMMAND
短路操做符:&& 與
false && true = false
false && false = false
true && false = true
true && true = true
if COMMAND1; then
COMMAND2
fi
短路操做符:|| 或
true || true = true
true || false = true
false || true = true
false || false = false
if ! COMMAND1; then
COMMAND2
fi
COMMAND1 && COMMAND2 || COMMAND3
if COMMAND1; then
COMMAND2
else
COMMAND3
fi