shell中 與 的區別

2021-08-01 11:20:09 字數 3239 閱讀 8156

命令替換

在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.很容易與 單引號 搞混。有時在一些奇怪的字形顯...