bash中,仪表板和字符串比较
-
11-09-2019 - |
题
我想两个字符串在一个简单的shell脚本进行比较。
我用/bin/sh
代替/bin/bash
,和调试的无数个小时后,原来的sh(实际上是短划线)不能处理的代码块:
if [ "$var" == "string" ]
then
do something
fi
什么是使用/bin/sh
比较字符串可移植的方式?我知道我可以随时通过反其道而行之!=,但我想知道一个更清洁,可移植的方式。
解决方案
dash
是一个非常严格的POSIX壳,如果在工作dash
它几乎是一定的,将在其他POSIX壳工作。
尝试:
if [ "$var" = "string" ]
then
some_command
fi
其他提示
为什么会出现即使您的脚本将被“错误的”壳运行的可能性?我想你可以做,通过使用标准的SH-砰线在你的脚本的顶级产品的先决条件:
#!/bin/bash
即使用户的使用不同的外壳,其他弹通常仍然存在,如果没有,简单地抱怨和状态,他们是一个预REQ。
完全同样的方式,一个特定的内核级,或AWK的存在,可为预先-REQ。
有关您的具体问题,相信无论sh
和bash
允许单个“=”将被用于字符串比较 - 这是POSIX行为:
if [ "a" = "a" ] ; then
echo yes
fi
yes
使用=
代替==
。比较受到测试处理(1)。 /usr/bin/[
通常与/usr/bin/test
的链接。唯一的区别是,如果在一个外壳脚本中使用[
,所述]
需要为好。
需要注意的是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'
好了,因为高于不超有用的,但也考虑到如果必要,可以用于测试变量类似的方法在这里的文档,在线变量赋值(在一定程度上...) ,甚至只是作为一个短(更快!)意味着你要写自己的声明。
[ ! "${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"
}
}'
不隶属于 StackOverflow