【问题标题】:Bash Scripting: Using Two Variables in IF StatementBash 脚本:在 IF 语句中使用两个变量
【发布时间】:2016-09-18 08:11:21
【问题描述】:

所以我正在尝试编写一个简单的脚本,该脚本接受两个标准输入变量,然后测试这两个变量的字符串值是否等于设置的字符串。这是我的代码:

echo "First Name:"
read fN

echo "Last Name"
read lN

if ((  $fN + $lN=="louis smith" ))
then
    echo "You are root, you may continue."
else
    echo "Access denied, you are not root."
first

当我运行脚本并输入名字为“louis”和姓氏为“smith”时,我收到此错误:

((: louis + smith==louis smith : 表达式中的语法错误(错误标记为“smith”)

然后它告诉我我不是 root,而我显然是。 xD 任何输入都有帮助:D

【问题讨论】:

  • 你认为+是字符串拼接,bash不这么认为,

标签: bash if-statement scripting


【解决方案1】:

(( ... )) 用于算术表达式,不能用于比较字符串。 + 用于添加数字,而不是连接字符串。将[[ ... ]] 用于条件表达式。

if [[ "$fN $lN" = "louis smith" ]]

【讨论】:

  • 非常感谢,我想既然我将两个变量加在一起,它会被认为是布尔值,但我猜布尔值只指整数。是时候更新标题了...
  • @LouisSmith,不,整数也不是布尔值。 “布尔值”是单比特值——要么是真要么是假,或者被强制转换为这样的值。
  • @LouisSmith 布尔值是比较的结果。但是在(())里面,你只能做算术运算和数值比较。
  • @CharlesDuffy 说得有道理,那会不会像二进制一样,1 为真,0 为假?
  • @CharlesDuffy 查看Conditional constructs((...))的描述
【解决方案2】:

除了其他答案之外,您还需要确保自己熟悉可以正确编写条件的每种方式。没有魔法,只需阅读 man bash 的相应部分。 [[ 测试实际上是 bash 中的 Reserved Word 并且是 bashism(它在 bash 中有效,但在 POSIX shell 中无效)。它是 bash 最灵活和最宽容的测试构造,如果可移植性不是问题,则应该使用它。。确保您了解[[ 测试子句和[ 之间的引用要求分词路径名扩展的区别和test 内置函数。

除了[[,您还可以使用[test进行测试。 ([test 是等价的)。以下也是正确且可移植到 POSIX shell 的:

if [ "$fN $lN" = "louis smith" ]

if test "$fN $lN" = "louis smith"

要直接回答您的原始问题,您可以通过在测试表达式本身(旧语法)或通过使用&&and)或||)。例如,使用您的示例检查多个条件,您可以这样做:

if [ "$fN" = "louis" -a "$LN" = "smith" ]

if test "$fN" = "louis" -a "$LN" = "smith"

使用&&|| 编写:

if [ "$fN" = "louis" ] && [ "$LN" = "smith" ]

if test "$fN" = "louis" && test "$LN" = "smith"

(注意:无论您使用哪个必须始终测试表达式[之间留下space]spacenewline(或换行指示符 ;)在 if test "$a" = b ; then... 之间)

【讨论】:

  • 哇,非常感谢,这对我来说是很多新信息。肯定会去测试一下。很高兴能加入这个论坛。
  • 当然,bash 与任何 shell 或语言一样,只是需要时间来学习和挖掘细节。条件表达式是您在脚本的各个方面使用的关键部分之一(或将在其他脚本中看到)。很高兴知道不仅要寻找一种口味,而且至少要寻找 4 种(我没有介绍数字比较 (( ... )),但它们也是混合的一部分)
猜你喜欢
  • 2014-02-02
  • 2019-03-08
  • 2014-10-09
  • 2015-05-31
  • 2012-11-19
  • 2014-05-26
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多