如何避免 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 语法错误,在命令行上工作正常
执行shell脚本错误‘.sh file: /bin/bash^M: bad interpreter’