字符串的截取(相当于一种运算,在原有变量的基础上获得新的结果,不会改变原来的变量的值):
a=abcd
#这个变量里可以是数字也可以是字符
echo ${a:1:1}
#从a这个变量的第二位开始截取(第一位是0,如果从第一位开始截取0可以省略不写),只截取1位
#输出结果就是b
可以与RANDOM连用,比如:
a=1234abcd
b=$[ RANDOM%8 ]
#这是1-7的随机数,因为你截取的变量长度是0-7
echo ${a:b:1}
#随机截取1位
脚本示例:
a=1234567abcdefg
for i in {1..8}
do
b=$[ RANDOM%14 ] #0-13之间的数
bb=${a:b:1} #从a这个变量里的字符串截取,从b位开始截,只截1个
c=$c$bb #变量c等于取c和b的组合
done
echo $c
#最后这个c就可以用做随机密码
用bash去执行这个脚本,如果用source的话,变量会存在当前环境中
字符串替换(相当于一种运算,在原有变量的基础上获得新的结果,不会改变原来的变量的值):
a=aabbcc
#这个变量里可以是数字也可以是字符
单项置换:
echo ${a/aa/88}
输出88bbcc
#把a变量中的aa的内容替换成88,这个替换默认只换第一个匹配到的部分
echo ${a/a/8}
输出8abbcc
echo ${a/a/}
输出abbcc
多项置换:
echo ${a//b/8}
输出aa88cc
#//的写法就是全匹配,只要b全替换成8
字符串删除(相当于一种运算,在原有变量的基础上获得新的结果,删除和替换为空是不一样的,不会改变原来的变量的值)
从左往右删除:
#!/bin/bash
a=root:x:0:0:root:/root :/bin/bash
echo ${a#root}
#这里的#代表从左往右删除,删除第一个匹配项,删除的是a这个变量里的第一个root,此时并不会改变变量a本身的值
输出
:x:0:0:root:/root:/bin/bash
echo ${a##*root}
#这里的##代表从左往右删除,删除变量a中的所有root及它前面的内容,必须写*,不然到:root它就识别不了了,它会认为:root是一个整体,而不是root,此时并不会改变变量a本身的值
输出
:/bin/bash
echo ${a##* }
#把空格以前的内容全删了
从右往左删除:
#!/bin/bash
a=`head -1 /etc/passwd`
echo $a
输出
root:x:0:0:root:/root:/bin/bash
echo ${a%bash}
#删a里的第一个bash,从右往左删
echo ${a%%:*}
#一直删a里的最后一个:及它后面的内容,因为从右开始删,所以*在后
脚本示例:
我们先创建3个文件
touch test{1..3}.txt
需求:通过脚本的方式将这3个文件的扩展名改为doc
#!/bin/bash
for i in `ls *.txt` #假如我们有一万个txt结尾的文件,甚至更多,我们不确定数量的情况
do
mv $i ${i%txt}doc #这种是删除,还可以用替换,就是 mv $i ${i/txt/doc}
done
变量定义初值:
a=
#先定义一个空变量
echo {a:-123}
#给这个变量定义一个初始值,假如这个变量里的值为空,则这次会输出123,有值则输出a原本的值
通常初值可以被用做位置变量,当用户执行脚本没有输入位置变量时,可以用初值替换
示例:
#!/bin/bash
read -p "请输入用户名" u
useradd $u
read -p "请输入密码,如果不输入则自动生成初始密码" p
echo ${p:-123} | passwd --stdin $u
8.操作Shell中变量的字符串截取、替换、删除
于 2024-09-25 15:03:42 首次发布