Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别
看到幾篇博客,覺得寫的不錯
原文:https://blog.csdn.net/x1269778817/article/details/46535729 和http://blog.zol.com.cn/2322/article_2321763.html
$()和 ` `??:
在 bash shell 中,$( ) 與` ` (反引號) 都是用來做命令替換用(commandsubstitution)的。
例如???version=$(uname -r)和version=`uname -r`都可以是version得到內核的版本號
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
得到上一星期天的日期
用$( )的理由
1. ` `很容易與' '(單引號)搞混。有時在一些奇怪的字形顯示中,兩種符號是一模一樣的(直豎兩點)。
2. 在多層次的復合替換中,` `須要額外的跳脫(\`)處理,而$( )則比較直觀。例如:
command1 `command2 `command3` `
原本的意圖是在command2 `command3`中先將command3替換出來給command2處理,然后再將結果傳給command1 `command2 ...`來處理。
然而,真正的結果在命令行中卻是分成了`command2`與` `兩段。
正確的輸入應該如下:
command1 `command2 \`command3\` `
換成$( )則一目了然:
command1 $(command2 $(command3))
各自的優缺點:
1. `??` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高。但反單引號容易打錯或看錯。
2. $()并不是所有shell都支持。
?
?
${ } :
${ }用于變量替換。一般情況下,$var 與${var} 并沒有啥不一樣。但是用 ${ } 會比較精確的界定變量名稱的范圍。比如
$ A=B
$ echo $AB
原本是打算先將 $A 的結果替換出來,然后再補一個 B 字母于其后,
但在命令行上,真正的結果卻是只會提換變量名稱為 AB 的值出來…
若使用 ${ } 就沒問題了:
$ echo ${A}B
BB
${ }的功能遠不止于此,詳見下表。
?
$[] $(()) :
它們是一樣的,都是進行數學運算的。支持+ - * / %:分別為 “加、減、乘、除、取?!薄5亲⒁?#xff0c;bash只能作整數運算,對于浮點數是當作字符串處理的。
例:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1
在 $(( )) 中的變量名稱,可于其前面加 $ 符號來替換,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的結果
此外,$(( )) 還可作不同進位(如二進制、八進位、十六進制)作運算呢,只是,輸出結果皆為十進制而已:
echo $((16#2a)) 結果為 42 (16進位轉十進制)
[ ] :
即為test命令的另一種形式。
但要注意許多:
1.你必須在左括號的右側和右括號的左側各加一個空格,否則會報錯。
2.test命令使用標準的數學比較符號來表示字符串的比較,而用文本符號來表示數值的比較。很多人會記反了。使用反了,shell可能得不到正確的結果。
3.大于符號或小于符號必須要轉義,否則會被理解成重定向。
?
(( ))及[[ ]] :
它們分別是[ ]的針對數學比較表達式和字符串表達式的加強版。
其中(( )),不需要再將表達式里面的大小于符號轉義,除了可以使用標準的數學運算符外,還增加了以下符號:
在 [[ ]]中增加了另一個特性:模式匹配
?
${ }的一些特異功能
定義一個變量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分別替換獲得不同的值:
${file#*/} 拿掉第一個 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一個 / 及其左邊的字符串:my.file.txt
${file#*.} 拿掉第一個 . 及其左邊的字符串:file.txt
${file##*.} 拿掉最后一個 . 及其左邊的字符串:txt
${file%/*} 拿掉最后一個 / 及其右邊的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一個 / 及其右邊的字符串:(空值)
${file%.*} 拿掉最后一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my
記憶的方法:
# 去掉左邊(鍵盤上 # 在 $ 的左邊)
% 去掉右邊(在鍵盤上 % 在 $ 的右邊)
單一符號是最小匹配,兩個符號是最大匹配。
${file:0:5} 提取最左邊的 5 個字節:/dir1
${file:5:5} 提取第 5 個字節右邊的連續 5 個字節:/dir2
也可以對變量值里的字符串作替換:
${file/dir/path} 將第一個 dir 替換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 將全部 dir 替換為 path:/path1/path2/path3/my.file.txt
利用${ }還可針對不同的變量狀態賦值(未設定、空值、非空值):?
${file-my.file.txt} 若 $file 未設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)?
${file:-my.file.txt} 若 $file 未設定或為空值,則使用 my.file.txt 作傳回值。(非空值時不作處理)
${file+my.file.txt} 若 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(未設定時不作處理)
${file:+my.file.txt} 若 $file 為非空值,則使用 my.file.txt 作傳回值。(未設定及空值時不作處理)
${file=my.file.txt} 若 $file 未設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt。 (空值及非空值時不作處理)
${file:=my.file.txt} 若 $file 未設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt。 (非空值時不作處理)
${file?my.file.txt} :若 $file 未設定,則將 my.file.txt 輸出至 STDERR。(空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 未設定或為空值,則將 my.file.txt 輸出至 STDERR。(非空值時不作處理)
以上的理解在于,一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態。
一般而言,與 null 有關,若不帶 : 的話,null 不受影響,若帶 : 則連 null 也受影響。
${#var} 可計算出變量值的長度:
${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 剛好是 27 個字節。
bash數組(array)處理方法
一般而言,A="a b c def"只是將 $A 替換為一個單一的字符串,但是改為 A=(a b c def),則是將 $A 定義為數組。
bash的數組替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 得到 a b c def(全部數組)
${A[0]} 得到 a (第一個元素),${A[1]} 第二個...
${#A[@]} 或 ${#A[*]} 得到 4 (數組數量)
${#A[0]} 得到 1 (第一個元素 a 的長度),${#A[3]} 得到 3 (第四個元素 def 的長度)
A[3]=xyz 將第四個元素重新定義為 xyz
$(( ))的用途
用來作整數運算。在 bash 中,$(( ))的整數運算符號大致有這些:
+ - * / 加、減、乘、除
% 余數運算
& | ^ ! AND、OR、XOR、NOT運算
舉例:
$ a=5; b=7; c=2
$ echo $((a+b*c))
19
$ echo $(((a+b)/c))
6
$ echo $(((a*b)%c))
1
在$(( ))中的變量名稱也可以在其前面加 $ 符號:$(($a+$b*$c))也可以得到 19 的結果。
此外,$(( ))還可以作不同進制(如二進制、八進位、十六進制)運算,只是輸出結果皆為十進制而已。
echo $((16#2a)) 結果為 42 (16進位轉十進制)
舉一個實用的例子:
當前的 umask 是 022,新建文件的權限為:
$ umask 022
$ echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
事實上,單純用(( ))也可以重定義變量值,或作testing:
a=5; ((a++)) 將 $a 重定義為 6
a=5; ((a–)) a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值
常見的用于(( ))的測試符號有以下這些:
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于
總結
以上是生活随笔為你收集整理的Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux shell脚本中shift的
- 下一篇: Linux Kettle 闪退问题解决方