Bash 指令碼:`(反引號)運算子和 $()的使用方式
阿新 • • 發佈:2021-09-07
反引號操作符可以在 中使用,因為它很容易與其他 結合使用。但是,還有一種更“推薦”的方式來做同樣的事情,使用$()運算子。本文將介紹在 shell 中使用他們的優缺點。 |
下面是一個簡單的例項:
[root@localhost~]#echo"Thereare`ls|wc-l`filesinthisdirectory" Thereare10filesinthisdirectory
ls |wc -l
用於列出和計算當前目錄的檔案數,然後將它嵌入到 echo 中。
在 shell 指令碼中,當然可以執行相同的操作,將ls | wc -l
命令的結果分配給一個變數,稍後使用該變數。
[root@localhost~]#file_count=`ls|wc-l` [root@localhost~]#echo"Thereare$file_countfilesinthisdirectory" Thereare10filesinthisdirectory$()的使用方式
也可以通過使用$()
代替`
反引號來獲得相同的結果,如下例所示:
[root@localhost~]#echo"Thereare$(ls|wc-l)filesinthisdirectory" Thereare10filesinthisdirectory
下面是一個例子,我需要對網路連線中的某些問題進行故障排除,因此我決定每分鐘顯示總連線數和等待連線數。
[root@localhost~]#vimnetinfo.sh #!/bin/bash whiletrue do ss-an>netinfo.txt connections_total=$(catnetinfo.txt|wc-l) connections_waiting=$(grepWAITnetinfo.txt|wc-l) printf"$(date+%R)-Total=%6dWaiting=%6d\n"$connections_total$connections_waiting sleep60 done
執行一下指令碼:
[root@localhost~]#./netinfo.sh 17:13-Total=158Waiting=4 17:14-Total=162Waiting=0 17:15-Total=155Waiting=0 17:16-Total=155Waiting=0 17:17-Total=155Waiting=0
這裡更推薦使用$()方式。下面是原因:
1. 如果內部命令也使用`
,`
運算子可能會變得混亂。
- 將需要轉義內部的
`
,如果將單引號作為命令的一部分或結果的一部分,閱讀和排除指令碼故障可能會變得困難。 - 如果開始考慮在其他
`
運算子中巢狀`
運算子,則事情將不會按預期工作或根本不起作用。
2.$()
操作符更安全,更可預測。
在$()
運算子中的內容被視為 shell 指令碼。從語法上講,這和把程式碼儲存在文字檔案中是一樣的。
以下是`
和$()
行為差異的一些示例:
[root@localhost~]#echo'\$x' \$x [root@localhost~]#echo`echo'\$x'` $x [root@localhost~]#echo$(echo'\$x') \$x總結
在較為複雜的命令語句中,推薦使用$()方式。