gpt4 book ai didi

linux - 在 bash -c 中设置变量

转载 作者:IT王子 更新时间:2023-10-29 00:20:46 25 4
gpt4 key购买 nike

我尝试设置从 ifconfig 获取接口(interface) ip 地址的变量,稍后再读取它。但是当我执行 echo 命令时,变量仍然是空的。请看我的代码:

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo $HOST_IPS"

但是/bin/echo 使用相同的命令工作正常:

/usr/bin/bash -c "echo $(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}')"

最佳答案

您必须在最后的 echo 命令中转义 $ 符号,否则变量 $HOST_IPS 将在生成子 shell 之前替换为命令字符串:

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo \$HOST_IPS"

为了更直接的可见性:

#                                                  v-- insert backslash here
/usr/bin/bash -c "HOST_IPS=$(same as before); echo \$HOST_IPS"

与@gniourf_gniourf 的评论相反,实际上没有必要转义其他美元符号。但是,如所写,命令替换不是由子 shell (!) 执行的;其结果被替换为传递给子 shell 的命令字符串。电话

mypid() { echo $$; }
bash -c "pid=$(mypid); echo \$pid; mypid"

演示它的工作方式:它会一次打印父 shell 的 PID,一次提示 mypid 不是已知命令,因为子 shell 不知道该函数。

自从运行 ifconfig |父 shell 中的 awk 命令不太可能成为问题,您可以保留命令替换部分不变。如果命令由子 shell 运行很重要,那么您还必须转义那里的所有内容。

关于linux - 在 bash -c 中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com