问题:双引号中的单引号不是句法
当您有"'$0'" 时,只有那些外引号是语法(并控制shell 如何扩展该值:内引号只是文字值,不要改变$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")。
执行此操作后,您可以看到 echoing 变量发出的命令带有完整的单引号内容:
$ 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-only 的方式回答第一个问题:
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)