[英]Escape double and single quotes in Bash
我有一個 Cron Job 在每個月的每個第一個星期日每季度運行一次:
0 0 1-7 3,6,9,12 * [ "$(date '+\%a')" == "Sun" ] && /script.sh
現在我想像這樣使用 echo 自動安裝它:
(crontab -l ; echo "0 0 1-7 3,6,9,12 * [ "$(date '+\%a')" == "Sun" ] && /script.sh") | crontab -
雖然 escaping \"Sun"\
工作正常,但我無法轉義"$(date '+\%a')"
因為這是單引號和雙引號的混合,在雙引號 echo 命令中帶有\
。
您不需要使用瘋狂的 escaping。使用bash
提供的[[... ]]
而不是舊的(並且容易出錯) [... ]
:
所以使用:
0 0 1-7 3,6,9,12 * [[ $(date +\%a) == Sun ]] && /script.sh
並自動安裝它:
(crontab -l ; echo '0 0 1-7 3,6,9,12 * [[ $(date +\%a) == Sun ]] && /script.sh') | crontab -
PS:確保在 crontab 文件中這一行之前設置SHELL=/bin/bash
。
您可以使用此處文檔來避免引用 crontab 條目:
read -r crontab_entry <<'END_CRONTAB_ENTRY'
0 0 1-7 3,6,9,12 * [ "$(date '+\%a')" == "Sun" ] && /script.sh
END_CRONTAB_ENTRY
(crontab -l; printf '%s\n' "$crontab_entry") | crontab -
printf
而不是echo
顯到 output 的 crontab 條目。date '+\%a'
會像\Sun
一樣產生 output(對於某些版本的date
程序)。 你可能想要date '+%a'
。date '+\%a'
中的反斜杠是必要的,因為該命令在crontab
中。)%a
日期格式生成的字符串取決於語言環境。 星期天可能不是Sun
。 使用數字日期更安全(例如[ "$(date '+%w')" -eq 0 ]
)。==
與[...]
一起使用在 shell 之間不可移植。 使用=
除非您確定crontab 條目將僅使用 Bash 運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.