Linux 从命令行调用sed可以正常工作,但在脚本中失败

Linux 从命令行调用sed可以正常工作,但在脚本中失败,linux,bash,sed,Linux,Bash,Sed,我一直在使用下面对sed的调用来删除行文件 sed "/% Program:/,/mode: SPIKE/d" file.tt > file.tt.nh 我尝试编写一个bash脚本,以允许我同时在多个文件上运行该脚本。但是sed失败 sed "/% Program:/,/mode: SPIKE/d" file.tt > file.tt.nh sed: -e expression #1, char 1: unknown command: `"' 这是我写的脚本,它不起作用 #!/b

我一直在使用下面对
sed
的调用来删除行文件

sed "/% Program:/,/mode: SPIKE/d" file.tt > file.tt.nh
我尝试编写一个bash脚本,以允许我同时在多个文件上运行该脚本。但是
sed
失败

sed "/% Program:/,/mode: SPIKE/d" file.tt > file.tt.nh
sed: -e expression #1, char 1: unknown command: `"'
这是我写的脚本,它不起作用

#!/bin/bash
SEDARG='"/% Program:/,/mode: SPIKE/d"';
for F in *.tt
do
  OUT=$F'.nh';
  echo 'sed '$SEDARG' '$F' > '$OUT;
  sed $SEDARG $F > $OUT
done
让我困惑的是,如果我复制echo的字符串并将其粘贴到命令行中,它就可以正常工作


有人知道为什么这个脚本失败了,但命令行调用仍然有效吗?

引用很棘手。基本上,将双引号从分配给
$SEDARG
的位置移动到使用
$SEDARG
的位置

SEDARG='/% Program:/,/mode: SPIKE/d'
for F in *.tt
do
  OUT="$F.nh"
  echo "sed $SEDARG $F > $OUT"
  sed "$SEDARG" "$F" > "$OUT"
done

引用是很棘手的。基本上,将双引号从分配给
$SEDARG
的位置移动到使用
$SEDARG
的位置

SEDARG='/% Program:/,/mode: SPIKE/d'
for F in *.tt
do
  OUT="$F.nh"
  echo "sed $SEDARG $F > $OUT"
  sed "$SEDARG" "$F" > "$OUT"
done

只是为了扩展引号的使用:它们仅用于保护用于
sed
的字符不受shell的影响
sed
不关心也从不看到外部引号。例如,
echo foo | sed s/foo/bar/
按预期工作,因为
sed
脚本中的任何内容都不需要受shell解释的影响。只需扩展引号的使用:它们仅用于保护用于
sed
的字符不受shell的影响
sed
不关心也从不看到外部引号。例如,
echo foo | sed s/foo/bar/
按预期工作,因为
sed
脚本中的任何内容都不需要受shell解释的保护。