从 unix shellscript 中的位置参数读取时出现 $ 符号问题

从 unix shellscript 中的位置参数读取时出现 $ 符号问题

我编写了以下脚本:

#!/bin/bash

TEST=$1
TEST_1=$2

if [[ "$TEST" == e ]];then
echo $TEST_1
else
echo "Input is not e"
fi

现在如果我运行:

sh test.sh e NS3#$xX$56M

那么输出将是

NS3#56M

这就是删除所有$xX$字符。有什么办法可以获得所有字符,包括特殊字符?

答案1

原因是你没有正确引用你的输入。您传递给脚本的参数包含$,并且您传递的参数不带引号(即简单地作为NS3#$xX$56M),这意味着它将受到变量扩展。这意味着解释你的 shell

sh test.sh e NS3#$xX$56M

调用test.sh脚本的命令将首先尝试$xX用 shell 变量的内容(本地定义的或导出为环境变量)替换该部分xX,并且 - 因为可能没有任何 - 在它之前用“无”替换该部分将结果传递给您的脚本。然而,这是 shell 的正确功能,因此您的脚本没有任何主要错误(如 @roaima 所指出的)。

为了防止出现此问题,请将字符串括在单引号中,这将禁用任何扩展:

sh test.sh e 'NS3#$xX$56M'

作为脚本的一般注释:

  • 不要使用全大写的变量名称,除非您打算将它们导出到环境中(即使用test而不是TEST) - 这可以防止脚本变量与可能重要的环境变量之间发生不必要的冲突。
  • 使用shellcheck,也可在许多 Linux 发行版上作为独立程序使用,以“校对”您的脚本;这将有助于防止许多错误。
  • 从你遇到的问题来看,始终确保正确引用 shell 变量使用它们时,除非您明确知道您希望进行变量/全局扩展和分词。这也适用于脚本中 shell 变量的使用。
  • 您将该脚本称为
    sh test.sh ....
    
    这将覆盖#!-line 并使用shshell,在许多系统上,它是一个兼容 POSIX 的 shell,它不理解[[ ... ]]操作符,例如,要么使其可执行并将其调用为./test.sh,要么显式使用bash test.sh

相关内容