簡體   English   中英

bash 中雙引號字符串中的單引號不受支持

[英]Single quotes inside a double-quoted string in bash not honored

我試圖在 bash 中分配一個變量:

assignssid="airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'"

當我目前這樣做,然后運行echo "$assignssid" ,結果類似於以下內容:

airport -I | awk '/ SSID/ {print substr(-bash, index(-bash, ))}'

如何讓變量與引號內的代碼一起使用?

問題:單引號在雙引號中不符合語法

當您有"'$0'" ,只有那些外部引號是句法(並控制外殼如何擴展值:內部引號只是字面值,不會改變$0的處理方式。


文字答案(僅限 bash):$''

如果您不想尊重擴展,請不要使用雙引號。

# assign the directory separately, just to make the line shorter for easier reading
dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/

# now, expand the directory name in double quotes, but use the $'' quoting style otherwise
assignssid="$dir"$'airport -I | awk \'/ SSID/ {print substr($0, index($0, $2))}\''

$''\\'是一個文字單引號(同樣, \\n是換行符, \\t是制表符等),並且沒有發生參數擴展( $'$0''$0'相同,而不是"$0" )。

執行此操作后,您可以看到echo變量發出帶有完整單引號內容的命令:

$ echo "$assignssid"
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'

...或者,與您可能預期的用例更密切相關:

current_ssid=$(eval "$assignssid")

字面答案(POSIX sh): '"'"'

讓我們以一種只是 bash 的方式做第一個答案:

dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/
assignssid="$dir"'airport -I | awk '"'"'/ SSID/ {print substr($0, index($0, $2))}'"'"''

這個字符串的作用如下:

  • 第一個'關閉單引號上下文
  • 第一個"打開雙引號上下文
  • 以下'是文字,因此成為您價值的一部分
  • 以下"關閉雙引號上下文
  • 最后的'恢復原始的單引號上下文

最佳實踐答案:使用函數來存儲代碼

字符串變量根本不是這項工作的合適工具。 相反,使用一個函數:

airport_dir=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/
assignssid() {
    "$airport_dir"/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'
}

...然后:

current_ssid=$(assignssid)

你可以“分而治之”。
讓我們把(非常)長的目錄放在一個變量中:

$ dir="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources"

讓我們將 awk 命令放在第二個變量中:

$ awkcmd='/ SSID/ {print substr($0, index($0, $2))}'

由於文本在單引號內, $0$2不會被 shell 擴展。

並且,讓我們加入所有你想要的變量:

$ assignssid="$dir/airport -I | awk '$awkcmd'"

在這種情況下,單引號起作用(出現在assignssid變量中),因為它們在雙引號內使用。

而且,我假設您要執行的是:

$ eval "$assignssid"

以上將在任何(合理的)shell 中工作。

感謝大家的貢獻。 我想我找到了一種不同的方法來做到這一點 var=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM