在bash shell脚本中如何判断字符串中是否含有某个子字符串

时间:2019-11-20 08:52:59  来源:igfitidea点击:

问题

如何判断变量path=/srv/www/theitroad.local/中是否包含子字符串theitroad.local?
在Bash脚本中如何检查字符串是否包含子字符串?

解决方案

我们可以使用awk,perl,bash和其他方法在shell脚本中查找变量是否包含子字符串。

检查bash变量是否包含子字符串

在bash中查看字符串是否包含子字符串。

使用case语句

case "$var" in
    *pattern1* ) echo "do something #1";;
    *pattern2* ) echo "do something # 2";;
    * ) echo "Error...";;
esac

示例代码:

#!/bin/bash
path="/srv/www/theitroad.local" 
sync_root(){
	echo "Running rsync..."
        rsync -ar $path/* [email protected]:$path
}
 
case "$path" in
    *theitroad.local*) sync_root ;;
    *) echo "Error: Domain does not exits in path.";;	
esac

在Bash中判断字符串是否包含子字符串

[[[都是条件表达式。这是测试命令/内置命令的同义词。
但是,[[是对[命令的改进。

请注意,以下是bash特定的语法,不适用于BourneShell:

[[ $var = *pattern1* ]]
## 或者 ##
if [[ $var = *pattern1* ]]
then
    echo "Do something"
fi

使用bash regex正则表达式语法

Bash v3以上版本还支持其他正则表达式。

判断bash变量是否包含子字符串的语法如下:

[[ $var =~ .*substring.* ]]
[[ $value =~ .*container1.* ]] && do_something

示例代码:

#!/bin/bash
domain="theitroad"
[[ $domain =~ .*road* ]] && echo "Found" || echo "Not found"


## 或者 ##
if [[ $domain =~ .*it* ]] 
then
   echo "found"
else
   echo "Not found."
fi

使用AWK正则表达式语法

使用AWK正则表达式测试shell脚本中字符串是否包含子字符串:

# define a var at shell
var="This is a test"
 
# use awk 
awk '
var="Hello world"
grep -q 'foo' <<< $var && echo "包含foo子字符串" || echo "Not a substring"
grep -q 'world' <<< $var && echo "包含world子字符串" || echo "Not a substring"
~/test/{print "包含test子字符串"}' <<< $var

grep命令语法

使用grep命令测试Bash脚本中的字符串是否包含子字符串:

##代码##

总结

在写bash脚本时,检查变量是否包含某个子字符串非常常用。当然,我们也可以使用Perl,Python等进行测试。