虽然这看起来是一个简单的任务,但 sed 调用并没有替换我发送的 IP 值。相反,它用“${IP}”替换 localhost。
substitute() {
export IP=$1
echo $IP
LC_ALL=C find . -type f -name '*.txt' -exec sed -i.bak 's/localhost/"${IP}"/g' {} \;
}
substitute 10.20.30.40
如何实现用参数发送的值替换的目的?
答案1
您的单引号阻止 ${IP} 被插入到值中。 bash -x 会有所帮助(即将 -x 添加到脚本中的 #!/bin/bash 的 shebang 中)
+ substitute 10.20.30.40
+ export IP=10.20.30.40
+ IP=10.20.30.40
+ echo 10.20.30.40
10.20.30.40
+ LC_ALL=C
+ find /tmp -type f -name '*.txt' -exec sed -i.bak 's/localhost/"${IP}"/g' '{}' ';'
如果你交换它们,
+ substitute 10.20.30.40
+ export IP=10.20.30.40
+ IP=10.20.30.40
+ echo 10.20.30.40
10.20.30.40
+ LC_ALL=C
+ find /tmp -type f -name '*.txt' -exec sed -i.bak 's/localhost/'\''10.20.30.40'\''/g' '{}' ';'
插值有效。不确定最后是否需要引号,但是......