簡體   English   中英

在 Bash 中轉義雙引號和單引號

[英]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 更好? 解釋為什么我使用printf而不是echo顯到 output 的 crontab 條目。
  • 請注意, date '+\%a'會像\Sun一樣產生 output(對於某些版本的date程序)。 你可能想要date '+%a'
    更新: Gordon Davisson 的評論解釋說date '+\%a'中的反斜杠是必要的,因為該命令在crontab中。)
  • 另請注意,由%a日期格式生成的字符串取決於語言環境。 星期天可能不是Sun 使用數字日期更安全(例如[ "$(date '+%w')" -eq 0 ] )。
  • 最后,請注意將==[...]一起使用在 shell 之間不可移植。 使用=除非您確定crontab 條目將僅使用 Bash 運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM