我有一个从终端读取的程序,然后将它与几个数字进行比较,例如:
read input
if [ $input == 5 ]
then
echo "The number is 5"
fi
if [ $input == 42 ]
then
echo "The number is 42"
fi
请注意,我写这篇文章时没有使用引号。
我无法更改此代码,除非它绝对确定它不安全。
我唯一看到的是,如果$input
包含2个或更多单词,它会将错误丢给stderr,并进入else。但是,幸运的是,这并没有打破代码
那么,这样安全吗? (我的意思是输入指定的命令无法执行)如果不是,请附上代码。
编辑:我知道我们使用-eq
和[[...]]
,但是当我写这篇文章时,我只是不在乎。问题是改变这段代码是非常困难的,如果这可以执行一些命令(并且可能将输出重定向到stdout或stderr),那么这将是一个大问题,但如果不是这样的话不好,我不会改变这段代码,无论它多么丑陋。
答案 0 :(得分:2)
无法从$ input运行命令。我在文档中找不到它,但似乎在任何扩展发生之前从命令行解析命令(和重定向)边界。比照
x='echo a ; echo b'
$x
输出:
a ; echo b
或(没有波浪扩展)
x='ls ~'
$x
返回:
ls: cannot access ~: No such file or directory
这同样适用于重定向(尝试x='ls | grep .'
)。
答案 1 :(得分:1)
if [ $input == 5 ]
因为几个原因而不好。使用==
是比较两个字符串的非标准方式(更标准的方法是使用单个=
)。如果您想比较两个整数,则应使用if [ "$input" -eq 5 ]
代替。变量周围的双引号可防止单词拆分。
如果您想利用特定于Bash的功能,可以使用以下方法之一:
if [[ $input -eq 5 ]] # no need for quotes inside `[[`
或
if (( input == 5 )) # arithmetic context
答案 2 :(得分:0)
使用[[
和]]
并使用==
进行比较的相对安全方法不会产生明确的错误:
read -p "Enter value: " input
if [[ $input == 5 ]]; then
echo "The number is 5"
elif [[ $input == 42 ]]; then
echo "The number is 42"
fi
即使您在input
变量中输入2个字符串单词,也不会产生错误。
有关详细信息,请在终端中运行help [[
。