shell脚本基础
---恢复内容开始---
首先学习赵文宇的总结脚本:
1.变量
HOST=$(/bin/hostname) //将()里的命令执行后的结果赋值给HOST变量
HOST=`/bin/hostname` //将反引号里面的执行结果赋值给HOST变量
${a}aaa变量a
export a //将本地变量a变成环境变量在子bash也可用
$PATH //路径变量 PATH=$PATH:/$HOME/bin 增加路径
$$ //显示当前的进程号
$PPID // 父进程号
$USER // 当前用户
$UID //当前用户的UID
$HOSTNAME //当前的主机名
$1 $2 $3 $4.... // 要传递的参数
shift //将参数向前移动一位
$0 //当前的脚本的名称
$# //要传递参数的个数
${!a} //间接取变量a值
$@和$* //所有的位置参数 区别$@最好用双引号$*最好不要用双引号
“$@” //能包括空行 “$*” 所有的参数当成一个看待
for i 相当于for i in “$@”
$RANDOM //随机数
$? // 返回值
2.echo
echo $? // 对上一次命令执行成功与否成功$?为0
3.if等一些需要条件判断的语句
(1)判断文件是否存在且是否为文件
[ -f file ]
判断文件是否存在且是否为可写文件
[ -w file ]
判断文件是否存在且是否为可执行文件
[ -x file ]
判断文件是否存在且是否为可读文件
[ -r file ]
判断文件是否存在且是否为目录文件
[ -d file ]
判断文件是否存在且是否为空文件
[ -s file ]
判断文件是否存在
[ -e file ]
[]和 test功能一样 -a和-o(和,或)
(2)整数值比较判断
[ -eq ]
[ "$a" = "0" ]
(( a % 2 == 0 ))
注意:(( a == 50 )) 数值的比较,在(())里用不用$都一样
[ -n string ] //string 的长度大于0
[ -z string ] //string 的长度为0
string1=string2 //字符串相等
string1!=string2 //字符串不相等
[ int1 -gt int2 ] //int1>int2 greater than
[ int1 -ge int2 ] //int1>=int2 greater equal
[ int1 -eq int2 ] //int1=int2 equal
[ int1 -ne int2 ] //int1!=int2 not equal
[ int1 -le int2 ] //int1<=int2 less equal
[ int1 -lt int2 ] //int1<int2 less than
(3)符串比较
[ "$a" = "$b" ]
[ -n "$a" ]和 [ "$a" ]一样 判断字符串$a是否为空
[[ "$a" == *"redhat"* ]]和[[ "$a" = *"redhat"* ]]判断-在$a中是否含有redhat字符串
(4)if后接的是命令 &&和||
if rpm -q gcc && id tom||echo "sss" // &&如果前面的命令执行成功则执行&&后的命令否则执行||后面的命令
4.sed
sed -ri /^#ServerName.*:80$/s/^#// /etc/selinux/config //找出/etc/seliunx/config文件中以#ServerName开头以:80结尾的行并将#替换成空白
5.
df -Th|grep "/$"|awk '{print $6}'|sed 's/%//' //df后截取某个字段并替换
6.数学运算
将运算的结果赋值给一个变量
declare -i c=10+20
c=$[ a+b ]
c=$(( a+b ))
(( c=a+b ))
let c=a+b
能输出结果
expr 1 + 1
7.echo
交互模式可以用管道或重定向传值
echo "scale=2;10/3"|bc // 计算10/3的值
echo "3.14 > 3.15" | bc //正确输出1
echo "123"|read a
echo -e //后面的字符启用转义
echo -n //输出不换行
8.read
注意:每一行的输入以空格结尾
read -s a //读入时不显示输入
read -p " 提示语言" a //设置有提示语言
read -t 3 a //设置3秒不给a赋值脚本继续执行
read a b <file1 //没有循环 将第一个字段赋值给a,第二个字段赋值给b
例子:
cat file1
a1 tom a1
a2 jerry aa
a3 mike a34
read a b c <file1
此时 a=a1 b=tom c=a1
9.注意:grep awk sed 是基于正则表达式设计的
用双引号将正则表达式引起来:
^ 行首定位符 ^love 匹配所有以love开头的行
$ \行尾定位符love$匹配所有以love结尾的行
. 单个任意字符l..e匹配以l开始后跟两个字符再跟一个e的字符串
* 重复0到多个星号前面的字符a* 匹配0个或多个a的字符串
[] 匹配一组字符的任意一个[Ll]ove 匹配Love或love的字符串
[x-y] 匹配制定范围的一个字符[A-Z]ove匹配大写字符开头后跟ove的字符串
[^] 匹配不在指定组内的字符;[^A-Z]配不是大写字母的任意字符
\ 转义字符用来转义元字符love\.匹配love后跟一个.的字符
! 取反
+ 表示一个或多个 xyz+ 一个或多个z
? 表式0个或一个xyz? 0个或一个z
RE元字符
\< 词首定位符\<love //匹配love开头的词
|> 词尾定位符love\> //匹配love结尾的词
\<bin\> //匹配一个单词
\(..\) //给匹配的字符打上标签(lov)able\1er/ 模式lov被保存为标签1用\1表示
查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover
x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
o{5,10} 匹配包含5~10个o的字符串
(1)sed
sed //循环 一行一行的处理文件 行处理
sed -n '/abc/p' file // 默认会打印模式空间的内容,行中匹配abc的打印出来
-r 支持扩展分割符
-n 不让他默认打印模式空间
sed root@10.0.2.253 sed 's/abc/def' file //远程登录后修改file里的内容
sed -n '5p' file // 把第五行打印出来
sed -n '$p' file // 把最后一行打印出来
sed -n '1,3p' file // 把一到三行打印出来
sed -n '1,~3p' file // 从第一行开始打印三行
sed -i '3i aaaaaaa' file // 在第三行的前面加上aaaaaaa
sed -i '$a aaaaa' file // 在最后行加入aaaaa
sed -i '/^tom/i aaaaaa' file // 在以tom开头的行前一行加上aaaaaa
sed -i 's/abc/def/' file // 改每一行的第一个abc成def
sed -i 's/abc/def/g' file // 改每一行的所有abc成def
sed -i 's/abc/def/3' file // 改每一行的第三个abc成def
sed -i '1,2s/abc/def/' file // 改一到两行abc成def
s 换匹配的字段 c换匹配的行
sed -i '1,2s/^.*$/def/' file // 改一到两行成def
sed -i '4c aaaaaaaaa' file // 把第四行改为aaaaaaaa
sed -i '/^SELINUX/c selinux ' // 把所有以SELINUX开头的行改为selinux
sed -i '4d' // 把第四行删除
sed -i '/^tom/d' file // 删除以tom开头的所有行
sed -i '/^$/d' file // 删除空行
sed -i '/^\s$/d' file // 删除开头为空行\s表示空格或tab
sed -i '/^abc/s/tom/jerry/' file // 先找到以abc开头的行将这一行的tom改为jerry
sed -i '/^mike/s/^/#' file // 将mike行注释
sed -n '1p; 3p' file // 打印第一行和第三行
sed -i -e '1s/jerry/tom/; -e 3s/mike/xyz/' file // 多条一起执行用-e
sed -i '/abc/,/^def/s/123/456/' file // 将abc开头的行和def开头的行之间的行的123改>为456
sed -n '1,/def/p' file // 从第一行开始直到碰到def的行全部打印出来
(2)awk
awk // 按行处理行里字段 循环命令,默认以空格作为分割符 默认打印整行$0 -F分割符 制定分割符
awk 'BEGIN{print "aaaa"}/tom/{print $2}END{print "bbbbbbb"}' file1 //先执行BEGIN里的语句 从文件中读取第一行是否匹配/tom如果有则执行没有就不执行直到读,完后再运行END的语句 可以选用BEGIN 匹配项 ENG。
awk 'NR==2{print $2}' file // NR是行号 NF字段数
awk 'NR==2||NR==4{print $2}' file // 只读两个固定的行号
awk '{print $0}' file // $0表示 整个行
awk 'BENGIN{FS=":" OFS=" "}/bash$/{print $0}' file //FS 指定了分割符:OFS 指定了输出的字段分割符,tr ":" "" 将冒号改为空格
awk -F: -v v1=$a '$1~^v1' file //打印出以变量a开头的行
awk -F: '{if($1~/^root/)print $1}' file // 打印出第一个字段以root开头的行的第一个字段
10.for循环
for 遇空格或回车算一次
for i in {1..10} //{1..10}相当于1 2 3 4 5 6 7 8 9 10
seq 2 2 10 //从2到10 每隔一个取一个数
11.while循环
语法结构:while ((i<=10));do
例子:
while [$a ];do //相当于while [ -n $a ] do while [ 1 ] do 死>循环
cat file|while read a b c;do //每次读一行文件将参数(以空格分割)分别赋值
---恢复内容结束---
首先学习赵文宇的总结脚本:
1.变量
HOST=$(/bin/hostname) //将()里的命令执行后的结果赋值给HOST变量
HOST=`/bin/hostname` //将反引号里面的执行结果赋值给HOST变量
${a}aaa变量a
export a //将本地变量a变成环境变量在子bash也可用
$PATH //路径变量 PATH=$PATH:/$HOME/bin 增加路径
$$ //显示当前的进程号
$PPID // 父进程号
$USER // 当前用户
$UID //当前用户的UID
$HOSTNAME //当前的主机名
$1 $2 $3 $4.... // 要传递的参数
shift //将参数向前移动一位
$0 //当前的脚本的名称
$# //要传递参数的个数
${!a} //间接取变量a值
$@和$* //所有的位置参数 区别$@最好用双引号$*最好不要用双引号
“$@” //能包括空行 “$*” 所有的参数当成一个看待
for i 相当于for i in “$@”
$RANDOM //随机数
$? // 返回值
2.echo
echo $? // 对上一次命令执行成功与否成功$?为0
3.if等一些需要条件判断的语句
(1)判断文件是否存在且是否为文件
[ -f file ]
判断文件是否存在且是否为可写文件
[ -w file ]
判断文件是否存在且是否为可执行文件
[ -x file ]
判断文件是否存在且是否为可读文件
[ -r file ]
判断文件是否存在且是否为目录文件
[ -d file ]
判断文件是否存在且是否为空文件
[ -s file ]
判断文件是否存在
[ -e file ]
[]和 test功能一样 -a和-o(和,或)
(2)整数值比较判断
[ -eq ]
[ "$a" = "0" ]
(( a % 2 == 0 ))
注意:(( a == 50 )) 数值的比较,在(())里用不用$都一样
[ -n string ] //string 的长度大于0
[ -z string ] //string 的长度为0
string1=string2 //字符串相等
string1!=string2 //字符串不相等
[ int1 -gt int2 ] //int1>int2 greater than
[ int1 -ge int2 ] //int1>=int2 greater equal
[ int1 -eq int2 ] //int1=int2 equal
[ int1 -ne int2 ] //int1!=int2 not equal
[ int1 -le int2 ] //int1<=int2 less equal
[ int1 -lt int2 ] //int1<int2 less than
(3)符串比较
[ "$a" = "$b" ]
[ -n "$a" ]和 [ "$a" ]一样 判断字符串$a是否为空
[[ "$a" == *"redhat"* ]]和[[ "$a" = *"redhat"* ]]判断-在$a中是否含有redhat字符串
(4)if后接的是命令 &&和||
if rpm -q gcc && id tom||echo "sss" // &&如果前面的命令执行成功则执行&&后的命令否则执行||后面的命令
4.sed
sed -ri /^#ServerName.*:80$/s/^#// /etc/selinux/config //找出/etc/seliunx/config文件中以#ServerName开头以:80结尾的行并将#替换成空白
5.
df -Th|grep "/$"|awk '{print $6}'|sed 's/%//' //df后截取某个字段并替换
6.数学运算
将运算的结果赋值给一个变量
declare -i c=10+20
c=$[ a+b ]
c=$(( a+b ))
(( c=a+b ))
let c=a+b
能输出结果
expr 1 + 1
7.echo
交互模式可以用管道或重定向传值
echo "scale=2;10/3"|bc // 计算10/3的值
echo "3.14 > 3.15" | bc //正确输出1
echo "123"|read a
echo -e //后面的字符启用转义
echo -n //输出不换行
8.read
注意:每一行的输入以空格结尾
read -s a //读入时不显示输入
read -p " 提示语言" a //设置有提示语言
read -t 3 a //设置3秒不给a赋值脚本继续执行
read a b <file1 //没有循环 将第一个字段赋值给a,第二个字段赋值给b
例子:
cat file1
a1 tom a1
a2 jerry aa
a3 mike a34
read a b c <file1
此时 a=a1 b=tom c=a1
9.注意:grep awk sed 是基于正则表达式设计的
用双引号将正则表达式引起来:
^ 行首定位符 ^love 匹配所有以love开头的行
$ \行尾定位符love$匹配所有以love结尾的行
. 单个任意字符l..e匹配以l开始后跟两个字符再跟一个e的字符串
* 重复0到多个星号前面的字符a* 匹配0个或多个a的字符串
[] 匹配一组字符的任意一个[Ll]ove 匹配Love或love的字符串
[x-y] 匹配制定范围的一个字符[A-Z]ove匹配大写字符开头后跟ove的字符串
[^] 匹配不在指定组内的字符;[^A-Z]配不是大写字母的任意字符
\ 转义字符用来转义元字符love\.匹配love后跟一个.的字符
! 取反
+ 表示一个或多个 xyz+ 一个或多个z
? 表式0个或一个xyz? 0个或一个z
RE元字符
\< 词首定位符\<love //匹配love开头的词
|> 词尾定位符love\> //匹配love结尾的词
\<bin\> //匹配一个单词
\(..\) //给匹配的字符打上标签(lov)able\1er/ 模式lov被保存为标签1用\1表示
查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover
x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
o{5,10} 匹配包含5~10个o的字符串
(1)sed
sed //循环 一行一行的处理文件 行处理
sed -n '/abc/p' file // 默认会打印模式空间的内容,行中匹配abc的打印出来
-r 支持扩展分割符
-n 不让他默认打印模式空间
sed root@10.0.2.253 sed 's/abc/def' file //远程登录后修改file里的内容
sed -n '5p' file // 把第五行打印出来
sed -n '$p' file // 把最后一行打印出来
sed -n '1,3p' file // 把一到三行打印出来
sed -n '1,~3p' file // 从第一行开始打印三行
sed -i '3i aaaaaaa' file // 在第三行的前面加上aaaaaaa
sed -i '$a aaaaa' file // 在最后行加入aaaaa
sed -i '/^tom/i aaaaaa' file // 在以tom开头的行前一行加上aaaaaa
sed -i 's/abc/def/' file // 改每一行的第一个abc成def
sed -i 's/abc/def/g' file // 改每一行的所有abc成def
sed -i 's/abc/def/3' file // 改每一行的第三个abc成def
sed -i '1,2s/abc/def/' file // 改一到两行abc成def
s 换匹配的字段 c换匹配的行
sed -i '1,2s/^.*$/def/' file // 改一到两行成def
sed -i '4c aaaaaaaaa' file // 把第四行改为aaaaaaaa
sed -i '/^SELINUX/c selinux ' // 把所有以SELINUX开头的行改为selinux
sed -i '4d' // 把第四行删除
sed -i '/^tom/d' file // 删除以tom开头的所有行
sed -i '/^$/d' file // 删除空行
sed -i '/^\s$/d' file // 删除开头为空行\s表示空格或tab
sed -i '/^abc/s/tom/jerry/' file // 先找到以abc开头的行将这一行的tom改为jerry
sed -i '/^mike/s/^/#' file // 将mike行注释
sed -n '1p; 3p' file // 打印第一行和第三行
sed -i -e '1s/jerry/tom/; -e 3s/mike/xyz/' file // 多条一起执行用-e
sed -i '/abc/,/^def/s/123/456/' file // 将abc开头的行和def开头的行之间的行的123改>为456
sed -n '1,/def/p' file // 从第一行开始直到碰到def的行全部打印出来
(2)awk
awk // 按行处理行里字段 循环命令,默认以空格作为分割符 默认打印整行$0 -F分割符 制定分割符
awk 'BEGIN{print "aaaa"}/tom/{print $2}END{print "bbbbbbb"}' file1 //先执行BEGIN里的语句 从文件中读取第一行是否匹配/tom如果有则执行没有就不执行直到读,完后再运行END的语句 可以选用BEGIN 匹配项 ENG。
awk 'NR==2{print $2}' file // NR是行号 NF字段数
awk 'NR==2||NR==4{print $2}' file // 只读两个固定的行号
awk '{print $0}' file // $0表示 整个行
awk 'BENGIN{FS=":" OFS=" "}/bash$/{print $0}' file //FS 指定了分割符:OFS 指定了输出的字段分割符,tr ":" "" 将冒号改为空格
awk -F: -v v1=$a '$1~^v1' file //打印出以变量a开头的行
awk -F: '{if($1~/^root/)print $1}' file // 打印出第一个字段以root开头的行的第一个字段
10.for循环
for 遇空格或回车算一次
for i in {1..10} //{1..10}相当于1 2 3 4 5 6 7 8 9 10
seq 2 2 10 //从2到10 每隔一个取一个数
11.while循环
语法结构:while ((i<=10));do
例子:
while [$a ];do //相当于while [ -n $a ] do while [ 1 ] do 死>循环
cat file|while read a b c;do //每次读一行文件将参数(以空格分割)分别赋值
浙公网安备 33010602011771号