Bash 指令碼:`(反引號)運算子和 $()的使用方式

roc_guo發表於2021-08-03
導讀 反引號運算子可以在    中使用,因為它很容易與其他 結合使用。但是,還有一種更“推薦”的方式來做同樣的事情,使用$()運算子。本文將介紹在 shell  中使用他們的優缺點。
反引號的使用方式

下面是一個簡單的例項:

[root@localhost ~]# echo "There are `ls | wc -l` files in this directory"
There are 10 files in this directory

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式
ls |wc -l 用於列出和計算當前目錄的檔案數,然後將它嵌入到 echo  中。

在 shell 指令碼中,當然可以執行相同的操作,將 ls | wc -l命令的結果分配給一個變數,稍後使用該變數。

[root@localhost ~]# file_count=`ls | wc -l`
[root@localhost ~]# echo "There are $file_count files in this directory"
There are 10 files in this directory

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式

$()的使用方式

也可以透過使用 $()代替 `反引號來獲得相同的結果,如下例所示:

[root@localhost ~]# echo "There are $(ls | wc -l) files in this directory"
There are 10 files in this directory

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式
下面是一個例子,我需要對網路連線中的某些問題進行故障排除,因此我決定每分鐘顯示總連線數和等待連線數。

[root@localhost ~]# vim netinfo.sh
#!/bin/bash
while true
do
  ss -an > netinfo.txt
  connections_total=$(cat netinfo.txt | wc -l)
  connections_waiting=$(grep WAIT netinfo.txt | wc -l)
  printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
  sleep 60
done

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式
執行一下指令碼:

[root@localhost ~]# ./netinfo.sh 
17:13 - Total=   158 Waiting=     4
17:14 - Total=   162 Waiting=     0
17:15 - Total=   155 Waiting=     0
17:16 - Total=   155 Waiting=     0
17:17 - Total=   155 Waiting=     0

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式

如何選擇使用哪種方式

這裡更推薦使用$()方式。下面是原因:
1. 如果內部命令也使用 ``運算子可能會變得混亂。

  • 將需要轉義內部的 `,如果將單引號作為命令的一部分或結果的一部分,閱讀和排除指令碼故障可能會變得困難。
  • 如果開始考慮在其他 `運算子中巢狀 `運算子,則事情將不會按預期工作或根本不起作用。

2.  $()運算子更安全,更可預測。

在  $() 運算子中的內容被視為 shell 指令碼。從語法上講,這和把程式碼儲存在文字檔案中是一樣的。

以下是 `和  $()行為差異的一些示例:

[root@localhost ~]# echo '\$x'
\$x
[root@localhost ~]# echo `echo '\$x'`
$x
[root@localhost ~]# echo $(echo '\$x')
\$x

Bash 指令碼:`(反引號)運算子和 $()的使用方式Bash 指令碼:`(反引號)運算子和 $()的使用方式

總結

在較為複雜的命令語句中,推薦使用$()方式。

本文原創地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2785073/,如需轉載,請註明出處,否則將追究法律責任。

相關文章