一、脚本文件的生成
#!/bin/bash
操作命令
#注释
a、脚本文件的权限,要求脚本文件必须为具有可执行权限。
#chmod 755 脚本文件名
b、脚本文件的执行,要求脚本文件所在的路径应存在于$PATH路径中。如果不存在于该路径中,则脚本文件的执行方式为:#./脚本文件名
字符串替换命令
1、tr,常用于管道操作中。对输出内容的特定字符串进行替换。
#命令 | tr ‘原字符串’ ‘替换字符串’
#命令 | tr -d ‘待删除字符串’ -d删除字符串
2、按特定的字符串排序
#sort [-tkn ] 文件名
-t 设定字段分割符
-k 设定选取的字段
-n 使用数字排序
例:#cat /etc/passwd | sort -t : -k 3 -n
3、过滤重复的数据--uniq
uniq用于对输出内容中,相邻的、重复的数据进行过滤,仅保留其中一个。
#命令 | uniq
#命令 | uniq -c 对找到的行进行统计
如果登录的BASH超过10个,则将前10个登录shell修改为csh。
4、双重定向—tee
语法:tee将上一个文件的标准输出重定向到文件,并将标准输出传递给下一个命令。
例:#cut -d:-f 7 /etc/passwd | tee file1 | cat file1
5、xargs :是将第一个命令的输出结果交给xargs后所带的命令进行处理。
例:ls a* | tee file1 | xargs rm –t
例2:文件删除提示
read -p “请输入你要删除的文件:” A ;
ls $A | tee file1 | xargs rm –f | echo `cut file1`已被删除 | echo ‘ ’ > file1
二、结构化控制语句 -- 条件控制语句
1、if -- then --fi
语法:if 命令(如果命令的返回值为0,则执行then后的命令,否则、执行fi后的命令)
例:判断一个文件是否存在
#!/bin/bash
read -p “请输入你要查找的文件:” A
if ls $A
then echo “该文件存在”
exit 0
fi
exit 5
例2:判断一个用户是否存在
#!/bin/bash
read -p “请输入你要查找的用户账号:” A
if grep ^$A /etc/passwd
then echo “该用户存在”
exit 0
fi
exit 4
2、if – then -- else -- fi
语法:if 命令(如果命令的返回值为0,则执行then后的命令,否则、执行else后的命令)
例:文件创建脚本
#!/bin/bash
read -p “请输入你要创建的文件:” A
if ls $A
then echo “该文件已存在”
else
touch $A
fi
3、test判断
语法:test 判断条件(条件成立,则返回0,否则返回)
判断种类:
n1 -ge n2 ; n1 >= n2
n1 -le n2 ; n1 <= n2
n1 -ne n2 ; n1 不等于!= n2
n1 -gt n2 ; n1 > n2
n1 -lt n2 ; n1 < n2
例: #!/bin/bash
if test 6 -gt 7
then echo “ok”
else echo “error”
注:在if中可以将test替换为[ ]
语法:if [ 判断条件 ]
判断语句的符合检查条件
语法:if [ 判断条件 ] && [ 判断条件 ]
文件比较
-d file ;检查file文件是否存在并且是一个目录
-e file ;检查文件或目录是否存在(好用)
-f file ;检查文件是否存在,并且是一个文件
-r file ;检查文件是否存在,并且是否可读
-s file;检查文件是否存在,并且是否不为空
-w file;检查文件是否存在,并且是否可写入
-x file;检查文件是否存在,并且是否可执行
例:输入成绩在60以下为不合格,60~80之间为合格,成绩在80~90之间良好,90~100之间优秀,0以下或100以上胡扯;
#!/bin/bash
read -p “请输入成绩:” A
elif [ $A –lt 60 ] && [ $A –ge 0 ]
then echo “不及格”
elif [ $A –ge 60 ] && [ $A –le 80 ]
then echo “及格”
elif [ $A -ge 81 ] && [ $A –le 90]
then echo “良好”
elif [ $A –ge 91 ] && [ $A –le 100 ]
then echo “优秀”
fi
注L封口规则,有几个if 就要在后面加几个fi。elif除外,封口时用一个就ok )
if的新建特性
语法: if (( 数字表达式 ))
例:IP种类判别脚本
#!/bin/bash
A = `ifconfig eth0 | head –n 2 | tail –n 1 | cut –d : -f2 | cut –d ‘ ’ –f 1`
if (( $A >= 192 && $A <= 223 ))
then echo “C类IP”
elif (( $A <= 191 && $A >= 127 ))
then echo “B类IP”…………fi
三、列表定义 – case
语法:case 变量名 in
变量值1 | 变量值2 )
命令1
……
变量值n | 变量值n* )
命令n
esac
例:#!/bin/bash
read –p “where are you from :” A
case $A in
beijing | shanghai )
echo “你住502房间” ;;
shanxi | hebei )
echo “你住在505” ;;
guangdong | henan )
echo “你住在510房间”
esac
四、循环命令 – for
for 用于创建一个值列表实现重复循环,每次循环使用值列表的一个值
语法:for 变量名 in 变量值列表
do
命令1
……
命令N
done
例:判断根目录下哪些是文件哪些是目录
#!/bin/bash
for file in /boot/*
do
if [ -d $file ]
then
echo “ $file is a directary”
elif [ -f $file ]
then
echo “is file”
fi
done
C式for循环
语法:for (( 变量名=变量值 ;匹配条件;变量操作))
do
命令1
done
例:打印100个数
#!/bin/bash
for (( A=0;A<=100;A++))
do
echo $A
done
注:A=0(定义变量)A<=100(循环体执行条件) A++(变量操作)
for的嵌套循环
例: 打印九九乘法表
#!/bin/bash
for (( L=1;L<=9;L++))
do
echo “$L* $R=`echo $[$L*$R]`”
done
done
例2、打印三角形
#!/bin/bash
for ((h=1;h<=10;h++))
do
for ((sn=1;sh*2-1>=sn;sn++))
do
s=“$s `echo 0 `”
done
echo $s s=
done
五、while 循环
语法:while test判断(当test命令的返回值为“0”时执行循环体)
do
命令
done
While语句允许定义多条命令,每次循环均执行这些命令
例:#!/bin/bash
var1=10
while echo $var1
[ $var1 –ge 0 ]
do
echo “This is ”
var1=$[$var1-1]
done
六、until循环
语法:until test(当test命令返回值为非0时执行循环体)
do
命令
done
例:打印100个数
#!/bin/bash
var1=100
until [ $var1 –eq 0 ]
do
echo $var1
var1=$[$var1-1]
done
Shell脚本示例
例1、while循环体,以特定的格式输出系统中的用户,第一个用户是root,第二个用户是……
#!/bin/bash
while [ $n -le 1]
do
for test in `cut -d: -f1 /etc/passwd`
do
echo “第$n个用户是:” $test
n=$[$n+1]
done
done