我正在尝试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 恢复为其原始值:
请注意,如果用反斜杠转义,您可以使用文字制表符。此外,我不会使用
grep
匹配选项卡,尽可能使用内置函数,因为这样会更快。我的函数版本是:$'\t'
替代文字标签(感谢 Kusalananda 的提示)。#
在变量替换后插入一个文字制表符。虽然使用printf
可能更具可读性。