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

e5nszbig  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(151)

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

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.怎么做才合适呢?
1.为什么源效用具有这样的蕴涵?
UPD_1:用于Mac的zsh,而不是bash UPD_2:仅当通过“source”实用程序(如“source www. example. COM“)运行脚本时,才会出现此问题script-name.sh
使用.“/script-name.sh“运行也会产生正确的结果。

bfnvny8b

bfnvny8b1#

您的问题可以简化为在zsh命令行上执行

echo -

它也不输出任何内容。类似地,

echo - x

将仅输出 x 而不是- x
这并不取决于您是否使用Mac。如果您要执行

echo - -

=echo -

(the后者使用外部程序echo)将打印破折号。
因此,你可以在你的script-name.sh中改变一

=echo $output

echo - $output

你会没事的。

  • zshbuiltins* 手册页在描述echo命令时对此进行了说明:

第一个破折号(可能跟在选项后面)不打印,但它后面的所有内容都作为参数打印。
因此,在zsh中,至少在打印变量时,为了安全起见,最好也使用一个单独的破折号。

rjzwgtxy

rjzwgtxy2#

您的代码给出了RHEL7上bash 4.2.46的预期输出。您可能使用了zsh吗?
请参阅echo 'the character - (dash) in the unix command line
编辑:好的,如果是zsh,您可能必须使用一个hack:

if [[ ${output} == '-' ]]; then
    echo - ${output}
else
    echo ${output}
fi

或者使用printf:

printf  $output"\n"

相关问题