另一个 Bash 字符串转义问题(使用 echo)

另一个 Bash 字符串转义问题(使用 echo)

我试图在 bash 脚本中使用这一行来更新我的 cron 作业:

(sudo crontab -l ; echo "0 6 1-7 * * [ $(/usr/bin/date +\%u) == 7 ] && sh $script_path > $log_path") | sort - | uniq - | sudo crontab -

在此之前,$script_path$log_path已经被定义。我知道这通常有效。我只有一挂。 $(/usr/bin/date +\%u)当写入 crontab 文件时解析为空字符串。我需要将文字保留在原处。

(这并不重要,但重点是验证星期几。此作业将在该月的第一个星期六运行)。

我如何“转义”整个子字符串?

答案1

您可以\在美元符号之前使用来获取其字面值。

(sudo crontab -l ; echo "0 6 1-7 * * [ \$(/usr/bin/date +\%u) == 7 ] && sh $script_path > $log_path") | sort - | uniq - | sudo crontab -

答案2

您可以使用\(参见 Hunter.S.Thompson 的答案)转义每个有问题的字符,或者仅使用单引号,所包含的字符串按如下方式编写:

(sudo crontab -l ; echo '0 6 1-7 * * [ $(/usr/bin/date +\%u) == 7 ] && sh '"$script_path > $log_path") | sort -u | sudo crontab -

我个人倾向于避免转义字符,因为我认为这会损害可读性。

相关内容