在 bash 中回显分号

在 bash 中回显分号

我正在尝试将以下字符串写入文件:1;2;3;4。分号会产生问题。

我已经能够找出以下方法来做到这一点:

variable='1;2;3;4'
echo "${variable//;/\;}" >output.file

但是,如果由于某种原因由 crontab 执行,它不会生成输出文件,只有手动执行时它才有效。

我的代码有什么替代方案吗?

答案1

这里有两个问题。首先,如果你想替换;\;,你需要转义\。请记住,这\是一个特殊字符,它用于转义(这大概就是为什么您要在 之前添加它;)。为了从字面上使用它,在替换中,你也需要转义它:

$ variable='1;2;3;4'
$ echo "${variable//;/\;}"  ## fails
1;2;3;4
$ echo "${variable//;/\\;}" ## works
1\;2\;3\;4

下一个问题是,正如 Cuonglm 指出的, cron 运行所有内容/bin/sh。根据您的系统,可能是在 sh 兼容模式下运行的 bash,或者另一个最小的 shell(dash在基于 Debian 的系统上),甚至是古老的 bourne shell 本身。因此,该${var//foo/bar}构造很可能不起作用。例如,在dash

$ variable='1;2;3;4'
$ echo "${variable//;/\\;}"
dash: 2: Bad substitution

但是,如果您只想将变量中保存的字符串打印到文件中,那么这应该始终有效:

variable='1;2;3;4'
printf '%s\n' "$variable" > file

相关内容