我如何比较一个变量的字符串(并做一些事情,如果他们匹配)?
在if语句中使用变量
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
如果你想在它们不匹配的时候做一些事情,用!=替换=。您可以在它们各自的文档中阅读更多关于字符串操作和算术操作的信息。
为什么在$x周围使用引号?
你需要在$x周围加上引号,因为如果$x为空,你的Bash脚本会遇到如下所示的语法错误:
if [ = "valid" ]; then
==运算符的非标准使用
请注意,Bash允许使用==与[相等,但这不是标准的。
使用第一种情况,其中$x周围的引号是可选的:
if [[ "$x" == "valid" ]]; then
或者使用第二种情况:
if [ "$x" = "valid" ]; then
要比较字符串和通配符,使用:
if [[ "$stringA" == *"$stringB"* ]]; then
# Do something here
else
# Do something here
fi
如果输入只有几个有效项,我可能会使用regexp匹配。例如,只有“开始”和“停止”是有效的操作。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
注意,我使用双逗号小写变量$ACTION。还要注意,这在太老的bash版本上不起作用。
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
注:
if和[和]之间的空格很重要 >和<是重定向操作符,因此对于字符串分别使用\>和\<转义。
我不得不在某一点上不同意其中的一个评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
不,这不是疯狂的线上旅行
只是在外行看来,嗯…
在某种程度上,它使用通用模式作为一种语言;
在你学会了语言之后。
事实上,读起来很不错
它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式;第一个可能是真的,也可能是假的,其他两个永远是真的。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,当它被求值时,第一个被选中。如果为false,则逻辑的第二个操作数和后面的&&不相关。第一个不是真的,所以第一个不可能是真的,第二个也不可能是真的。 现在,在这种情况下,逻辑的第一边或||是假的,但如果另一边-第三部分-是真的,它可能是真的。
所以第三部分将被评估-主要是作为一个副作用写消息。(true的结果为0,这里不使用)
其他情况类似,但更简单——而且——我保证!是——可以——容易阅读! (我没有,但我认为作为一个留着灰胡子的UNIX老手在这方面有很大帮助。)
下面的脚本逐行读取名为“testonthis”的文件,然后将每行与简单字符串、带有特殊字符的字符串和正则表达式进行比较。如果不匹配,脚本将打印该行,否则不打印该行。
在Bash中,空间非常重要。所以下面的方法是可行的:
[ "$LINE" != "table_name" ]
但下面的情况不会:
["$LINE" != "table_name"]
所以请用as is:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
我这样做,是兼容Bash和Dash (sh):
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
Bash 4+示例。注意:当单词中包含空格时,不使用引号会导致问题。在我看来,总是用Bash引用。
下面是Bash 4+中的一些例子:
例1,在字符串中检查'yes'(不区分大小写):
if [[ "${str,,}" == *"yes"* ]] ;then
例2,检查字符串中的'yes'(不区分大小写):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
例3,检查字符串中的'yes'(区分大小写):
if [[ "${str}" == *"yes"* ]] ;then
例4,检查字符串中的'yes'(区分大小写):
if [[ "${str}" =~ "yes" ]] ;then
例5,精确匹配(区分大小写):
if [[ "${str}" == "yes" ]] ;then
例6,精确匹配(不区分大小写):
if [[ "${str,,}" == "yes" ]] ;then
例7,精确匹配:
if [ "$a" = "$b" ] ;then
享受。
你是否存在比较问题?(如下面?)
var="true"
if [[ $var == "true" ]]; then
# It should be working, but it is not...
else
# It is falling here...
fi
试试=~操作符(正则表达式操作符),它可能会工作:
var="true"
if [[ $var =~ "true" ]];then
# Now it works here!!
else
# No more inequality
fi
Bash正则表达式运算符=~(官方参考) StackOverflow的进一步示例(此处)
我也曾在同样的情况下挣扎过一段时间,下面是我解决的方法:
if [ "$var1" == "$var2" ]; then
#dowhateveryouwant
fi
注意比较符号前后的空格,否则将不起作用,或者会得到意想不到的结果。
我花了很多时间在使用一个等号(=)上,但没有用。希望能有所帮助。
推荐文章
- Github权限被拒绝:ssh添加代理没有身份
- 在bash中使用正则表达式进行搜索和替换
- 如何正确比较C中的字符串?
- 如何将CharSequence转换为字符串?
- 将camelCaseText转换为标题大小写文本
- string.Equals()和==运算符真的一样吗?
- 为什么一个函数检查字符串是否为空总是返回true?
- 正则表达式在Javascript中获取两个字符串之间的字符串
- 如何分割一个带分隔符的字符串在Ruby和转换为一个数组?
- 如何在Python中实现常见的bash习语?
- 如何通过docker运行传递参数到Shell脚本
- 字符串向量上的连接运算符等价于什么?
- Bash“if [false];”返回true而不是false——为什么?
- 如何在Python中打印变量和字符串在同一行?
- 在shell脚本中使用$()而不是反引号的好处是什么?