簡體   English   中英

命令替換中的 bash 邏輯

[英]bash logic inside command substitution

我有一個在登錄時顯示的小橫幅

fignow() { figlet -w $(tput cols) $(date +"%b %d, Week %V"); figlet -w $(tput cols) -f univers $(date +"%H:%M"); }

如果安裝了額外的字體來獲取univers ,這可以正常工作,但這不是默認安裝的一部分,因此我可以執行以下操作:

fignow() { figlet -w $(tput cols) $(date +"%b %d, Week %V"); if [ -f /usr/share/figlet/univers.flf ]; then figlet -w $(tput cols) -f univers $(date +"%H:%M"); else figlet -w $(tput cols) $(date +"%H:%M"); fi; }

這也可以正常工作,但我很好奇 if if/else/fi是否可以刪除並且邏輯可以在命令本身內部完成,即:

fignow() { figlet -w $(tput cols) $(date +"%b %d, Week %V"); figlet -w $(tput cols) -f $(use-univers-or-failback-to-standard.flf-if-univers.flf-is-not-available) $(date +"%H:%M"); }

這樣的事情可能嗎?

我建議:

fignow() {
  local opts
  figlet -w $(tput cols) $(date +"%b %d, Week %V")
  [ -f /usr/share/figlet/univers.flf ] && opts="-f univers"
  figlet -w $(tput cols) $opts $(date +"%H:%M")
}

僅當文件存在時,變量 $opts 才包含必要的選項。

檢查文件或解析 figlist 或 showfigfonts 的輸出本質上是脆弱的。 只需致電 figlet 以查看該選項是否可用。 就像是:

fignow() {
        local font=${1-universe}
        figlet -f "$font" a > /dev/null 2>&1 || font=
        figlet -w $(tput cols) $(date +"%b %d, Week %V")
        figlet -w $(tput cols) ${font:+-f "$font"} $(date +"%H:%M")
}

請注意,這是您不能在變量周圍使用雙引號的情況之一,因為您希望${font:+-f "$font"}$font為空時擴展為空字符串。 如果您使用"${font:+-f "$font"}" ,語義會發生變化,並且會向 figlet 傳遞一個空字符串。

我建議使用figlist來避免對主題路徑進行硬編碼:

figlet -w "$(tput cols)" -f "$((figlist | /bin/grep -hw universe) || echo "standard")" "foo"

暫無
暫無

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

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