條件測試命令????????
? ? ? ? 條件測試:判斷某需求是否滿足,需要有測試機制來實現 專用的測試表達式需要由測試命令輔助完成測試過程,評估布爾生命,以便用在條件性執行中
????????若真,則狀態碼變量$? 返回0? ? ?//??echo $? 打印0
? ? ? ? 反之返回1
? ? ? ? test EXPRESSIOIN
? ? ? ? [ EXPRESSION ]
? ? ? ? [[ EXPRESSION ]]
? ? ? ? 注:EXPRESSION前后必須有空白字符
help test 查看test命令具體用法
變量測試
-v VAR? ? ?變量VAR 是否設置
示例: 判斷NAME變量是否定義
[ -v NAME ] // 注意括號? [] 和test 是等價
test -v NAME?
echo $? 0 定義? 1未定義
數值測試
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
?示例: 如果使用變量必須要加$
qgy@qgy-VMware-Virtual-Platform:~$?test 10 -gt 8?
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ test 10 -eq 8?
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
1
qgy@qgy-VMware-Virtual-Platform:~$ test 10 -ne 10?
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
1
qgy@qgy-VMware-Virtual-Platform:~$ test 10 -eq 10?
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0qgy@qgy-VMware-Virtual-Platform:~$ [ 8 -eq 9 ]
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
?
? ? ? ?
字符串測試
-z "STRING" 字符串是否為空,空為真,不空為假
-n "STRING" 字符串是否不空,不空為真
=? 是否等于
> ASCII 碼是否大于ASCII碼
< 是否小于
!= 是否不等于
== 左側字符串是否和右側的pattern 相同
? ? ? ?注意:此表達式用于[[ ]]中,pattern 為通配符
=~ 左側字符串是否能夠被右側的pattern所匹配
? ? ? ?注意:此表達式用于[[ ]] 中,pattern 為拓展的表達式
qgy@qgy-VMware-Virtual-Platform:~$ unset NAME?
qgy@qgy-VMware-Virtual-Platform:~$ NAME="qgy"
qgy@qgy-VMware-Virtual-Platform:~$ test -n $NAME
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ test -z $NAME
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
1
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME = "YGQ"
qgy@qgy-VMware-Virtual-Platform:~$ echo $??
1
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME = "qgy"
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME > "dd"
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < "dd"
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ echo $NAME
qgy
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < "DD"
bash: DD: No such file or directory
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < "dd"
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < "DD"
bash: DD: No such file or directory
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < "DH"
bash: DH: No such file or directory
qgy@qgy-VMware-Virtual-Platform:~$ NICKNAME="DH"
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < $NICKNAME
bash: DH: No such file or directory
qgy@qgy-VMware-Virtual-Platform:~$ ^C
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME \< $NICKNAME
qgy@qgy-VMware-Virtual-Platform:~$ LS
LS: command not found
qgy@qgy-VMware-Virtual-Platform:~$ ls
dd ?Desktop ?Documents ?Downloads ?Music ?myFile ?Pictures ?Public ?snap ?Templates ?Videos ?windowsFile
qgy@qgy-VMware-Virtual-Platform:~$ cd dd
bash: cd: dd: Not a directory
qgy@qgy-VMware-Virtual-Platform:~$ cat dd
qgy@qgy-VMware-Virtual-Platform:~$ file dd
dd: empty
qgy@qgy-VMware-Virtual-Platform:~$ ls -l dd
-rw-rw-r-- 1 qgy qgy 0 Dec 24 16:33 dd
qgy@qgy-VMware-Virtual-Platform:~$ rm dd
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME -lt $"dd"
bash: test: qgy: integer expression expected
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME -lt "dd"
bash: test: qgy: integer expression expected
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME < ?"dd"
bash: dd: No such file or directory
qgy@qgy-VMware-Virtual-Platform:~$ test $NAME \< ?"dd"? // 需要使用轉義否則被視為重定向qgy@qgy-VMware-Virtual-Platform:~$ [[ $NAME == [a-z]* ]]
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
0
qgy@qgy-VMware-Virtual-Platform:~$ [[ $NAME == [A-Z]* ]]
qgy@qgy-VMware-Virtual-Platform:~$ echo $?
1
qgy@qgy-VMware-Virtual-Platform:~$
關于== 和=~
root@qgy-VMware-Virtual-Platform:~# [[ $FILE == *.log ]]? ?// 使用通配符
root@qgy-VMware-Virtual-Platform:~# echo $?
0
root@qgy-VMware-Virtual-Platform:~# [[ $FILE =~ log$ ]]? ?// 使用正則表達式
root@qgy-VMware-Virtual-Platform:~# echo $?
0
文件測試(使用[] 或者test)
?存在性測試
-a? ? ? ? FILE: 同 -e
-e? ? ? ? FILE: 文件存在測試,存在為真
-b? ? ? ? FILE: 是否存在且為塊設備文件
-c? ? ? ? FILE: 是否存在且為字符設備文件
-d? ? ? ? FILE: 是否存在且為目錄文件
-f? ? ? ? ?FILE: 是否存在且為普通文件
-h? ? ? ? FILE: 或 -L FILE: 存在且為符號鏈接文件
-p? ? ? ? FILE: 是否存在且為命令管道文件
-s? ? ? ? FILE: 是否存在且為套接字文件
文件權限測試
-r? ? ? ? FILE: 是否存在且可讀
-w? ? ? ?FILE: 是否存在且可寫
-x? ? ? ? FILE: 是否存在且可執行
-u? ? ? ? FILE: 是否存在且擁有suid權限
-g? ? ? ? FILE: 是否存在且擁有sgid權限
-k? ? ? ? FILE: 是否存在且擁有sticky權限
文件屬性測試
-s? ? ? ? FILE: 是否存在且非空
-t? ? ? ? fd:? fd文件描述符是否在某終端已打開
-N? ? ? ? FILE: 文件自從上一次被讀取之后是否被修改
-O? ? ? ? FILE: 當前有效用戶是否為文件屬主
-G? ? ? ? FILE: 當前有效用戶是否為文件屬組
FILE? ? ? ? -ef? ? ? ? FILE2: FILE 是否是FILE2的硬鏈接
FILE? ? ? ? -nt? ? ? ? FILE2: FILE 是否新于FILE2
FILE? ? ? ? -et? ? ? ? FILE2: FILE 是否舊于FILE2?
組合測試條件
? ? ? ?第一種方法
[ expression1 -a expression2 ] 并且
[ e1 -o e2 ] 或者
[ ! e1 ] 取反
說明: -a 和 -o 需要使用test 測試命令進行 [[? ]] 不支持?
示例:
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# File=first.txt
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# [ -f $File -a -x $File ]
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# echo $?
1
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# ll
total 8
drwxr-xr-x ?2 root root 4096 Dec 24 20:25 ./
drwxr-xr-x 14 root root 4096 Dec 24 20:23 ../
-rw-r--r-- ?2 root root ? ?0 Dec 24 20:23 first.txt
-rw-r--r-- ?2 root root ? ?0 Dec 24 20:23 HFirst.txt
lrwxrwxrwx ?1 root root ? ?9 Dec 24 20:24 sFirst.txt -> first.txt
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# [ -f $File -a ! -x $File ]
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# echo $?
0
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test#?
?
? ? ? ?第二種方法?
command1 && command2? 與操作? command1和command2都為真 為真
command1 ||?command2? 與操作? command1和command2都為假?為假
! command1 取反
示例:
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# [ -f $File ] && [ ! -x $File ]
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# echo $?
0
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# [ -f $File ] || ?[ ! -x $File ]
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# echo $?
0
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test#??id wang &> /dev/null || useradd wang // 如果不存在用戶wang則建立用戶wang
lucky boy
? ? ? ? [ $[RANDOM%6 ] -eq 0 ] && rm -rf? /* ?|| echo "lucky boy"?
grep -q no_such_user /etc/passwd? ? ? ||? ?echo? ?"no such user"? // -q 不管找不找的到不在界面上顯示結果?
示例:
#!/bin/bash
IP=127,0,0,1
ping -c10 -w1 $IP &> /dev/null? && echo "$IP is up"? || { echo "$IP is unreachable";echo $BASHPID;sleep 1000; exit 1} #{} 表示命令在本bash進程中執行 如果換成括號表示在新創建的bash 子進程中執行? ?exit 表示退出命令執行的bash進程? ; 表示順序執行
echo "Scirpt is finished"
關于子shell 中繼承父shell ,然后修改的問題
執行()中的shell 命令會創建子shell ,然后命令在子shell 中執行
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# NAME=mage;(echo $NAME;NAME=wang;echo $NAME);echo $NAME
mage
wang
mage
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test#
{} 中的shell 命令仍然在本shell 中運行
root@qgy-VMware-Virtual-Platform:/home/qgy/myFile/Test# NAME=mage;{ echo $NAME;NAME=wang;echo $NAME; };echo $NAME
mage
wang
wang
?
搜索shell 中()和{ }的用法?
man bash?
/\(list\) 查看bash 中() 的用法
umask 的使用?
umask
命令的使用:
umask
是 Linux/Unix 系統中用于設置文件和目錄默認權限的命令。1. 基礎概念:
umask
設置的是權限掩碼,決定新創建文件或目錄的默認權限。
- 文件默認權限:666(可讀寫,無執行權限)
- 目錄默認權限:777(可讀、可寫、可執行)
注意:
- 新建文件默認沒有執行權限,執行權限需要手動賦予。
文件權限 = 666 - umask值
目錄權限 = 777 - umask值
?