shell脚本-下篇
shell脚本:
接着上篇的内容所写,若需查看上篇,点击跳转:shell脚本-上篇
脚本定义配置文件:
获取文件内容和变量,主要是函数、变量
例:
echo aa=1234 > file1
vim ts.sh
#!/bin/bash
. file1
echo $aaa
数组:
索引:
索引的编号从0开始,属于数值索引,也叫下标
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)
数组引用:
a=("qq" "ww" "321")
${a[0]} #取下标为0的值,也就是"qq"
数组声明:
declare -a 数组名
declare -A 数组名 关联数组,也是键值对(必须先声明才能使用)
普通数组赋值:
a[0]="name"
a=("one" "two" three" ...)
a=([0]="one" [3]="three" [4]="four" ...)
read -a 参数 #交互式传参
file=(*.txt) #把当前目录下.txt文件加入数组
num=({1..10})
关联数组赋值:
declare -A 数组名
a=([键]="值" [键]="值" ...)
declare -A name
name[a]=aaa
name[b]=bbb
显示数组中所有值:
${a[*]}
${a[@]}
统计数组长度:
${#a[*]}
${#a[@]}
数组切片:
${a/[*]:起:止} #止位可省略
例:
a=(1 e r a g 5)
${a[*]:2:3} #从第二位取值,到后3位
追加/删除:
a[${#a[*]}]=value
unset a[0]
字符处理:
示例: user=abcdef12345abc456
取字符长度:
${#user}
切片:
${user:起:止} #正向取,左→右
${user: -起:止} #反向取,左←右,“-”前面必须空格
${user: -3:-2}
取子串: #支持通配符
${user#a?d} 删除a-d的字符,最短距离匹配,显示剩余的字符
#显示结果: ef12345abc456
${user##a*c} 删除a-c的字符,最长距离匹配
#显示结果: 456
${user%a*} 左←右,删除a以后的字符,最短匹配
#显示结果: abcdef12345
${user%%12*} 删除12以后字符,最长匹配
#显示结果: abcdef
替换查找:
${user/abcd/ABCD} 查找user中的字符串,第一次匹配到abcd的地方替换成ABCD
${user//abc/ABC} 所有匹配到abc的地方替换成ABC
${user/#abc/ABC} 行首是abc的替换成ABC
${user/%456/123} 行尾是456的替换成123
查找删除:
${user/abc} 删除第一次匹配到的abc
${user//abcd} 删除所有匹配abc
${user/#abcd} 删除行首匹配abcd
${user/%abcd} 删除行尾匹配的abcd
大小写转换:
$[user^^} 所有字符转大写
${user,,} 所有字符转小写
变量赋值:
${user:~abc} 如果user为空或为设置,返回abc;否则返回user内容;
${usr:=abc} 如果usr为空或未设置,返回abc,并把abc赋值给usr;否则返回usr值
${usr:+abc} 如果usr不空,返回值为abc
${usr:?info} 如果usr为空,返回info(按错误流处理);否则返回usr
循环语句:
列表生成:
{1..10}
$(seq 起 步长 止) #止位必须有
ls /var/*` 通配符列表
for:
for语法1:
for i in {1..254} ;do
{ ping -c 1 1.1.$i }$
done
wait #等待所有进程结束,sleep是等待一个进程结束
for语法2:
for ((i=1,j=0;i<=100;i++)) ;do
let j+=i
echo $j
done
while:
while true; do
命令
done
while read:
vim xx
12 45 56
23 64
vim ts.sh
#!/bin/bash
while read a b c; do
echo $a $c
done < xx #用于逐行读取,只有一个变量时输出一整行,多个变量时,每个变量对应文件一行一列字符
bash ts.sh
until:
until false; do
...
done
select:
说明:
- 默认存在两个自带的变量:PS3、REPLY
- select循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示PS3提示符,等待用户输入
- 用户输入菜单列表中的某个数字,执行相应的命令
- 用户输入被保存在内置变量 REPLY 中
- select是个无限循环,因此要用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c退出循环
- select 经常和 case 联合使用
- 与for循环类似,可以省略in list, 此时使用位置参量
vim ts.sh
#!/bin/bash
PS3="请输入名称: " #PS3变量用于指定提示符
select name in qq ww ee; do
case $REPLY in #REPLY变量用于存标准输入
1)
echo $REPLY #输出qq
;;
2)
echo $REPLY #输出ww
;;
3)
echo $REPLY #输出ee
;;
*)
break
;;
esac
done

浙公网安备 33010602011771号