如何 grep 变量名

如何 grep 变量名

我正在编写一个 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

相关内容