Bash

查找以 tab 開頭的變數值的問題

  • December 10, 2019

我正在嘗試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可能更具可讀性。

引用自:https://unix.stackexchange.com/questions/555699