Linux 腳本 命令狀態 條件測試

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

相關文章
相關標籤/搜索