sed-没有这样的文件或目录

时间:2018-11-20 14:42:00

标签: linux bash centos

因此,我知道已经以多种方式讨论了该主题,但是响应对我不起作用。

我正在使用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

2 个答案:

答案 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}