[英]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.