Bash
查找以 tab 開頭的變數值的問題
我正在嘗試
make
使用 bash 腳本編寫一個簡單的 Linux 命令。這是我到目前為止所寫的:#!/usr/bin/env bash function make_cmd() { read target colon sources for src in $sources; do if [ $src -nt $target ]; then while read cmd && [[ $(echo "$cmd" | grep "$(printf '\t')"*) ]]; do echo "executing $cmd"; eval ${cmd#$(printf '\t')}; done break; fi done }
這是輸入的格式:
target.file : source.file [tab]command
例如:
target.txt : source.txt ls cd
該腳本執行良好,但找不到以 tab 開頭的命令。它總是執行它們。例如,這個輸入中的命令仍然被執行。
target.txt : source.txt ls cd
我怎樣才能解決這個問題?
內置
read
命令使用 的值拆分單詞IFS
,預設情況下包含空格、製表符和換行符。因此,當read
用於獲取輸入時,選項卡被刪除。開始函式:
IFS_SAVE="$IFS" IFS=' '
現在只有空格可以分隔單詞。在函式結束時將 IFS 恢復為其原始值:
IFS="$IFS_SAVE"
請注意,如果用反斜杠轉義,您可以使用文字製表符。此外,我不會使用
grep
匹配選項卡,盡可能使用內置函式,因為這樣會更快。我的函式版本是:function make_cmd() { SAVE_IFS="$IFS" IFS=' ' read target colon sources for src in $sources; do if [ $src -nt $target ]; then while read cmd; do case "$cmd" in $'\t'*) echo "executing $cmd" eval ${cmd# } ;; *) ;; esac done break; fi done IFS="$SAVE_IFS" }
$'\t'
替代文字標籤(感謝 Kusalananda 的提示)。
#
在變數替換後插入一個文字製表符。雖然使用printf
可能更具可讀性。