[$var]是检查bash中变量set/empty的可接受方法吗?

[$var]是检查bash中变量set/empty的可接受方法吗?,bash,shell,variables,Bash,Shell,Variables,我在阅读前写了一些文章。我注意到我做事的方式在任何答案中都没有体现出来,所以我很好奇我的逻辑是否存在我没有看到的危险/错误 if [ ! $1 ] || [ $2 ]; then echo "Usage: only one var." && exit 1 fi 如您所见,我正在测试命令行上是否给出了一个且只有一个参数。据我测试,这是可行的。有人能把更多的知识传授给新的bash用户吗?这更清楚: if [ $# != 1 ] ; then echo "Usage:

我在阅读前写了一些文章。我注意到我做事的方式在任何答案中都没有体现出来,所以我很好奇我的逻辑是否存在我没有看到的危险/错误

if [ ! $1 ] || [ $2 ]; then
    echo "Usage: only one var." && exit 1
fi
如您所见,我正在测试命令行上是否给出了一个且只有一个参数。据我测试,这是可行的。有人能把更多的知识传授给新的bash用户吗?

这更清楚:

if [ $# != 1 ] ; then
    echo "Usage: only one var."; exit 1
fi
$2
为空字符串时,
[$2]
将为false


正如一篇评论中所指出的,bash将拆分这两个字符串,从而引发一系列问题,包括潜在的安全漏洞。

会破坏测试的东西:

  • 第一个参数为空(
    “”
  • 第二个参数为空(
    “”
  • 第一个或第二个参数有更多的字(
    “bla bla”
  • 参数包含将由
    测试解释的内容(例如:
    -z

它比使用
$#
更清晰。此外,我必须考虑所有可能破坏代码的极端情况,这一事实也让它变得更差。

不,不是。需要更多的引语——这会告诉你。另外,“空”和“未设置”是两个不同的东西。在不同的主题上——在你的问题标题中使用“this”,当你可以引用成语时,会迫使人们点击阅读你的问题,以决定它是否有趣,而不是让标题本身就足够有用来通知决策。打倒点击诱饵问题!提供有用的标题!:)请使用第一个参数
“foo bar baz”
尝试您的脚本,或者使用第二个参数
“-n”
尝试脚本。多亏了发布了$#的人,如果您有兴趣阅读更多有关特殊参数的信息,如$#,它包含给定的参数数量。此外,
/script“1=2”
是一个参数,但失败
/script'-ta'
是一个参数,失败时出现错误,
/script'-f.ssh/authorized_keys'
允许您查看是否设置了ssh密钥。这确实是不可接受的。但是,
[“$2”]
基本上是可以接受的。它不执行任何操作,仅当
$2
未设置(您需要)或
$2
设置为空字符串(您可能也需要)时,它才为false。也就是说,为了确保获得足够的参数,正确的测试方法是使用
$#
,如下面的@thomas Dicken要点所示。
./script one '' oops