如何在使用源实用程序时重新分配变量 (zsh)



下面的代码测试字符串中的字符是否与正则表达式匹配。

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

我知道这个问题在某种程度上围绕着我(重新)分配输出变量的方式,这是我的问题

  1. 如何正确操作?
  2. 为什么源效用有这样的含义?

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"

相关内容

  • 没有找到相关文章

最新更新