>[success] # test
~~~
1.'test'可用于測試表達式,支持測試的范圍包括:字符串比較,算術比較,文件存在性、屬性、類型等判斷。
例如,判斷文件是否為空、文件是否存在、是否是目錄、變量是否大于5、字符串是否等于"longshuai"、字符串是
否為空等等。在shell中,幾乎所有的判斷都使用test實現
2.'[]'完全等價于test,只是寫法不同
3.'[[]]'基本等價于'[]',它支持更多的條件表達式,還允許在雙中括號內使用邏輯運算符"&&"、"||"、"!"和"()"
舉個例子
$ [ a < b ]
-bash: b: No such file or directory
$ [[ a < b ]]
第一個示例返回錯誤,因為 bash 嘗試將文件 b 重定向到命令 [ a ]。第二個例子實際上做
了你所期望的。字符 < 不再具有文件重定向運算符的特殊含義。
~~~
>[info] ## test/[] 用法
~~~
1.test expression 等同于[ expression ],注意[]和expression之間的空格,這兩個空格是必須的,否則會導致語法錯誤
~~~
>[danger] ##### 文件條件判斷
* 文件類型
| 選 項 | 作 用 |
| --- | --- |
| \-b filename | 判斷文件是否存在,并且是否為塊設備文件。 |
| \-c filename | 判斷文件是否存在,并且是否為字符設備文件。 |
| \-d filename | 判斷文件是否存在,并且是否為目錄文件。 |
| \-e filename | 判斷文件是否存在。 |
| \-f filename | 判斷文件是否存在,井且是否為普通文件。 |
| \-L filename | 判斷文件是否存在,并且是否為符號鏈接文件。 |
| \-p?filename | 判斷文件是否存在,并且是否為管道文件。 |
| \-s filename | 判斷文件是否存在,并且是否為非空。 |
| \-S filename | 判斷該文件是否存在,并且是否為套接字文件。 |
* 文件權限判斷
| 選 項 | 作?用 |
| --- | --- |
| \-r filename | 判斷文件是否存在,并且是否擁有讀權限。 |
| \-w filename | 判斷文件是否存在,并且是否擁有寫權限。 |
| \-x filename | 判斷文件是否存在,并且是否擁有執行權限。 |
| \-u filename | 判斷文件是否存在,并且是否擁有 SUID 權限。 |
| \-g filename | 判斷文件是否存在,并且是否擁有 SGID 權限。 |
| \-k filename | 判斷該文件是否存在,并且是否擁有 SBIT 權限。 |
* 文件比較
| 選 項 | 作?用 |
| --- | --- |
| filename1 -nt filename2 | 判斷 filename1 的修改時間是否比 filename2 的新。 |
| filename -ot filename2 | 判斷 filename1 的修改時間是否比 filename2 的舊。 |
| filename1 -ef filename2 | 判斷 filename1 是否和 filename2 的 inode 號一致,可以理解為兩個文件是否為同一個文件。這個判斷用于判斷硬鏈接是很好的方法 |
* 舉個例子
~~~
1.[-e 1.txt] # // 判斷文件1.txt 是否存在 等同于test -e 1.txt
2.[ -e 1.txt ]&&echo "yes"|| echo "no" # 像寫其他語言一樣使用條件與
3.[ -r read.txt ]&&echo "read yes"|| echo "no" # 查看文件是否有讀的權限
4.[ read.txt -ot write.txt ]&&echo "read is older than write"|| echo "no" # 比較兩個文件修改時間
5.判斷文件是否存在并且判斷當前輸入url 是否為空不是創建文件并且寫入
#!/bin/bash
read filename
read url
if test -w $filename && test -n $url
then
echo $url > $filename
echo "寫入成功"
else
echo "寫入失敗"
fi
~~~
>[danger] ##### 與數值比較相關的 test 選?項
~~~
1.兩個整數之間的判定,支持正負數,但不支持小數
~~~
| 選項 | 含義 |
| --- | --- |
| 整數1 -eq 整數2 | 判斷整數1是否和整數2相等 |
| 整數1 -ne 整數2 | 判斷整數1是否和整數2不相等 |
| 整數1 -gt 整數2 | 判斷整數1是否大于整數2 |
| 整數1 -lt 整數2 | 判斷整數1是否小于整數2 |
| 整數1 -ge 整數2 | 判斷整數1是否大于等于整數2 |
| 整數1 -le 整數2 | 判斷整數1是否小于等于整數2 |
* 舉個例子
~~~
[ 2 -eq 2 ]&&echo "2==2"|| echo "no"
[ 3 -ne 2 ]&&echo "2!=2"|| echo "no"
[ 3 -gt 2 ]&&echo "2>2"|| echo "no"
[ 1 -lt 2 ]&&echo "2<2"|| echo "no"
[ 2 -ge 2 ]&&echo "2>=2"|| echo "no"
[ 2 -le 2 ]&&echo "2<=2"|| echo "no"
~~~
>[danger] ##### 字符串比較
~~~
1.==、>、< 在大部分編程語言中都用來比較數字,而在 Shell 中,它們只能用來比較字符串,不能比較數字,
管是比較數字還是字符串,Shell 都不支持 >= 和 <= 運算符
~~~
| 選 項 | 作?用 |
| --- | --- |
| \-z str | 判斷字符串 str 是否為空。 |
| \-n str | 判斷宇符串 str 是否為非空。 |
| str1 = str2
str1 == str2 | `=`和`==`是等價的,都用來判斷 str1 是否和 str2 相等。 |
| str1 != str2 | 判斷 str1 是否和 str2 不相等。 |
| str1 \\> str2 | 判斷 str1 是否大于 str2。`\>`是`>`的轉義字符,這樣寫是為了防止`>`被誤認為成重定向運算符。 |
| str1 \\< str2 | 判斷 str1 是否小于 str2。同樣,`\<`也是轉義字符。 |
* 舉個例子
~~~
#!/bin/bash
read str1
read str2
#檢測字符串是否為空變量 $str1 和 $str2 都被雙引號包圍起來,這樣做是為了防止 $str1 或者 $str2 是空字符串時出現錯誤
if [ -z "$str1" ] || [ -z "$str2" ]
then
echo "字符串不能為空"
exit 0
fi
#比較字符串
if [ $str1 = $str2 ]
then
echo "兩個字符串相等"
else
echo "兩個字符串不相等"
fi
~~~
>[danger] ##### 邏輯運算
| 選項 | 含義 |
| --- | --- |
| 判斷1 -a 判斷2 | 邏輯與 |
| 判斷1 -o 判斷2 | 邏輯或 |
| !判斷 | 邏輯非 |
* 例子
~~~
[ 2 -gt 1 -a 3 -gt 2 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -a 3 -gt 4 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -o 3 -gt 4 ]&&echo "yes"|| echo "no"
[ ! 3 -gt 4 ]&&echo "yes"|| echo "no"
#檢測字符串是否為空
if [ -z "$str1" -o -z "$str2" ] #使用 -o 選項取代之前的 || ,面的代碼我們使用兩個[]命令,并使用||運算符將它們連接起來,這里我們改成-o選項,只使用一個[]命令就可以了
then
echo "字符串不能為空"
exit 0
fi
~~~
>[info] ## [[]]
~~~
1.[[ ]] 是 Shell 內置關鍵字,不是命令
1.1.不需要把變量名用雙引號""包圍起來,即使變量是空值,也不會出錯。
1.2.不需要、也不能對 >、< 進行轉義,轉義后會出錯
2.[[ ]] 支持邏輯運算符,說明
[ -z "$str1" ] || [ -z "$str2" ] 或者 [ -z "$str1" -o -z "$str2" ]如果使用'[[]]'=>[[ -z $str1 || -z $str2 ]]
注意,[[ ]] 剔除了 test 命令的-o和-a選項,你只能使用 || 和 &&
3.舉個例子
#!/bin/bash
read str1
read str2
if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要對變量名加雙引號
then
echo "字符串不能為空"
elif [[ $str1 < $str2 ]] #不需要也不能對 < 進行轉義
then
echo "str1 < str2"
else
echo "str1 >= str2"
fi
~~~
* 對第二條說明
| test 或?\[\] |使用| \[\[ \]\] |使用|
| --- | --- |--- |--- |
| \[ -z "$str1" \] \|\| \[ -z "$str2" \] | **√** | \[\[ -z $str1 \]\] \|\| \[\[ -z $str2 \]\] | **√** |
| \[ -z "$str1" -o -z "$str2" \] | **√** | \[\[ -z $str1 -o -z $str2 \]\] | **×** |
| \[\[ -z $str1 \|\| -z $str2 \]\] | **×** | \[\[ -z $str1 \|\| -z $str2 \]\] | **√** |
>[info] ## 總結
~~~
1.[[ ]] 完全可以替代test , [[ ]] 對數字的比較仍然不友好,用 (()) 來處理整型數字更好
~~~
- 安裝-VMware 虛擬機
- 遠程連接
- Windows -- wsl
- Linux -- 認識 Linux 和操作系統
- Linux -- Linux 和 windows 對比
- Linux -- 命令提示符
- Linux -- 文件目錄
- Linux -- 文件類型
- Linux -- 絕對和相對路徑
- Linux -- 常用快捷鍵
- Linux -- 三種幫助命令
- 幫助命令 -- man
- 幫助命令 -- help
- 幫助命令 -- info
- Linux -- 指令
- alias -- 設置別名
- history -- 查看歷史命令
- cd -- 更改目錄(切換文件夾)
- pwd -- 打印目錄
- ls -- 列出文件內容
- mkdir -- 創建文件夾
- rmdir -- 刪除一個空的目錄
- touch -- 創建普通文件/修改時間
- cp -- 復制粘貼
- mv -- 移動和重名
- rm -- 刪除
- cat/tac -- 查看純文本文件
- more/less -- 分頁讀取信息
- head -- 從文本開頭查看
- tail -- 從文本結尾查看
- cut -- 提取片段
- sort -- 排序
- uniq -- 去重
- wc -- 統計文件的行數、單詞、字節數
- tr -- 替換、縮減或刪除字符
- find -- 文件查找
- grep -- 文件當中匹配字符
- 管道 -- |
- locate -- 第三方文件查找
- whereis -- 查找二進制/源代碼文件 路徑
- which -- 查找環境變量
- 壓縮和解壓
- ln -- 鏈接
- wget -- 下載指定的url資源
- 重定向 -- << /< />/> >
- 邏輯控制 -- &&
- echo -- 輸出指定內容
- date/cal -- 查看日期和日歷
- Linux -- 進程管理
- Linux-- ps 指令
- vi/vim - 文本編輯器
- 更多
- Linux-- 開關機命令
- Liunx -- 退出登錄
- Linux-- 查看登錄用戶信息
- Linux -- 環境變量
- Linux -- 用戶
- Linux -- 文件管理
- 文件權限設置 -- chmod
- 更改文件的擁有者 -- chown
- 默認權限 -- umask
- Linux -- 用戶
- 新建/刪除用戶 -- useradd/userdel
- 修改用戶屬性 -- usermod/chage
- 新建/刪除用戶組 -- groupadd/groupdel
- 用戶切換 -- su/sudo
- 用戶/用戶組的配置文件
- 用戶家目錄被刪除解決
- last、 lastlog命令查看用戶詳細的登錄信息
- Linux -- shell
- Linux -- 管道符號
- shell -- 執行
- shell -- 變量
- shell -- 字符串
- shell -- 數組
- Shell -- declare 設置變量屬性
- shell -- 數學計算
- shell -- 變量作用域
- shell -- 位置參數變量
- shell -- read
- shell - if 語句
- shell -- test
- shell -- case
- Linux -- 循環
- Linux -- 軟件包管理