如何比较Bash中的字符串

时间:2010-02-10 13:31:19

标签: string bash

如何将变量与字符串进行比较(如果匹配则执行某些操作)?

11 个答案:

答案 0 :(得分:1194)

在if语句中使用变量

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

如果您想在不匹配时执行某些操作,请将=替换为!=。您可以在各自的文档中详细了解string operationsarithmetic operations

为什么我们在$x周围使用引号?

你想要$x周围的引号,因为如果它是空的,你的bash脚本会遇到语法错误,如下所示:

if [ = "valid" ]; then

==运算符

的非标准使用

请注意,bash允许==用于与[平等,但this is not standard

使用第一种情况,其中$x周围的引号是可选的:

if [[ "$x" == "valid" ]]; then

或使用第二种情况:

if [ "$x" = "valid" ]; then

答案 1 :(得分:126)

或者,如果您不需要else子句:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

答案 2 :(得分:59)

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

备注:

  1. if[]之间的空格非常重要
  2. ><是重定向运算符,因此对于字符串分别使用\>\<进行转义。

答案 3 :(得分:58)

要使用通配符比较字符串

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

答案 4 :(得分:30)

我不得不在一点上不同意其中一条评论:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

不,这不是一个疯狂的oneliner

它只是看起来像是一个,嗯,没有经验......

在某种程度上,它使用普通模式作为语言;

在你学会了这门语言之后。

实际上,阅读

很好

这是一个简单的逻辑表达式,有一个特殊部分:逻辑运算符的惰性求值。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

每个部分都是一个逻辑表达;第一个可能是真的,也可能是假的,其他两个都是真的。

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

现在,在评估时,会检查第一个。如果它是假的,那么逻辑 &&的第二个操作数在它不相关之后。第一种情况并非如此,所以无论如何它不可能是第一种,也不是第二种 现在,在这种情况下,逻辑 ||的第一面是假的,但如果另一方 - 第三方 - 是真正。

所以第三部分将被评估 - 主要是将信息写成副作用。 (结果0为true,我们在这里不使用)

其他情况类似,但更简单 - 而且 - 我保证!是 - 可以 - 易于阅读!
 (我没有,但我认为作为一名有着灰胡子的UNIX老手对此有很大的帮助。)

答案 5 :(得分:19)

您也可以使用用例/ esac

case "$string" in
 "$pattern" ) echo "found";;
esac

答案 6 :(得分:13)

以下脚本逐行从名为“testonthis”的文件中读取,然后将每行与一个简单的字符串,一个带有特殊字符的字符串和正则表达式进行比较,如果它不匹配则脚本将打印该行o / w not

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

答案 7 :(得分:10)

如果输入只有几个有效条目,我可能会使用regexp匹配。例如。只有“开始”和“停止”才是有效的动作。

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

请注意,我使用双逗号来小写变量$ACTION。另请注意,这对于太老的bash版本不起作用。

答案 8 :(得分:6)

Bash4 +示例。注意:当单词中包含空格等时,不使用引号会引起问题。始终在bash IMO中引用。

以下是BASH4 +的一些示例:

示例1,检查字符串中的“是”(不区分大小写):

    if [[ "${str,,}" == *"yes"* ]] ;then

示例2,在字符串中检查“是”(不区分大小写):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

示例3,在字符串中检查“是”(区分大小写):

     if [[ "${str}" == *"yes"* ]] ;then

示例4,在字符串中检查“是”(区分大小写):

     if [[ "${str}" =~ "yes" ]] ;then

示例5,完全匹配(区分大小写):

     if [[ "${str}" == "yes" ]] ;then

示例6,完全匹配(不区分大小写):

     if [[ "${str,,}" == "yes" ]] ;then

示例7,完全匹配:

     if [ "$a" = "$b" ] ;then

享受。

答案 9 :(得分:1)

我这样做是与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

答案 10 :(得分:0)

您有比较问题吗? (如下图?)

var="true"
if [[ $var == "true" ]];then
  #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