bash,破折号和字符串比较

Lir*_*una 31 bash string-comparison dash-shell

我试图在一个简单的shell脚本中比较两个字符串.我使用的是/bin/sh代替/bin/bash,经过无数小时的调试后,事实证明sh(实际上是破折号)无法处理这段代码:

if [ "$var" == "string" ]
then
    do something
fi
Run Code Online (Sandbox Code Playgroud)

什么是比较字符串使用的可移植方式/bin/sh?我知道我总是可以通过使用!=来做相反的事情,但我想知道一种更干净,更便携的方式.

J-1*_*DiZ 47

dash是一个非常严格的POSIX shell,如果它在它的工作,dash几乎可以肯定它可以在其他POSIX shell中工作.

尝试:

if [ "$var" = "string" ]
then
    some_command
fi
Run Code Online (Sandbox Code Playgroud)

  • 如果您在想“这里与问题中的语法有什么区别”:它使用的是 `=` 而不是 `==` (5认同)

pax*_*blo 9

为什么你的脚本甚至可能被"错误的"shell运行?我认为你可以通过使用脚本顶部的标准sh-bang线来使你的产品成为先决条件:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

即使用户使用不同的shell,其他shell通常仍在那里,如果没有,只需抱怨并声明它们是预先请求的.

与特定内核级别或awk的存在完全相同的方式可以是pre-req.

对于您的具体问题,我相信两者shbash允许单个'='用于字符串比较 - 即POSIX行为:

if [ "a" = "a" ] ; then
    echo yes
fi

yes
Run Code Online (Sandbox Code Playgroud)

  • *"为什么你的脚本甚至可能被"错误的"shell运行?"* - 是否可以控制Autoconf使用哪个shell?(这就是我正在寻找答案的原因) (2认同)

小智 6

使用=而不是==. 比较由 test(1) 处理。/usr/bin/[通常是指向 的链接/usr/bin/test。唯一的区别是,如果您[在 shell 脚本中使用,则]也需要 。

请注意,bash 有一个内置的test/ [,因此它实际上并不使用/usr/bin/test.