如何在Bash中比较string
如何将一个variables与一个string进行比较(如果匹配,则执行一些操作)?
尝试这个:
if [ "$x" == "valid" ]; then echo "x has the value 'valid'" fi
如果你想在不匹配的时候做一些事情,把==
replace成!=
。 你需要$x
左右的引号,因为如果$x
是空的,你会得到if [ == "valid" ]...
这是一个语法错误。
请注意, bash
允许==
用于[
,但这不是标准的。 或者使用[[ "$x" == "valid" ]]
(在这种情况下, $x
的引号是可选的)或[ "$x" = "valid" ]
。
或者,如果你不需要其他条款:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
比较使用通配符的string
if [[ "$stringA" == *$stringB* ]]; then # Do something here else # Do Something here fi
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
和[
and]
之间的空格很重要 -
>
和<
是redirect操作符,所以用\>
和\<
分别为string转义。
你也可以使用用例/ esac
case "$string" in "$pattern" ) echo "found";; esac
有一点我不得不同意其中一个意见:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
不,这不是一个疯狂的oneliner
这只是一个看起来像,嗯,外行…
它以某种方式使用常见的模式作为语言;
而且,你学习了语言。
其实,阅读很好
这是一个简单的逻辑expression式,有一个特殊的部分:逻辑运算符的懒惰评估。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑expression; 第一个可能是真的还是假的,另外两个是真的。
( [ "$x" == "valid" ] && echo "valid" ) || echo "invalid"
现在,当它被评估时,第一个被检查。 如果它是错误的,那么逻辑的第二个操作数和 &&
不相关后的&&
。 第一个是不正确的,所以无论如何它不可能是第一个和第二个。
现在,在这种情况下是逻辑或 ||
的第一面 假的,但是如果对方 – 第三部分 – 是真的,那么可能是真的。
所以第三部分将被评估 – 主要是将这个信息写成副作用。 (它的结果为0
,这里我们不使用)
其他情况类似,但更简单 – 我承诺! 是 – 可以 – 容易阅读!
(我没有一个,但我认为做一个灰胡子的UNIX老兵帮助很多。)
下面的脚本从一个名为“testonthis”的文件中逐行读取,然后将每行与一个简单的string,一个带有特殊字符的string和一个正则expression式进行比较,如果不匹配,那么脚本将打印行o / w。
bash中的空间非常重要。 所以下面会工作
[ "$LINE" != "table_name" ]
但以下不会:
["$LINE" != "table_name"]
所以请按原样使用:
cat testonthis | while read LINE do if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then echo $LINE fi done
我可能会使用正则expression式匹配,如果input只有几个有效的条目。 例如,只有“开始”和“停止”是有效的动作。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then echo "valid action" fi
请注意,我通过使用双逗号小写variables$ACTION
。 另外请注意,这不会在太旧的bash版本在那里工作。