Bash查找变量是否包含子字符串

时间:2020-01-09 10:37:21  来源:igfitidea点击:

如何确定变量spath =/srv/www/theitroad.local/https是否包含名为theitroad.local的子字符串?
如何在Bash脚本中检查字符串是否包含子字符串?
您始终可以在Linux或Unix Shell脚本中找出一个字符串/单词/变量是否包含另一个字符串/单词。

例如,在$var="hello bash"中找出是否包含hello单词
有很多方法可以测试字符串是否是bash中的子字符串。
我们可以使用awk,perl,bash和其他方法在shell脚本中查找变量是否包含子字符串。

找出bash变量是否包含子字符串

让我们看一下各种bash方法,以检查字符串是否包含子字符串。

使用case语法

您可以使用可移植的BourneShell语法,如下所示:

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

这是一个示例代码:

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

Bash检查字符串是否包含子字符串

[[[计算条件表达式。
这是测试命令/内置命令的同义词。
但是,[[是对[命令的改进。
请注意,以下是bash特定的语法,不适用于BourneShell:

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

这是一个示例代码:

#!/bin/bash
# Wrapper for faq pdf generator
# Manually generate pdf files and upload to static theitroad download server
# -
# Get all defaults and functions 
[[ -f ~/backend/utils/functions.sh ]] && ~/backend/utils/functions.sh
_pdfwriter=${_PYTHON_PDF_WRITER:-~/backend/utils/pdfwriter.beta}
 
[[ $# -eq 0 ]] && { echo "Usage: 
[[ $var =~ .*substring.* ]]
[[ $value =~ .*container1.* ]] && do_something
faq-url"; exit 1; }   [[ != *theitroad.local/faq/* ]] && { printf "Error: Specify faq url (e.g., http://www.theitroad.local/faq/url-1-2-3/)\n"; exit 2; }   ${_pdfwriter} faq ""

使用bash regex语法

Bash v3及更高版本还支持其他正则表达式。
语法如下,以查看bash变量是否包含子字符串:

#!/bin/bash
url="https://www.theitroad.local/faq/bash-for-loop/"
[[ $url =~ .*faq* ]] && echo "Found" || echo "Not found"
## if syntax ##
if [[ $url =~ .*faq.* ]] 
then
   echo "I found a word faq in ${url}."
else
   echo "Sorry. Not found."
fi

例如,找出$url中是否存在单词faq:

# define a var at shell
var="This is a test"
 
# use awk 
awk '
var="Hello world"
grep -q 'foo' <<< $var && echo "A substring called foo found" || echo "Not a substring"
grep -q 'world' <<< $var && echo "A substring called world found" || echo "Not a substring"
~/test/{print "A substring called test found"}' <<< $var

使用AWK正则表达式语法

语法非常简单:

#!/bin/bash
 
my_quote='Look for opportunities in every change in your life'
search_word='opportunities'
 
if grep -q "${search_word}" <<< "$my_quote"
then
  echo "I found '${search_word}' word in $my_quote variable."
else
  echo "Sorry I cannot find '${search_word}' word in $my_quote variable."
fi

grep命令语法

在此示例中,我将使用grep检查Bash脚本中的字符串是否包含子字符串:

#!/bin/bash
# Purpose - Basic shell script to backup required LXD containers under Linux
# Author - Hyman Gite {https://www.theitroad.local} under GPL version 2.0+ 
# -------------------------------------------------------------------------
## Get today's date ##
NOW=$(date +'%m-%d-%Y')
#
# NFS mounted backup or AWS efs 
#
DEST="/backups/lxd/${NOW}" 
#
# Define config and other paths 
#
LXD_CONF="${DEST}/$HOSTNAME-lxd.config.txt"
LXD_INST_LIST="${DEST}/$HOSTNAME-lxd.instances.list.txt"
LXD_VER="${DEST}/$HOSTNAME-lxd.version.txt"
#
# Containers to ignore from backup 
#
ignore="nginx-build-service docker-test-service mysqld-test-data php8-build-service www-testing"
 
[ ! -d "$DEST" ] && mkdir -p "$DEST"
 
## Dump LXD server config ##
lxd init --dump > "${LXD_CONF}"
 
## Dump all instances list ##
lxc list > "${LXD_INST_LIST}"
 
## Make sure we know LXD version too ##
snap list lxd > "${LXD_VER}"
 
## Backup all Instances
for i in $(lxc list -c n --format csv)
do
     file="$DEST/${i}-backup.tar.xz"	
     # Ignore backup for this container if defined in $ignore
     grep -q $i <<< $ignore && continue	
     lxc export "${i}" "$file" --optimized-storage --compression xz
done

让我们尝试一下我们的小型Shell脚本中的if命令:

##代码##

例如,这是我的LXD备份脚本,该脚本忽略$ignore中定义的备份中的容器:

##代码##