命令替換
在bash中,$( )
與` `
(反引號)都是用來作命令替換的。
命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。
exp 1
$ echo today is $(date "+%y-%m-%d")
today is 2014-07-01
$( )與``
在操作上,這兩者都是達到相應的效果,但是建議使用$( )
,理由如下:
exp 2
# 將cmd1執行結果作為cmd2引數,再將cmd2結果作為cmd3的引數
cmd3 $(cmd2 $(cmd1))
# 如果是用反引號,直接引用是不行的,還需要作跳脫處理
cmd3 `cmd2 \`cmd1\``
$變數替換
一般情況下,$var
與$
是沒有區別的,但是用$會比較精確的界定變數名稱的範圍
$ a=b
$ echo $b
bb
取路徑、檔名、字尾
先賦值乙個變數為乙個路徑,如下:
file=/dir1/dir2/dir3/my.file.txt
命令
解釋結果
$拿掉第一條 / 及其左邊的字串
dir1/dir2/dir3/my.file.txt
$拿掉最後一條 / 及其左邊的字串
my.file.txt
$拿掉第乙個 . 及其左邊的字串
file.txt
$拿掉最後乙個 . 及其左邊的字串
txt$
拿掉最後一條 / 及其右邊的字串
/dir1/dir2/dir3
$拿掉第一條 / 及其右邊的字串
(空值)
$拿掉最後乙個 . 及其右邊的字串
/dir1/dir2/dir3/my.file
$拿掉第乙個 . 及其右邊的字串
/dir1/dir2/dir3/my
記憶方法如下:
取子串及替換命令
解釋結果
$提取最左邊的 5 個位元組
/dir1
$提取第 5 個位元組右邊的連續 5 個位元組
/dir2
$將第乙個 dir 提換為 path
/path1/dir2/dir3/my.file.txt
$將全部 dir 提換為 path
/path1/path2/path3/my.file.txt
$獲取變數長度27
根據狀態為變數賦值
命令解釋備註$
若 $file 沒設定,則使用 my.file.txt 作傳回值
空值及非空值不作處理
$若 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值
非空值時不作處理
$若$file 設為空值或非空值,均使用my.file.txt作傳回值
沒設定時不作處理
$若 $file 為非空值,則使用 my.file.txt 作傳回值
沒設定及空值不作處理
$若 $file 沒設定,則回傳 txt ,並將 $file 賦值為 txt
空值及非空值不作處理
$若 $file 沒設定或空值,則回傳 txt ,將 $file 賦值為txt
非空值時不作處理
$若 $file 沒設定,則將 my.file.txt 輸出至 stderr
空值及非空值不作處理
$若 $file沒設定或空值,則將my.file.txt輸出至stderr
非空值時不作處理
tips:陣列以上的理解在於, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態. 一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.
a="a b c def" # 定義字串
a=(a b c def) # 定義字元陣列
命令
解釋結果
$返回陣列全部元素
a b c def$同上
a b c def
$返回陣列第乙個元素a$
返回陣列元素總個數4$
同上4$返回第四個元素的長度,即def的長度
3a[3]=xyz
則是將第四個組數重新定義為 xyz
$(( ))與整數運算
bash中整數運算符號
符號功能+ - * /
分別為加、減、乘、除
%餘數運算
& | ^ !
分別為「and、or、xor、not」
在 $(( )) 中的變數名稱,可於其前面加 $ 符號來替換,也可以不用。
$
a=5;b=7;c=2
$ echo $((a+b*c))
19$ echo $(($a+$b*$c))
19
進製轉換
$(( ))可以將其他進製轉成十進位制數顯示出來。用法如下:
echo $((n#xx))
其中,n為進製,xx為該進製下某個數值,命令執行後可以得到該進製數轉成十進位制後的值。
$ echo $((2#110)) # 二進位制轉十進位制
6$ echo $((16#2a)) # 十六進製制轉十進位制
42$ echo $((8#11)) # 八進位制轉十進位制
9
(( ))重定義變數值
$
a=5;b=7
$ ((a++));echo $a
6$ ((a--));echo $a
5
$ ((a
使用(( ))作整數測試時,不要跟[ ]的整數測試搞混亂了。
原文:
shell 中 與 的區別
在shell中 為建立 echo hello shell out.txt 為追加 echo hello shell out.txt 當out.txt 文字不存在時,與 都會預設建立out.txt文字,並將hello shell 字串儲存到out.txt中 當out.txt文字存在時,會將out.tx...
shell中 與 的區別
是符合posix標準的測試語句,相容性更強,幾乎可以執行在所有的shell直譯器中 僅可執行在特定的幾個shell直譯器中 如bash等 進行比較前先設定lang c,在排序時使用ascii碼順序 數字的ascii碼應該小於大寫字母,使用 的結果是正確的 不支援 a 中表示變數name是否以字母d開...
shell中 與 及 的區別
與 反引號 在bash shell中,與 反引號 都是用來做命令替換 command substitution 用的。echo the last sunday is date d last sunday y m d 得到上一星期天的日期 用 的理由 1.很容易與 單引號 搞混。有時在一些奇怪的字形顯...