我想构建一个小的util脚本来替换给定文件中的字符。这是我到目前为止所拥有的。当我运行它时,我会看到我的回音消息,但程序永远不会返回。如果我手动退出程序,则无效。所以它似乎悬挂在某个地方,但我无法确定原因。
sEnv=$1
eEnv=$2
reverseArgs=$3
echo ${reverseArgs}
if [ "$3" == "-r" ]; then
echo "changing from ${eEnv} to ${sEnv}"
cmd="vim -E -s /Users/X/nginx.conf << EOF\
:%s/${eEnv}/${sEnv}/g\
:wq\
EOF"
`${cmd}`
else
echo "changing from ${sEnv} to ${eEnv}"
cmd="vim -E -s /Users/X/nginx.conf << EOF\
:%s/${sEnv}/${eEnv}/g\
:wq\
EOF"
`${cmd}`
fi
EOF
我知道它应该有用,因为如果我把它放在我的脚本中就可以了:
vim -E -s /Users/X/nginx.conf << EOF
:%s/${eEnv}/${sEnv}/g
:wq
EOF
答案 0 :(得分:3)
正如@trojanfoe首先建议的那样,你应该使用sed
来完成这样的工作。它更适合:
sed -i "s/${eEnv}/${sEnv}/g" ${file}
但是可以使用vim
进行此操作。您尝试不起作用的原因是您正在构建命令以字符串形式执行,并且这样做会将您的heredoc压缩为普通字符串。当你可以直接执行命令时,我不明白为什么这很有用:
vim -E -s /Users/philippeguay/nginx.conf << EOF
:%s/${sEnv}/${eEnv}/g
:wq
EOF
答案 1 :(得分:2)
不确定为什么要通过变量cmd。尝试:
sEnv=$1
eEnv=$2
reverseArgs=$3
echo ${reverseArgs}
if [ "$3" == "-r" ]; then
echo "changing from ${eEnv} to ${sEnv}"
vim -E -s - /Users/X/nginx.conf <<EOF
:%s/${eEnv}/${sEnv}/g
:wq
EOF
else
echo "changing from ${sEnv} to ${eEnv}"
vim -E -s - /Users/philippeguay/nginx.conf <<EOF
:%s/${sEnv}/${eEnv}/g
:wq
EOF
fi
我为我的vim添加了-s -
,我认为它将文件名作为脚本。
请注意,EOF不得缩进。