1. 程式人生 > >shell腳本的一些常用操作

shell腳本的一些常用操作

替換 placement 兩個 base 一件事 ins book posit length

字符串長度:

${#string}可獲取string字符串的長度,如下:

[email protected]:~$ str="who are you"
[email protected]:~$ echo ${#str}
11

${string:position:length}表示在字符串string中截取從position開始長度為length的字符串,shell腳本字符串的起始位置與python一致也是從0開始算的

[email protected]:~$ str="who are you"
[email protected]:~$ echo {str:2:5}

{str:2:5}
[email protected]:~$ echo ${str:2:5}
o are

字符串截取(不匹配字符)
符號 含義解析
${string#substring} 從變量${string}的開頭, 刪除最短匹配${substring}的子串
${string##substring} 從變量${string}的開頭, 刪除最長匹配${substring}的子串
${string%substring} 從變量${string}的結尾, 刪除最短匹配${substring}的子串
${string%%substring} 從變量${string}的結尾, 刪除最長匹配${substring}的子串

我們可以總結一下規律:

換句話來說,#總是表示左邊算起,%總是表示右邊算起;一個符號表示最短匹配,兩個符號表示最長匹配。

[email protected]:~$ str="who are you"
[email protected]:~$ echo ${str#"who"}
are you
[email protected]:~$ echo ${#str%"you"}
-bash: ${#str%"you"}: bad substitution
[email protected]:~$ echo ${str%"you"}
who are

我們可以利用該特點做一些有意義的事情,下面舉幾個例子:

# 定義字符串
f=$(realpath 空間數據處理環境搭建.pdf)
# 輸出該字符串變量的值,結果為/Users/tanzhenyu/Resources/Books/Python空間數據處理實戰/空間數據處理環境搭建.pdf
echo $f
# 第一件事情:提取文件名稱,輸出結果為:空間數據處理環境搭建.pdf
echo ${f##*/}
# 第二件事情:提取文件擴展名,輸出結果為:pdf
echo ${f##*.}
# 第三件事情:提取父目錄,輸出結果為:/Users/tanzhenyu/Resources/Books/Python空間數據處理實戰
echo ${f%/*}
1
2
3
4
5
6
7
8
9
10
當然,Shell編程中我們也可以使用basename和dirname兩個命令分別提取文件名和父目錄名稱:

# basename提取當前文件或者當前目錄名稱,輸出結果為:空間數據處理環境搭建.pdf
echo $(basename $f)
# dirname提取父目錄名稱,輸出結果為:/Users/tanzhenyu/Resources/Books/Python空間數據處理實戰
echo $(dirname $f)
1
2
3
4
子串替換
符號 含義解析
${string/substring/replacement} 使用${replacement}, 來代替第一個匹配的$substring
${string//substring/replacement} 使用${replacement}, 代替所有匹配的$substring
${string/#substring/replacement} 如果${string}的前綴匹配${substring}, 那麽就用${replacement}來代替匹配到的${substring}
${string/%substring/replacement} 如果${string}的後綴匹配${substring}, 那麽就用${replacement}來代替匹配到的${substring}
註:${substring}可以是一個正則表達式.

例子:

# 把Windows的路徑換成類UNIX的路徑
f=‘C:\Windows\system32\cmd.exe‘
echo ${$f//\///}
# 輸出結果為:C:/Windows/system32/cmd.exe

shell腳本的一些常用操作