1. 在 SHELL 中同時判斷多個條件
在 SHELL if 語句中使用 "||" 和 "&&" 要用兩個獨立的 [ ]
if [ a -gt b ] && [ a -lt c ]
2. 判斷字符串爲空的方法
if [ "$str" = "" ]
if [ x"$str" = x ]
3. 截取字符串
${varible:start:len}
截取變量 varible 從位置 start 開始長度爲 len 的子字符串。第一個字符的位置爲0。
可以省略第三項,默認爲一直到最右側一個字符爲止。如下示例 ${file:0:23}
中 start=0 表示從最左側開始,len=23 表示截取長度爲 23 個字符的子串,也即是到 index=22 的字符爲止。
示例 ${file:23}
中 start=23 表示從 index=23 的字符開始,一直截取到最右一個字符結束。注意 index=23 和 len=23 的區別。
示例 ${file: -17}
中 start=-17 表示 index=-17 的字符開始,一直截取到最右一個字符結束。負號表示從右側開始數起,最右一個字符爲 -1,右側倒數第二個爲 -2,以此類推。注意冒號與負號之間有一個空格,一定不能省略,沒有空格運行時會報錯。
# hello_test.sh
abs_filepath="/home/phillee/test_tmp/hello_world_202104021730.mp4"
directory_path=${file:0:23}
base_filepath=${file:23}
postfix=${file: -17}
echo ${abs_filepath}
echo ${directory_path}
echo ${base_filepath}
echo ${postfix}
# console of the output
/home/phillee/test_tmp/hello_world_202104021730.mp4
/home/phillee/test_tmp/
hello_world_202104021730.mp4
_202104021730.mp4
4. 計算字符串長度
${#str}
5. 替換字符串
在 BashScript 中,pattern 是 glob 風格的
${var/pattern/substr} :首次。查找 var 所表示的字符串中,第一次被 pattern 所匹配到的字符串,以 substr 替換之。
${var//pattern/substr} :全部。查找 var 所表示的字符串中,所有能被 pattern 所匹配到的字符串,以 substr 替換之。
${var/#pattern/substr} :行首。查找 var 所表示的字符串中,行首被pattern所匹配到的字符串,以 substr 替換之。
${var/%pattern/substr} :行尾。查找 var 所表示的字符串中,行尾被pattern所匹配到的字符串,以 substr 替換之。
6. 格式化輸出數字或字符串
比如我在 for 循環中處理完某些指令後,想要按照可以指示 for 循環的指數命名相應的文件,循環十次 0-9
,保存結果中後綴分別爲 _00, _01, ..., _09
這種,當然可以簡單粗暴使用 if 判斷,但問題是有沒有更簡單的做法呢?
我覺得下面的這些處理方式相對而言更加普遍適用。
普通十進制數字直接使用 printf 重新賦值即可,%02d 表示格式化成 2 位有效數字,不足兩位前面補零,d 表示處理整數。
a=$(printf "%02d" $a)
如果是浮點型數據,帶小數點的小數這種,%2.1f 表示格式化爲 2 位有效數字,小數點後保留一位,f 表示處理浮點型數據。
a=$(printf "%2.1f" $a)
字符串比較特殊一些,因爲如果直接使用 printf 輸出,%08s 表示格式化爲 8 位長度的字符串,右對齊,不足八位的前面是空格,而不是數字 0,所以如果要以這種形式來處理的話,需要再加一步,將空格替換成0。s 表示按字符串處理。
a=$(printf "%08s" $a | tr " " "0")