shell字符串操作

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
记忆的方法为:

# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配。也就是说,当匹配的有多种方案的时候,选择匹配的最大长度还是最小长度。(注意,${file表达式}是用于掐头去尾,表达式一定得是需要去掉的字符段的准确表述或正则表达式。如,string=qwenkj,那么${string#?en}得到的仍是原字符串string)

还有两种方式:
tomcat_path=${tomcat_path:0:(len-1)},
{参数:n:m} 是从字符串的第n+1个(含第n+1个)截取长度为m的字符串,可省略m参数
expr substr "$x" 1 3,截取从第1个到第3个的字符子串

2,得到长度
x="abcd"
#方法一
expr length $x
# 方法二
echo ${#x}
# 方法三
expr "$x" : ".*"

3.查找子串
expr index $x "string" 查找string里从第一个字符起,所有字符能匹配到$x里字符的最先位置 如 expr index "adcd" "d2a" 返回值为1
awk 'BEGIN {print match($x,"b")} ' (返回的为符合条件的第一个子串的位置,如没有返回0)
注意:expr match $x "abc" ,在expr的match是从第一个字符开始对比的,表示匹配长度

4.字符串的替换
x=abcdabcd
echo ${x/a/b} # 只替换一个
bbcdabcd
echo ${x//a/b} # 替换所有
bbcdbbcd

例子:

目前我们已学习了所有截断字符串的知识,下面写一个简单短小的 shell 脚本。我们的脚本将接受一个文件作为自变量,然后打印:该文件是否是个 tar 文件。要确定他是否是 tar 文件,将在文件末尾查找模式 ".tar"。如下所示:
mytar.sh -- 一个简单的脚本
#!/bin/bash
if [ "${1##*.}" = "tar" ]
then
echo This appears to be a tarball.
else
echo At first glance, this does not appear to be a tarball.
fi
要运行此脚本,将他输入到文件 mytar.sh 中,然后输入 "chmod 755 mytar.sh",生成可执行文件。然后,如下做一下 tar 文件试验:
$ ./mytar.sh thisfile.tar
This appears to be a tarball.
$ ./mytar.sh thatfile.gz
At first glance, this does not appear to be a tarball.
好,
成功运行,不过不太实用。在使他更实用之前,先看一下上面使用的 "if" 语句。语句中使用了一个布尔表达式。在 bash 中,"="
比较运算符检查字符串是否相等。在 bash
中,所有布尔表达式都用方括号括起。不过布尔表达式实际上测试什么?让我们看一下左边。根据前面所学的字符串截断知识,"${1##*.}"
将从环境变量 "1" 包含的字符串开始部分除去最长的 "*." 匹配,并返回结果。这将返回文件中最后一个 "."
之后的所有部分。显然,如果文件以 ".tar" 结束,结果将是 "tar",条件也为真。
你可能会想:开始处的 "1" 环境变量是什么。非常简单 -- $1 是传给脚本的第一个命令行自变量,$2 是第二个,以此类推。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值