Regex Bash-正则表达式中逃离美元的正确方法

Regex Bash-正则表达式中逃离美元的正确方法,regex,bash,substitution,expansion,Regex,Bash,Substitution,Expansion,在bash正则表达式中,避开美元符号的正确方法是什么?我试图测试字符串是否以美元符号开头。这是我的代码,其中我在双引号表达式中对美元进行双转义: echo -e "AB1\nAB2\n\$EXTERNAL_REF\nAB3" | while read value; do if [[ ! $value =~ "^\\$" ]]; then echo $value else echo "Variable found: $valu

在bash正则表达式中,避开美元符号的正确方法是什么?我试图测试字符串是否以美元符号开头。这是我的代码,其中我在双引号表达式中对美元进行双转义:

echo -e "AB1\nAB2\n\$EXTERNAL_REF\nAB3" | while read value;
do
    if [[ ! $value =~ "^\\$" ]];
    then
            echo $value
    else
            echo "Variable found: $value"
    fi
done
这就是我想要的一个盒子,它有:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
详细的输出显示

+ [[ ! $EXTERNAL_REF =~ ^\$ ]]
+ echo 'Variable found: $EXTERNAL_REF'
但是,在另一个使用

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
比较扩展如下

+ [[ ! $EXTERNAL_REF =~ \^\\\$ ]]
+ echo '$EXTERNAL_REF'
是否有一种标准/更好的方法可以在所有实现中使用


非常感谢

我将用单引号替换双引号,删除一个单引号,并进行如下更改

$value =~ "^\\$"
也可以用作

$value =~ '^\$'

为什么在这里使用正则表达式?一个地球仪就足够了:

#!/bin/bash

while read value; do
   if [[ "$value" != \$* ]]; then
       echo "$value"
   else
       echo "Variable found: $value"
   fi
done < <(printf "%s\n" "AB1" "AB2" '$EXTERNAL_REF' "AB3")
#/bin/bash
读值时;做
如果[[“$value”!=\$*];然后
回显“$value”
其他的
echo“找到变量:$value”
fi

完成<我也没有找到解决方案,但出于我的目的,我决定采用以下解决方法:

if [[ "$value" =~ ^(.)[[:alpha:]_][[:alnum:]_]+\\b && ${BASH_REMATCH[1]} == '$' ]]; then
    echo "Variable found: $value"
else
    echo "$value"
fi
我没有尝试“引用”美元符号,而是匹配它周围的所有内容,并捕获美元符号应该出现的字符,以便对其进行直接字符串比较。有点混乱,但它是有效的

或者,我已经开始使用变量,但只针对反斜杠字符(我不喜欢将整个正则表达式存储在一个变量中,因为我发现正则表达式不出现在使用它的上下文中会令人困惑):


正则表达式根本不需要任何引号。这应该起作用:

if [[ ! $value =~ ^\$ ]];

很好,这是一个很好的解决方法,在两种实现中都能做到这一点。谢谢上面提到的,这在4.1.2中似乎对我不起作用。如果有人知道我为什么想知道
if [[ ! $value =~ ^\$ ]];