我编写了以下脚本:
#!/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 并使用sh
shell,在许多系统上,它是一个兼容 POSIX 的 shell,它不理解[[ ... ]]
操作符,例如,要么使其可执行并将其调用为./test.sh
,要么显式使用bash test.sh
。