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.查找子串

exprindex $x "string" 查找string里从第一个字符起,所有字符能匹配到$x里字符的最先位置 expr index "adcd" "d2a" 返回值为1

awk 'BEGIN {printmatch($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 tobe a tarball.

else

echo At firstglance, this does not appear to be a tarball.

fi

要运行此脚本,将他输入到文件mytar.sh 中,然后输入 "chmod 755 mytar.sh",生成可执行文件。然后,如下做一下 tar 文件试验:

$ ./mytar.shthisfile.tar

This appears to be atarball.

$ ./mytar.shthatfile.gz

At first glance,this does not appear to be a tarball.

好,

成功运行,不过不太实用。在使他更实用之前,先看一下上面使用的"if" 语句。语句中使用了一个布尔表达式。在 bash 中,"="

比较运算符检查字符串是否相等。在bash

中,所有布尔表达式都用方括号括起。不过布尔表达式实际上测试什么?让我们看一下左边。根据前面所学的字符串截断知识,"${1##*.}"

将从环境变量 "1"包含的字符串开始部分除去最长的 "*." 匹配,并返回结果。这将返回文件中最后一个 "."

之后的所有部分。显然,如果文件以".tar" 结束,结果将是 "tar",条件也为真。

你可能会想:开始处的"1" 环境变量是什么。非常简单 -- $1 是传给脚本的第一个命令行自变量,$2 是第二个,以此类推。

#Cygwin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值