从STDIN读取时,Bash会阻止符号扩展

时间:2012-03-02 04:16:15

标签: bash quotes

我正在编写一个bash脚本,它将通过STDIN接收密码并进行一些不同的检查。

当我使用包含符号的密码时,我遇到了问题。

普通密码grassy没问题,但gra$$y等复杂组合将扩展为gra3308y

这是我正在使用的脚本:

read INPUT

if [ $(echo -n $INPUT|wc -m) -ge 6 ]

then exit 0
else exit 1

fi

我尝试了所有不同类型的引用,但我无法阻止STDIN密码扩展特殊字符。

这是一个例子,没有在原始值周围加上单引号可以解决这个问题吗?

david@hostname ~ $ echo gra$$| { read INPUT; echo ${INPUT}; }
gra2598

1 个答案:

答案 0 :(得分:2)

在脚本中的变量扩展周围使用双引号:

read INPUT
echo "Password was: $INPUT"
if [ $(echo -n "$INPUT" | wc -m) -ge 6 ]
then echo "OK"; exit 0
else echo "Bogus"; exit 1
fi

在开发脚本时,使用echo显示您正在使用的内容,但也使用双引号。

如果在此程序中键入一行,则不会对您键入的字符进行shell扩展。如果您模拟用echo键入的用户,则需要阻止执行echo的shell扩展任何元字符,因此:

echo 'gra$$' | bash yourscript

省略单引号意味着shell将使用PID替换$$(可能是父shell的PID而不是管道中的shell,但是有一些PID)。这与您在运行后键入5个字符加上换行符不同:

bash yourscript

你也可以使用:

$ cat > password-file
gra$$
<control-D>
$ cat password-file
gra$$
$ bash yourscript < password-file

<control-D>是EOF指示;它刷新自输入上一个换行符以来键入的所有零个字符,cat将可用的零字节解释为EOF。因此,该文件包含6个字符:字母“g”,“r”,“a”,两个“$”符号和换行符。这将由您的脚本逐字阅读;数据不会扩展。