我正在编写一个 bash 函数,它将输入作为文件名,并确保它以字母字符开头,但是我用来测试文件名的 grep 接受它给出的任何输入
这是我的代码...
function getname(){
fname=$1;
if [ ! $1 ]; then
read -p "Enter a file name: " fname;
fi;
until ( grep -E '^[a-zA-Z_]\w+' <<< "$fname" > /dev/null 2>1&); do
if [ -d $fname ]; then
echo "Paths are not a legal file name.";
fi;
read -p "Enter a legal file name: " fname;
done
}
它将正确接受 1 个参数或无参数,并提示输入文件名(如果没有参数),但它将接受传递给它的任何字符串。那么我该如何正确地 grep 存储为 fname 的字符串呢?
答案1
我不会用grep
。相反,我会使用内置test
运算符([[
.. )来比较文件名]]
,它可以直接处理正则表达式。
function getname(){
local fname="$1"
[[ -z "$fname" ]] && read -p "Enter a file name: " fname
until [[ "$fname" =~ ^[[:alpha:]] ]] && [[ -f "$fname" ]]
do
[[ -d $fname ]] && echo "Paths are not a legal file name."
read -p "Enter a legal file name: " fname
done
}
答案2
如果你必须使用grep
,那么我怀疑您的实现问题在于您编写的不是2>&1
(组合标准错误和标准输出)2>1&
(将标准错误发送到名为 的文件1
,并将命令放入 shell 后台)。这会阻止grep
退出状态传递给条件。
FWIW,您可以用来-q
静默退出,而且我认为您根本不需要子 shell - 您可以只写
until grep -qE '^[a-zA-Z_]\w+' <<< "$fname"; do