Bash正则表达式内部不匹配,如果

Bash正则表达式内部不匹配,如果,bash,shell,Bash,Shell,我有一个文件/tmp/gish.dat,它要么包含一个大于0的数字,要么包含一个或多个数字,要么不包含任何内容 如果存在一个数字,我希望我的函数将a与数字eg 64一起回显。如果没有数字,我希望我的函数什么也不做 get_issue() { if [ -f "/tmp/gish.dat" ] then iss=$(cat /tmp/gish.dat | grep -Eo '[0-9]+') if [[ iss

我有一个文件/tmp/gish.dat,它要么包含一个大于0的数字,要么包含一个或多个数字,要么不包含任何内容

如果存在一个数字,我希望我的函数将a与数字eg 64一起回显。如果没有数字,我希望我的函数什么也不做

   get_issue() {
        if [ -f "/tmp/gish.dat" ]
        then
            iss=$(cat /tmp/gish.dat | grep -Eo '[0-9]+')
            if [[ iss =~ '[0-9]+' ]]
            then
              echo "#$iss"
            fi
        fi
    }

由于某种原因,内部if从不匹配。bash非常新。

您可以通过以下方式重写代码:

   get_issue() {
        if [ -f "/tmp/gish.dat" ]
        then
            iss=$(grep -Eo '[0-9]+' /tmp/gish.dat)
            if [[ $iss ]]
            then
              echo "#$iss"
            fi
        fi
    }

由于grep-Eo只提取匹配的数字部分,因此不需要在if中再次将提取的字符串与正则表达式匹配。只要$iss不为空,[[$iss]]就为真。

如果您在[[…]内使用正则表达式,则它只是一个字符串


将“[0-9]+”替换为[0-9]+。

如果需要打印64、45等内容,请按如下所示更改代码

 if [ -f "/tmp/gish.dat" ]
    then
        iss=$(cat /tmp/gish.dat | grep -Eo '[0-9]+' | tr '\n' ' ')
        for isss in $iss    
        do  
                if [[ $isss =~ '[0-9]+' ]]
                then
                  echo "#$isss"
                fi  
        done;
fi


查看这一个

认为变量上缺少一个美元符号。在if条件下将其更改为$iss-。假设外部if工作正常,请尝试打印shell调用iss的结果,并检查其是否工作正常。编辑:正如benjamin已经提到的,您肯定缺少美元符号。也许我还建议您查看-s选项以测试文件是否为空:Protip:自动检测类似问题谢谢,这很好。