BashShell字符串
1. 简介
BashShell 字符串内置许多字符串操作,包括有字符串切割、替换、分割等。
2. ${}
语法
2.1 字符串截取
举例来说:对于字符串 file=/dir1/dir2/dir3/my.file.txt
,可以用 ${}
分别替换得到不同的值:
${file#*/}
: 删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}
: 删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}
: 删掉第一个 . 及其左边的字符串:file.txt
${file##*.}
: 删掉最后一个 . 及其左边的字符串:txt
${file%/*}
: 删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}
: 删掉第一个 / 及其右边的字符串:(空值)
${file%.*}
: 删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}
: 删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆方法:
1 |
|
2.2 子串提取、替换
对于字符串 file=/dir1/dir2/dir3/my.file.txt
,还可以使用 ${}
语法来进行子串提取和替换:
${file: start: length}
语法:
${file: 0: 5}
:提取最左边的 5 个字节:/dir1
${file: 5: 5}
:提取从左往右数第 5 个字节右边的连续 5 个字节:/dir2
${file: 5}
:提取第 5 个字节右边的所有字节:/dir2/dir3/my.file.txt
${file: -8: 4}
:提取从右往左数第 8 个字节右边的连续 4 个字节:file
${file: -8}
:提取从右往左数第 8 个字节右边的所有字节:file.txt
${file/dir/path}
:将第一个dir
提换为path
:/path1/dir2/dir3/my.file.txt
${file//dir/path}
:将全部dir
提换为path
:/path1/path2/path3/my.file.txt
${#file}
:获取字符串长度:27
2.3 字符串 数组
${}
语法默认使用 IFS 指定的分隔符分隔字符串(即空白符:空格、tab 符、换行符),默认使用空格连接字符串元素。
-
${str[*]}
:得到数组所有元素作为一个长字符串整体(all of the elements) -
${str[@]}
:得到数组每一个元素,即子串数组(each of elements) -
${#str[*]}
:得到数组元素的个数(number of elements) -
${!str[*]}
:得到数组所有元素的下标(all indexs of elements) -
${!str[@]}
:得到数组每一个元素的下标(each index of elements)
【注】此数组非 Bash Shell 的数组变量,只是为了方便理解而称呼,其本质还是单变量,Bash Shell 对其进行了扩展从而使得解析时呈现不同效果。
2.4 大小写转换
-
${str,,}
:将字符串全部转为小写 -
${str^^}
:将字符串全部转为大写
2.5 字符串分割
bash shell 下将带有特定分隔符的长字符串分割短字符串数组有很多种方式。
2.5.1 直接修改 IFS 环境变量
对于长字符串分隔符不是空白符(IFS 默认分隔符为空白符:即空格、tab、换行符)的长字符串,可以通过修改 IFS 环境变量来指定字符串分割规则。比如在 bash shell 中输入以下代码:
1 |
|
会得到以下结果:
1 |
|
详细参见 IFS变量对加双引号和不加双引号变量的区别对待 。
2.5.2 使用 ${}
语法
如果不想修改 IFS 环境变量,可以使用上文中的 ${}
语法将长字符串分隔符替换为空白符,这样就可以使用默认的 IFS 环境变量。比如在 bash shell 中输入以下代码:
1 |
|
会得到以下结果:
1 |
|
3. [[ ]]
语法
-
[[ $str1 == $str2 ]]
:判定字符串是否相等 -
[[ $str1 != $str2 ]]
:判定字符串是否不等 -
[[ $str1 =~ $str2 ]]
:判定字符串 str1 是否包含字符串 str2 -
[[ $str1 > $str2 ]]
:判定字符串 str1 是否按字典序大于字符串 str2 -
[[ $str1 < $str2 ]]
:判定字符串 str1 是否按字典序小于字符串 str2 -
[[ -z $str ]]
:判定字符串是否等于空 -
[[ -n $str ]]
:判定字符串是否不等于空
4. [ ]
语法
【注】[ ]
不能用来判断字符串相包含;且判断字符串的大小关系时需要使用 `` 转义 < >
,防止 bash shell 将其识别为重定向符号;此外,对于 -z
和 -n
选项,字符串必须要用 ""
包裹,不然可能导致奇怪的问题,建议 []
语法中用到的字符串变量都用 ""
包裹。
-
[ $str1 = $str2 ]
或[ $str1 == $str2 ]
:判定字符串是否相等 -
[ $str1 != $str2 ]
:判定字符串是否不等 -
[ $str1 =~ $str2 ]
:判定字符串 str1 是否包含字符串 str2 -
[ $str1 \> $str2 ]
:判定字符串 str1 是否按字典序大于字符串 str2 -
[ $str1 \< $str2 ]
:判定字符串 str1 是否按字典序小于字符串 str2 -
[ -z "$str" ]
:判定字符串是否等于空 -
[ -n "$str" ]
:判定字符串是否不等于空
5. test 语法
【注】test 语法和 [ ]
语法基本一样,也不能用来判断字符串的相包含,< >
也同样需要转义。二者唯一的区别在于,[ ]
是内建的语法,而 test 是调用外在的程序,因此 [ ]
要比 test 更高效。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!