我正在尝试在一个简单的 shell 脚本中比较两个字符串。我使用的是/bin/sh
instead of /bin/bash
,经过无数小时的调试,结果 sh (实际上是破折号)无法处理这段代码:
if [ "$var" == "string" ]
then
do something
fi
使用 比较字符串的可移植方法是什么/bin/sh
?我知道我总是可以通过使用 != 来做相反的事情,但我想知道一种更清洁、更便携的方式。
我正在尝试在一个简单的 shell 脚本中比较两个字符串。我使用的是/bin/sh
instead of /bin/bash
,经过无数小时的调试,结果 sh (实际上是破折号)无法处理这段代码:
if [ "$var" == "string" ]
then
do something
fi
使用 比较字符串的可移植方法是什么/bin/sh
?我知道我总是可以通过使用 != 来做相反的事情,但我想知道一种更清洁、更便携的方式。
dash
是一个非常严格的 POSIX shell,如果它在其中工作,dash
几乎可以肯定它会在其他 POSIX shell 中工作。
尝试:
if [ "$var" = "string" ]
then
some_command
fi
为什么甚至有可能您的脚本将由“错误”的 shell 运行?我认为您可以通过在脚本顶部使用标准 sh-bang 行来将其作为产品的先决条件:
#!/bin/bash
即使用户使用不同的 shell,其他 shell 通常仍然存在,如果没有,只需抱怨并声明它们是 pre-req。
与特定内核级别或 awk 的存在完全相同的方式可以是 pre-req。
对于您的具体问题,我相信sh
并bash
允许将单个 '=' 用于字符串比较 - 这是 POSIX 行为:
if [ "a" = "a" ] ; then
echo yes
fi
yes
使用=
而不是==
. 比较由 test(1) 处理。/usr/bin/[
通常是指向 的链接/usr/bin/test
。唯一的区别是,如果您[
在 shell 脚本中使用,则]
也是必需的。
请注意,bash 有一个内置test
/ [
,因此它实际上并不使用/usr/bin/test
.
已经发布的答案肯定是正确的,但可能值得注意的是,偶尔参数扩展可以达到相同的目的,也许还有一些额外的灵活性。
% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'
好的,所以上面的内容并不是超级有用,但也考虑到您可以使用类似的方法来测试here-documents中的变量,必要时进行内联变量分配(在一定程度上......),甚至就像编写第一个语句的更短(更快!)的方法一样。
[ ! "${var##"string"}" ] && _MATCH || _NOMATCH
甚至...
[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE
甚至可能...
% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
> ${in="${1##"${2}"}"}
> ${in:-${var_chk=all}
> ${var_chk=some}
> }
> HEREDOC
%
你可以使用 awk
awk 'BEGIN{
string1="test"
string2="tes1t"
if(s1==s2){
print "same string"
}else{
print "not same"
}
}'