shell 脚本编程
一、字符串处理
1.字符串截取及切割
1)子串截取
子串截取的三种用法:
应用:隐藏身份证后6位;做验证码a=’0123456789‘ 随机截取四位数字;给电脑配随机密码,每次取四位,用for循环;
(1)KaTeX parse error: Expected 'EOF', got '#' at position 39: …始计位数) #̲phone='15170016…{phone:0:4} = echoKaTeX parse error: Expected 'EOF', got '#' at position 41: …0可以省略 #̲ echo{#phone} 显示11 /加#号统计这个变量有多少位
#echo p h o n e : 3 : 4 显 示 7001 / 从 第 几 位 开 始 截 几 位 ( 2 ) e x p r s u b s t r " {phone:3:4} 显示 7001 /从第几位开始截几位 (2)expr substr " phone:3:4显示7001/从第几位开始截几位(2)exprsubstr"phone" 起始位置 长度 (从1开始计位数)
#expr substr “$phone” 4 4 显示7001 /双引号
(3)echo $phone | cut -b 起始位置-结束位置 (从1开始计位数)
# echo $phone | cut -b 4-7 显示7001
# echo $phone | cut -b 4,5,6,7 显示7001
########################################
随机提取1位字符
#!/bin/bash
ID=‘0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM’
(echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲ID} 62) num=[RANDOM%62] 0-61 /取的值不能超过ID最高位数,取余数里余数永远小于除数。
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {ID:num:1} /
num=$[RANDOM%62+1] 1-62
echo $ID | cut -b n u m e x p r s u b s t r “ num expr substr “ numexprsubstr“ID” $num 1
2) 子串替换
( vim :s/老/新/g
vim末行模式常用操作:
?/old/new ,替换当前行第一个“old” ?/old/new/g ,替换当前行所有的“old”
:n,m s/old/new/g ,替换第n-m行所有的“old” :% s/old/new/g ,替换文件内所有的“old”
:w /root/newfile ,另存为其它文件 :r /etc/filesystems ,读入其他文件内容 :set nu|nonu ,显示/不显示行号 :set ai|noai ,启用/关闭自动缩进 )
echo ${phone/老/新}
echo ${phone/6034/}
echo ${phone/1/} /单斜线只替换第一个匹配值
echo ${phone//1/9} /双斜线替换所有匹配值
########################################
编写脚本:批量修改扩展名txt 改成 doc 提示:循环,掐头去尾
前奏准备:mkdir /test touch /test/{a.txt,b.txt,c.txt,d.txt}
for I in $(ls /test/.txt)
do
echo ${i/.txt/.doc} / 从左往右,要确保只有一个.txt
done
或
for I in $(ls /test/.txt) /可以把.txt改成$1,.doc改成 2 , 把 常 量 换 成 变 量 d o x x = 2,把常量换成变量 do xx= 2,把常量换成变量doxx={i%.} /删除从右往左第一个点后所有
mv $i $xx.doc
done
########################################
3)按条件掐头去尾
#掐头:从左向右删; %去尾 从右向左删
head -1 /etc/passwd A=‘root❌0:0:root:/root:/bin/bash’
echo ${A#:} /把第一个冒号前面的任意删除
echo ${A##:} /把所有冒号前面的任意删除
echo ${A%%:*} /把所有冒号后面的任意删除
字符串的匹配删除
basename /a/c/b.txt 掐头 = ${A##/}
dirname /a/c/b.txt 去尾 = ${A%/}
2.变量初始值处理
1)只取值,${var:-word}
若变量var已存在且非Null,则返回 v a r 的 值 ; 否 则 返 回 字 串 “ w o r d ” , 原 变 量 v a r 的 值 不 受 影 响 。 2 ) 取 值 + 赋 值 , var 的值;否则返回字串“word”,原变量var的值不受影响。 2)取值+赋值, var的值;否则返回字串“word”,原变量var的值不受影响。2)取值+赋值,{var:=word}
若变量var已存在且非Null,则返回 $var 的值,原变量值不变;否则返回字串“word”,并将此字串赋值给变量 var。
#echo ${TT:-hehe}
########################################
例:密码为空,自动给初始密码
read -p “请输入用户名:” user
read -p “请输入密码:” pass
[ -z KaTeX parse error: Expected 'EOF', got '&' at position 9: user ] &̲& exit p…{pass:-123456}
useradd KaTeX parse error: Expected 'EOF', got '&' at position 8: user &̲>/dev/null ec…p“ | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 8: user &̲>/dev/null 或e…{pass:-123456}“ | passwd --stdin $user &>/dev/null
########################################
求和 1+2+3+4…+100 (5050)
sum=0
for I in {1…100}
do
sum=$[sum+i]
echo KaTeX parse error: Expected 'EOF', got '#' at position 10: sum done #̲###############…{num:-100}
sum=0
for I in seq $num
do
sum=$[sum+i]
done
二、扩展的脚本技巧
1.使用shell数组
建立数组的方法:
格式1,整体赋值:数组名=(值1 值2 … … 值n)
格式2,单个元素赋值:数组名[下标]=值
查看数组元素的方法:
获取单个数组元素: 数 组 名 [ 下 标 ] 获 取 所 有 数 组 元 素 : {数组名[下标]} 获取所有数组元素: 数组名[<