我正在尝试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
可能更具可读性。