因此,我知道已经以多种方式讨论了该主题,但是响应对我不起作用。
我正在使用sed从脚本中删除一行,但是每次执行bash脚本时,都会收到错误消息“无此文件或目录”。我可以从远程主机终端运行命令。请参见下面的sed命令。
#!/bin/bash
declare server_list="/location/of/iplist.txt"
declare file="/location/of/file/to/modify"
declare regex='"/\export JAVA_HOME=\/jvm\/home\/directory\/java/d"'
declare file_content="$(sudo grep -Fxq export
JAVA_HOME=/java/home/directory/java "${file}" )
declare script="sudo sed -i -e ${regex} ${file}"
date
cat ${server_list} | while read server
do
# connect to each server and execute the "sed -i" command
ssh -I /location/of/pub/key ${server} -o StrictHostKeyChecking=no
# read file content into condition statement
${file_content}
if [ $? -eq 0 ];
then
# confirm string exist and remove the line
echo "JAVA_HOME located on ${server}"
"${script}"
else
echo "No JAVA_HOME located on ${server}"
fi
done
答案 0 :(得分:0)
不要将完整的命令放在变量中。 "${script}"
是麻烦的邀请。
一个示例:
me ~ > echo -e 'foo bar\nbaz qux' > /tmp/foobar
me ~ > cat /tmp/foobar
foo bar
baz qux
me ~ > sed -e '/foo bar/d' /tmp/foobar
baz qux
me ~ > cmd="sed -e '/foo bar/d' /tmp/foobar"
me ~ > $cmd
sed: -e expression #1, char 1: unknown command: `''
me ~ > ${cmd}
sed: -e expression #1, char 1: unknown command: `''
me ~ > "$cmd"
bash: sed -e '/foo bar/d' /tmp/foobar: No such file or directory
me ~ > "${cmd}"
bash: sed -e '/foo bar/d' /tmp/foobar: No such file or directory
这是怎么回事?如果您使用$cmd
不加引号,则sed
具有以下4个参数:
-e
'/foo
bar/d'
/tmp/foobar
(是的,这就是bash中“单词”的工作方式)。显然sed
无法解释这种胡言乱语。
如果尝试运行"$cmd"
或"${cmd}"
,则整个字符串将解释为命令 name ,空格引号和全部。 shell抱怨找不到名为sed -e '/foo bar/d' /tmp/foobar
的可执行文件,这是绝对正确的。也不行。
解决方案?
一种快速而肮脏的黑客手段
me ~ > eval ${cmd}
baz qux
按预期工作!但是,除非您是经过认证的Shell专家,否则不要使用eval is dangerous和。 (我相信您仍然没有)。更好的选择是定义一个函数。
cmd() {
sed -e '/foo bar/d' /tmp/foobar
}
...
cmd
答案 1 :(得分:0)
尝试使用eval执行变量内容
declare file="/location/of/file/to/modify"
declare regex='"/\export JAVA_HOME=\/jvm\/home\/directory\/java/d"'
declare script="sudo sed -i -e ${regex} ${file}"
eval ${script}