如何将变量与字符串进行比较(如果它们匹配,则执行某些操作)?
if [ "$x" = "valid" ]; thenecho "x has the value 'valid'"fi
如果你想在它们不匹配时做某事,请将=替换为!=。您可以在各自的留档中阅读有关字符串操作和算术运算的更多信息。
=
!=
$x
您需要$x左右的引号,因为如果它为空,您的Bash脚本会遇到语法错误,如下所示:
if [ = "valid" ]; then
==
请注意,Bash允许==用于与[相等,但这不是标准。
[
使用第一种情况,其中$x周围的引号是可选的:
if [[ "$x" == "valid" ]]; then
或者使用第二种情况:
if [ "$x" = "valid" ]; then
或者,如果您不需要否则子句:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
您也可以使用use案件/esac:
case "$string" in"$pattern" ) echo "found";;esac
要将字符串与通配符进行比较,请使用:
if [[ "$stringA" == *"$stringB"* ]]; then# Do something hereelse# Do something herefi
如果输入只有几个有效条目,我可能会使用正则表达式匹配。例如。只有“开始”和“停止”是有效的操作。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; thenecho "valid action"fi
请注意,我通过使用双逗号来小写变量$ACTION。还要注意,这在太陈旧的bash版本上不起作用。
$ACTION
a="abc"b="def" # Equality Comparisonif [ "$a" == "$b" ]; thenecho "Strings match"elseecho "Strings don't match"fi # Lexicographic (greater than, less than) comparison.if [ "$a" \< "$b" ]; thenecho "$a is lexicographically smaller then $b"elif [ "$a" \> "$b" ]; thenecho "$b is lexicographically smaller than $a"elseecho "Strings are equal"fi
备注:
if
]
>
<
\>
\<
我不得不同意其中一个评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
只是它看起来像一个,嗯,外行…
它使用共同的模式作为一种语言,在某种程度上;
在你学会了语言之后。
它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。
每个部分都是一个逻辑表达式;第一个可能是真或假,另外两个总是真。
([ "$x" == "valid" ]&&echo "valid")||echo "invalid"
现在,当它被评估时,检查第一个。如果它为假,比它之后的逻辑<强>和强>&&的第二个操作数无关。第一个不是真的,所以无论如何,它不可能是第一个,第二个是真的。现在,在这种情况下,逻辑<强>或强>||的第一面为false,但如果另一面-第三部分-为true,则可能为true。
&&
||
所以第三部分将被评估-主要是将消息作为副作用写入。(它的结果0为true,我们在这里不使用)
0
其他情况类似,但更简单-和-我保证!是-可以-容易阅读!(我没有,但我认为作为一个灰胡子的UNIX老手对此有很大帮助。
以下脚本逐行读取名为“testonthis”的文件,然后将每行与一个简单字符串、一个带有特殊字符的字符串和一个正则表达式进行比较。如果不匹配,则脚本将打印该行,否则不匹配。
Bash中的空间非常重要。因此,以下操作将有效:
[ "$LINE" != "table_name" ]
但以下内容不会:
["$LINE" != "table_name"]
请按原样使用:
cat testonthis | while read LINEdoif [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; thenecho $LINEfidone
我是这样做的,它与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中引用,IMO。
以下是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 inequalityfi