![在 Bash 中比较两个字符串](https://linux22.com/image/40106/%E5%9C%A8%20Bash%20%E4%B8%AD%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
if
我的 bash 脚本中有以下块:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
if
即使$PACKAGENAME
等于 ,脚本执行也没有进入我的块kakadu-v6_4-00902C
。我究竟做错了什么?
答案1
-eq
是一个算术运算符,用于比较两个数字。
使用=
(portable/standard sh
)=~
或==
代替。
还要使用引号,因为如果${PACKAGENAME}
包含空格或通配符,那么它将被拆分为多个参数,这会导致 make[
看到比所需的参数更多的参数。看这里常见 bash 陷阱的列表。
if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
echo "successfully entered if block!!"
fi
请参阅man bash
,搜索 ( /)CONDITIONAL EXPRESSIONS
。
答案2
替换-eq
为==
这样你的 if 块将是这样的:-
if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
答案3
另一种方法是否定它们:
: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
echo '$PACKAGENAME is not kakadu-v6_4-00902C'
exit 1
} >&2
上面的块首先测试是否"$PACKAGENAME"
有任何值,如果没有,则退出并返回错误并回?'this'}
显stderr
。如果其父 shell 仍然存在,则测试已通过,接下来测试从变量中删除“kakadu...”字符串是否会产生-z
空字符串。如果没有,那么它会再次发出错误并退出 shell。如果此时您的 shell 在块执行后仍然存在任何内容,否则就不存在。
也许这种事情最好在函数中实现。喜欢:
argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
until z "${2+?}" $((i=i+1)) #until $2 is not set...
do ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
exit $((i${1:++1})) #exit $? == failed arg count
shift ; done #shift away one param ; continue loop
)
使用该函数,您可以提供系统允许的尽可能多的参数。如果您提供的数量少于 2,它将返回 1 并向 发出一条消息stderr
。如果您提供 2 个或更多参数,它将把所有参数视为字符串,如果所有参数都相同且不为 null,则返回 0,否则它将返回第一个检查失败的参数编号。
在你的情况下,它可以像这样使用:
{
PACKAGENAME='kakadu-v6_4-00902C'
argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
echo failure
! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
echo failure
}
###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C
为了进一步演示,我将编写另一个函数:
aeqecho() { i=$((i+1)) #inc for line#
argeq "$@" && echo "$i : yay" || #allswell or
! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
echo "$i : shite - arg$e failed" #report failure
}
演示:
{ i= s=string
aeqecho $s #1
aeqecho $s $s #2
aeqecho "$s $s" #3
aeqecho "$s $s" "${s} string" #4
aeqecho "${s}1" $s string #5
aeqecho "" "" "" #6
aeqecho "" "$s" $s #7
aeqecho 1 "${s#$s}1" $((2-1)) #8
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}
输出:
ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay