bash中双引号字符串中的单引号不被接受

Mic*_*ski 1 variables bash shell terminal

我试图在bash中分配一个变量:

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

当前执行此操作,然后运行时echo "$assignssid",结果如下所示:

airport -I | awk '/ SSID/ {print substr(-bash, index(-bash, ))}'
Run Code Online (Sandbox Code Playgroud)

如何使变量与引号内的代码一起使用?

Cha*_*ffy 5

问题:双引号内的单引号不是语法

当您拥有时"'$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))}\''
Run Code Online (Sandbox Code Playgroud)

在里面$''\'是一个文字单引号(同样,\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))}'
Run Code Online (Sandbox Code Playgroud)

...或更可能与您预期的用例密切相关:

current_ssid=$(eval "$assignssid")
Run Code Online (Sandbox Code Playgroud)

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

让我们做的方式,第一个答案不就是庆典只:

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

该字符串的作用如下:

  • 第一个'关闭单引号上下文
  • 第一个"打开双引号上下文
  • 以下'是字面意思,因此成为您价值的一部分
  • 下面"关闭双引号上下文
  • 最后的'恢复原始的单引号上下文

最佳实践答案:使用函数存储代码

字符串变量根本不是适合此工作的工具。而是使用一个函数:

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

...之后:

current_ssid=$(assignssid)
Run Code Online (Sandbox Code Playgroud)