我正在尝试在bash中分配一个变量:
assignssid="airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'"
当我目前这样做,然后运行echo "$assignssid"
时,结果如下:
airport -I | awk '/ SSID/ {print substr(-bash, index(-bash, ))}'
如何让变量与引号内的代码一起使用?
答案 0 :(得分:4)
当你有"'$0'"
时,只有那些外部引号是语法的(并控制shell如何扩展值:内部引号只是文字值,并且不会改变$0
的处理方式。
如果您不希望兑换扩展,请不要使用双引号。
# 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")
'"'"'
让我们以不 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)
答案 1 :(得分:2)
你可以分享和征服" 让我们将(非常)长目录放在一个变量中:
$ dir="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources"
让我们把awk命令放在第二个变量中:
$ awkcmd='/ SSID/ {print substr($0, index($0, $2))}'
由于文字在单引号内,因此$0
和$2
不会被外壳展开。
然后,让我们加入你想要的变量:
$ assignssid="$dir/airport -I | awk '$awkcmd'"
在这种情况下单引号起作用(出现在assignssid
变量中),因为它们在双引号内使用。
而且,我假设您要执行的是:
$ eval "$assignssid"
以上内容适用于任何(合理的)shell。
答案 2 :(得分:0)
感谢所有人的贡献。我想我发现了一种不同的方式 var = $(/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / Current / Resources / airport -I | awk' / SSID / {print substr($ 0,index($ 0,$ 2))}&#39 ;)