shell基础-字符串操作

摘要

本文部分内容来源于网络,个人收集整理,请勿传播

shell中截取字符串有很多种方法,通常情况可以使用sed、awk、cut来进行字符串切割,本文使用的是shell中字符串本身具有的字符串切割方法

字符串切割一共有9种使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
${expression}
# 字符串切割
## 最小限度从后面截取word
${parameter%word}
## 最大限度从后面截取word
${parameter%%word}
## 最小限度从前面截取word
${parameter#word}
## 最大限度从前面截取word
${parameter##word}

# 获得字符串长度
${#parameter}

# 缺省值的替换
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}

字符串切割的详细使用方式

使用 % 号操作符

  • 用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。
  • 用法为%substr*

例如:

1
2
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}

得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符

使用 %% 号操作符

  • 用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。
  • 用法为%%substr*

例如:

1
2
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}

得到的结果为http://www.你的域名.com,即删除从右边开始到最后一个"/"及其右边所有字符

使用 # 号操作符

  • 用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。
  • 用法为#*substr

例如:

1
2
str='http://www.你的域名.com/cut-string.html'
echo ${str#*//}

得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个”//“及其左边所有字符

使用 ## 号操作符

  • 用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。
  • 用法为##*substr

例如:

1
2
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}

得到的结果为cut-string.html,即删除最后出现的”/“及其左边所有字符

缺省值替换的详细使用方式

从左边第几个字符开始以及字符的个数

  • 用法为:start:len

原创

1
2
3
4
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

从左边第几个字符开始一直到结束

  • 用法为:start

例如:

1
2
3
4
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
其中的 7 表示左边第7+1个字符开始
结果是:www.你的域名.com/cut-string.html

从右边第几个字符开始以及字符的个数

  • 用法:0-start:len

例如:

1
2
3
4
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
其中的 0-15 表示右边算起第15个字符开始,10 表示字符的个数。
结果是:cut-string

从右边第几个字符开始一直到结束

  • 用法:0-start

例如:

1
2
3
4
5
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
其中的 0-4 表示右边算起第4个字符开始,10 表示字符的个数。
结果是:html
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

Shell判断字符串包含的方法

利用grep查找

1
2
3
4
5
6
7
8
strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]];then
echo "包含"
else
echo "不包含"
fi

利用字符串运算符

1
2
3
4
5
6
7
strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]];then
echo "包含"
else
echo "不包含"
fi

利用通配符

1
2
3
4
5
6
7
A="helloworld"
B="low"
if [[ $A == *$B* ]]; then
echo "包含"
else
echo "不包含"
fi

利用case in语句

1
2
3
4
5
6
thisString="1 2 3 4 5" # 源字符串
searchString="1 2" # 搜索字符串
case $thisString in
*"$searchString"*) echo Enemy Spot ;;
*) echo nope ;;
esac

利用替换

1
2
3
4
5
6
7
8
9
STRING_A=$1
STRING_B=$2
if [[ ${STRING_A/${STRING_B}//} == $STRING_A ]]; then
echo N
return 0
else
echo Y
return 1
fi