shell编程(3)——$?、$$、变量子串

1、获取上一个命令返回值、执行脚本的pid

rlk@rlk:shell$ cat ./test1.sh 
#!/bin/bash
ls

#获取上一个命令、脚本的返回值。linux中,默认返回值0表示成功,其他的返回值表示失败
echo "\$?=$?"

#获取执行当前脚本的pid(进程号)
echo "\$$=$$"
rlk@rlk:shell$ ./test1.sh
test1.sh
$?=0
$$=739873
rlk@rlk:shell$ 

2、变量子串

功能表达式
统计变量的长度${#parameter}
删除变量开头的字符${parameter#word}
${parameter##word}
删除变量结尾的描述符${parameter%word}
${parameter%%word}
截取变量${parameter:开始截取的位置:截取的长度}
变量替换${parameter/要被替换的字符/替换的字符
${parameter//要被替换的字符/替换的字符}
  • parameter表示命令名
  • word:表示要匹配的字符串

2.1、统计变量的字符长度

rlk@rlk:shell$ cat ./test1.sh 
#!/bin/bash

temp=abcdef
echo "\${#parameter}=${#temp}"
rlk@rlk:shell$ 
rlk@rlk:shell$ ./test1.sh 
${#parameter}=6
  • ${#parameter}表示统计变量的字符长度(parameter表示变量名)

2.2、删除字符

2.2.1、从左边开始删除

rlk@rlk:shell$ cat test1.sh 
#!/bin/bash

temp=boyboygirlgirl

#从变量左边第一个字符开始匹配,按照最短匹配删除。当需要删除掉开头某几个字符时可以使用
echo "\${temp#boy}=${temp#boy}"
echo "\${temp#*boy}=${temp#*boy}"

#从变量左边第一个字符开始匹配,按照最长匹配删除,一般都是和*号一起使用。
#当需要删除掉开头的字符串,并且字符串的结尾是固定的
echo "\${temp##boy}=${temp##boy}"
echo "\${temp##*boy}=${temp##*boy}"
rlk@rlk:shell$ 
rlk@rlk:shell$ ./test1.sh 
${temp#boy}=boygirlgirl
${temp#*boy}=boygirlgirl
${temp##boy}=boygirlgirl
${temp##*boy}=girlgirl

2.2.2、删除开头字符串的使用场景:获取文件名

rlk@rlk:shell$ cat test.sh 
#!/bin/bash

temp=/mnt/hgfs/share_file_Ubuntu/shell/test.sh

#把最后一个斜杠之前的内容都删除,保留文件名
echo "\${temp##*/}=${temp##*/}"

#使用basename命令是同样的效果
basename ${temp}
rlk@rlk:shell$ 
rlk@rlk:shell$ ./test.sh 
${temp##*/}=test.sh
test.sh

2.2.3、从右边开始删除

rlk@rlk:shell$ cat ./test.sh 
#!/bin/bash

temp=boyboygirlgirl

echo ${temp}

echo "\${temp%girl}=${temp%girl}"
echo "\${temp%*girl}=${temp%girl}"
echo "\${temp%%girl}=${temp%%girl}"
echo "\${temp%%*girl}=${temp%%girl*}"
rlk@rlk:shell$ 
rlk@rlk:shell$ ./test.sh 
boyboygirlgirl
${temp%girl}=boyboygirl
${temp%*girl}=boyboygirl
${temp%%girl}=boyboygirl
${temp%%*girl}=boyboy

2.2.4、删除结尾字符串的使用场景:获取文件路径

rlk@rlk:shell$ cat ./test.sh 
#!/bin/bash

temp=/mnt/hgfs/share_file_Ubuntu/shell/test.sh

#把最后一个斜杠之前的内容都删除,保留文件名
echo "\${temp%*/}=${temp%/*}"

#使用dirname命令是同样的效果
dirname ${temp}
rlk@rlk:shell$ 
rlk@rlk:shell$ ./test.sh 
${temp%*/}=/mnt/hgfs/share_file_Ubuntu/shell
/mnt/hgfs/share_file_Ubuntu/shell

2.3、截取部分字符

rlk@rlk:shell$ cat test.sh 
#!/bin/bash

temp=1122boygirl

#省略截取长度,则是全部截取
echo "\${temp:3}=${temp:3}"

#指定截取长度
echo "\${temp:3:4}=${temp:3:4}"

rlk@rlk:shell$ 
rlk@rlk:shell$ ./test.sh 
${temp:3}=2boygirl
${temp:3:4}=2boy
  • 注意:第一个字符的下标是0

2.4、替换字符

rlk@rlk:shell$ cat test.sh 
#!/bin/bash

temp=boygirl@@boygirl778899

#只替换第一个
echo "\${temp/boy/girl}=${temp/boy/girl}"

#把匹配上的都替换掉
echo "\${temp//boy/girl}=${temp//boy/girl}"

#可以使用通配符,比如:把所有数字都用*替换
echo "\${temp//[0-9]/*}=${temp//[0-9]/*}"

rlk@rlk:shell$ 
rlk@rlk:shell$ ./test.sh 
${temp/boy/girl}=girlgirl@@boygirl778899
${temp//boy/girl}=girlgirl@@girlgirl778899
${temp//[0-9]/*}=boygirl@@boygirl******

补充:

  • 上面的变量子串,都有对应的命令来实现同样的功能,比如:basename、dirname、sed、awk等命令
  • 实现同样的功能,使用shell内置的特性比调用操作系统命令更快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值