下面的代码测试字符串中的字符是否与正则表达式匹配。
str=")Y"
c="${str:0:1}"
if [[ $c =~ [A-Za-z0-9_] ]]; then
echo "YES"
output=$c
else
echo "NO"
output="-"
fi
echo $output
我正在运行它
source script-name.sh
但是,而不是预期的打印输出
NO
-
我得到一个没有破折号的空行
NO
我知道这个问题在某种程度上围绕着我(重新)分配输出变量的方式,这是我的问题
- 如何正确操作?
- 为什么源效用有这样的含义?
UPD_1:这是针对Mac的zsh,而不是bash。 UPD_2:仅当通过"源"实用程序(如"源 script-name.sh")运行脚本时,才会出现问题
使用"./script-name.sh"运行也会产生正确的结果。
你的问题可以简化为在 zsh 命令行上做
echo -
它也不会输出任何内容。同样,一个
echo - x
将仅输出x 而不是- x
.
这并不取决于您是否在Mac上。如果你会做一个
echo - -
或
=echo -
(后者使用外部程序echo
)将打印破折号。
因此,您可以在script-name.sh
中更改
=echo $output
或
echo - $output
你应该没事。
zshbuiltins手册页在描述echo
命令时对此进行了解释:
第一个破折号(可能跟随选项)不会打印,但后面的所有内容都打印为参数。
因此,在 zsh 中,至少在打印变量时,为了安全起见,最好也使用单独的破折号。
您的代码为 RHEL7 上的 bash 4.2.46 提供了预期的输出。 你也许在使用 zsh 吗?
请参阅 unix 命令行中的 echo 'the character -(破折号)
编辑:好的,如果是zsh,你可能不得不使用黑客:
if [[ ${output} == '-' ]]; then
echo - ${output}
else
echo ${output}
fi
或使用 printf:
printf $output"n"