如何避免 bash 脚本上的 sed 错误?

Posted

技术标签:

【中文标题】如何避免 bash 脚本上的 sed 错误?【英文标题】:How can I avoid sed error on bash script? 【发布时间】:2020-11-03 23:54:51 【问题描述】:

我需要在最后一行之后添加文本,但出现此错误。

如何在保持相同操作的情况下避免此错误?

sed -i -e '$a\  containers:' -e '$a\  - name: container' -e '$a\    image: httpd' -e '$a\    ports:' -e '$a\    - containerPort: 80' /path/to/file"
                            ^-- SC2154: a is referenced but not assigned.

【问题讨论】:

echo stuff >>file 的表达方式看起来非常复杂。可能还会使用此处的文档查看cat,以及一次附加多行的printf '%s\n' 'stuff' 'more stuff'。此外,如果您需要附加到特权文件(即 sudo 等,您不能简单地附加重定向),另请参阅 tee -a 您可能在脚本前面的某处出现引用错误(未闭合的引号字符串),这会导致混淆。 可能是你错过了一些双引号。 ...命令末尾有一个。如果在此之前有一个,它可能会解释错误 【参考方案1】:

你有一个尾随双引号:

#                                                  Here --v
sed -i [...] -e '$a\    - containerPort: 80' /path/to/file"

这与 ShellCheck 的警告一起表明整个 sed 命令实际上是双引号字符串的一部分。您应该阅读更多有关找到此命令的上下文。

例如,它实际上可能是这样一个更大结构的一部分:

ssh myhost "
  [...]
  sed -i [...] -e '$a\    - containerPort: 80' /path/to/file"

这将是一个导致命令失败的真正错误,因此不应忽略它。在这种情况下,您将转义 $s。

【讨论】:

完整的命令就是这个。没有遗漏的报价。 ssh -q desktop "sed -i -e '$a\ containers:' -e '$a\ - name: range-container' -e '$a\ image: httpd' -e '$a\ ports:' -e '$a\ - containerPort: 80' /path/to/file.yaml" 那么怀疑是正确的,ShellCheck 是正确的。此命令不起作用,因为 $a 被视为 shell 变量而不是文字 sed 命令。您应该转义$s,这也可以避免警告 喜欢吗? sed -i -e '\$a\ 容器:' 对,就是这样。要调试此问题和类似问题,您可以执行 set -x; sed .. 以让远程 shell 打印出它正在执行的内容。如果不转义,它可能会显示 sed .. -e '\ ' 而不是 sed .. -e '$a\ ',这会告诉您该字符串未正确转义 @kcadorin,在您的问题中包含完整的上下文非常重要,而不仅仅是将其隐藏在某处的评论中。您正在构建一个通过 ssh 传递的远程命令是一个关键 细节;没有它,问题就无法正确重现,也不会在不了解上下文正确的情况下提出修复..

以上是关于如何避免 bash 脚本上的 sed 错误?的主要内容,如果未能解决你的问题,请参考以下文章

函数内部 sed 命令中的 bash 语法错误,在命令行上工作正常

发送多个csv附件,简单的Bash错误?

执行shell脚本错误‘.sh file: /bin/bash^M: bad interpreter’

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

bash 中 sed 未终止的 s 命令出错

Bash 脚本:避免空字符串参数