Bash - 在正则表达式中逃避美元的正确方法

use*_*484 5 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: $value"
    fi
done
Run Code Online (Sandbox Code Playgroud)

这是我想要的一个盒子,它有:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

并且详细的输出显示

+ [[ ! $EXTERNAL_REF =~ ^\$ ]]
+ echo 'Variable found: $EXTERNAL_REF'
Run Code Online (Sandbox Code Playgroud)

但是,在另一个使用

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

比较展开如下

+ [[ ! $EXTERNAL_REF =~ \^\\\$ ]]
+ echo '$EXTERNAL_REF'
Run Code Online (Sandbox Code Playgroud)

有没有一种标准/更好的方法来做到这一点,适用于所有实现?

非常感谢

gni*_*urf 3

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

#!/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")
Run Code Online (Sandbox Code Playgroud)

在这里与 一起工作shopt -s compat32