查找以 tab 开头的变量值时出现问题

查找以 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

我怎样才能解决这个问题?

答案1

内置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可能更具可读性。

相关内容