【发布时间】:2018-12-22 08:21:22
【问题描述】:
到目前为止,我只知道我所读到的内容,而且我对如何按原样实际回显变量感到困惑。
-
如果
var='-n',echo "$var"可能会失败 -
printf '%s\n' "$var"可能会因为 shell 未实现而失败printf -
echo -- "$var"可能会失败,因为它是 gnu 扩展
所以如果我不得不猜测:
echo x"$var"|sed 's#^x##1' 将是唯一的方法,但我从未遇到过这种模式。为什么?
作为一个具体的问题:
for source; do
target="$(echo "$source"|sed 's#[^a-z0-9]\+#.#')"
# do stuff with $source and $target
done
如果我的脚本是由某个 my_script * cron 执行的,这是否可行,或者有人可以通过将名为“-n”的文件放在某处来“破解”/“破坏”我的脚本?
我如何写echo "$var" 使其不会中断?
【问题讨论】:
-
你能举一个shell的例子,它不能用
printf '%s\n' "$var"做正确的事情吗?如果 shell 没有实现printf(例如在 OpenBSD 上使用sh/ksh),将会使用一个外部实用程序。 -
如果 shell 没有实现
printf,它就不是 POSIX shell。使用printf。 -
printf实际上比echo更便携(就其行为的标准强制保证而言)。请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html 的应用程序使用和基本原理部分;引用前者的话:除非-n(作为第一个参数)和转义序列都被省略,否则不可能在所有 POSIX 系统中使用可移植的 echo。 -
另一个注意事项:这是即使
shellcheck -ssh也无法理解的基本内容之一。这可能是因为如果 shellcheck 会警告任何使用没有固定值的 echo 是不合理的。