Linux Bash字符串操作

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")

拓展資料

  1. Shell字符串截取(非常詳細) http://c.biancheng.net/view/1120.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章