1、实现一个shell脚本,添加一个名为zhangsan的用户;将用户zhangsan的口令设置为123456
addUser.sh:
#!/bin/bash
#2013-11-26 by cahijq
echo”add a user”
useradd zhangsan
echo”add password”
echo 123456|passwd --stdin zhangsan
echo “ add successful’
2、运行一个shell脚本的方法:
方法一:chmod +x uad.sh 添加执行权限
./uad.sh 打开一个子shell,读取并且执行uad.sh里面的命令。
方法二:sh uad.sh 以指定的bashshell来执行脚本。文件不必有执行权限。脚本也是在子shell中执行。
方法三: source uad.sh等同于. uad.sh 以环境默认的shell来执行脚本。文件不必有执行权限
3、Shell重点知识
(1)管道:“|”:将一个命令的输出结果当作另一个命令的输入参数
(2)find ,ps,grep,uname,env,who ,wc
(3)重定向:改变执行命令的默认输出和默认输入。
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定文件输入数据,而不是从键盘。 |
重定向输出 | >,>> | 将输出结果覆盖,追加到指定文件,而不是控制台。 |
标准错误输出 | 2>,2>> | 将错误信息追加,覆盖到指定文件。 |
混合输出 | &>,&>> | 将输出和错误信息都重定向到指定文件,覆盖,追加文件。 |
(4)逻辑分割:
处理多条命令之间的逻辑关系:
逻辑与:&& 两个命令都要执行成功,才算成功。若第一条命令执行失败,则必定失败,第二条命令就不会执行。
逻辑或:||两个命令有一个执行成功,就算成功。所以若第一条命令执行成功,则就算成功。
顺序执行:;
4.shell变量
变量定义和赋值:变量名=变量值
引用变量:${}或者$。
“”:可以使用引用和转义
‘’:不可以使用引用和转义
` `或者$():以命令输出和代替。
常见的环境变量
系统赋值:USER,LOGNAME,HOME,SHELL……
用户操作:PATH,LANG,CLASSPATH……
由系统或脚本操控,不可直接赋值
$?:前一条命令的状态值,0为正常、非0异常
$0:脚本自身的程序名
$1-$9:第一-第九个参数位置
$*:命令行的所有位置参数的内容
$#:命令行的位置参数个数
5、shell数值运算
(1)整数运算
使用expr命令,计算表达式
格式:expr 数值1 操作符 数值2
使用$[]表达式,算式替换
格式:$[数值1 操作符 数值2]
操作符 *号不能直接用,因为*在shell环境中是通配符所以要转义\*。Shel环境是指shell参数或者shell脚本的内容编写环境。
(2)运算技巧
递更技巧:let 变量名++;let 变量名—
随机数变量:random;范围 0—327672^15 -1
生成数字序列:seq 首数,尾数 seq 首数,增量,尾数
echo “scale=4; 10/3”|bc scale=4是约束小数位数。
6.shell变量类型
6、shell字符串操作
(1)字符串截取
路径分割: dirname:截取路径名;basename:截取文件名
expr命令:expr substr $变量名 起始位置 截取长度(起始位置从1开始算)
使用${}: ${变量名:起始位置,截取长度}(起始位置从0开始)
(2)字符串替换
${变量名/i/j}把字符串中的第一个i替换成j
${变量名//i/j}把字符串里面的所有i替换成j
(3)获得随机字符串
head -1 /dev/urandom |md5sum|cut –b -8
原理:/dev/urandom里面会有随机字符,但是有可能我们不能识别里面的字符,md5sum可以根据ascii 码生成相应字符的校验和,cut命令截取校验和的一部分。
7、shell条件测试
条件测试格式:
[ 条件表达式] 或者test 条件表达式
测试操作的练习方法:
可以在上面两种格式的任一种格式后面加&& echo yes
文件状态的检测:
-e 文件是否存在
-d 是否是目录
-f 是否是文件
-r 是否有读取权限
-w 是否有写入权限
-x 是否有执行权限
整数值比较和字符串的匹配
-eq 是否相等
-ne 是否不相等
-gt 是否大于
-lt 是否小于
-ge 是否大于等于
-le 是否小于等于
= 两个字符串是否相等
!= 两个字符串是否不相等
8.shell if判断结构
(1)程序流的控制
for
if 用于条件判断逻辑控制
case 用于值判断逻辑控制
(2)单分支/双分支的if应用
单分支if应用示例
检查备份目录/opt/mrepo,若不存在则创建
chkdir.sh
#!/bin/bash
BACKUP_DIR=”/opt/mrepo/”
if [! –d $BACKUP_DIR]
then
mkdir –p $BACKUP_DIR
fi
双分支应用示例
判断目标主机是否存活,显示检测结果
chkhost.sh
#! /bin/bash
ping –c 3 –I 02 –w 3 $1 &> /dev/null
if [$? -eq 0]
then
echo “Host $1 isup.”
else
echo “Host $1 is down.”
fi
(3)多分支的if应用
if 条件测试1
then 命令序列1
elif 条件测试2
then 命令序列2
else 命令序列3
fi
多分支if应用示例
判断机试分数,区分优秀/合格/不合格
gradediv.sh
#!/bin/bash
read –p “请输入您的分数(0-100):”GRADE
if [$GRADE -ge 85] && [$GRADE –le 100];
then “$GRADE 分!优秀”
elif [$GRADE -ge 70] && [$GRADE –LE 84];
then echo “$GRADE 分、合格”
else echo “$GRADE 分?不合格”
fi
9.shell for循环
for 变量名in 取值列表
do
命令序列
done
10. shell case 分支
#!/bin/bash
case “$1” in
start)
sleep 3600 &
stop)
pkill –x ‘sleep’
*)
echo “用法 $0 |start|stop|”
esac
chkconfig 处理
在脚本开头设置chkconfig参数
添加为系统服务
#! /bin/bash
# chkconfig -90(启动进程的顺序位) 10(结束进程的顺序位)
# description Daemon script for sleepd Server
必须放在 etc/init.d目录下
执行这个脚本 chkconfig –add sleepd
hitkey.sh
#! /bin/bash
read –p “请输入一个字符,并按Enter”
case “$KEY”in
[a-z]|[A-Z])
echo “字母”
[0-9])
echo “数字”
*)
echo “other”
esac
(11)awk文本处理工具和sed文本处理工具
vi命令只能用于人工编辑文本,若在shell中实现自动编辑文本,就不行了。
awk不能直接去修改文本,sed能直接修改文本。
awk命令格式
awk ‘模式{操作} ’ file1 file2
常见内建变量
NR 当前处理行的序数
FS 字段分隔,缺省为空格或Tab位
$n 当前行的第n个字段
$0 当前行的所有文本内容
打印输出1-3文本
awk ‘NR==1,NR==3{print}’ file.txt
打印输出第一行和第三行
awk ‘(NR==1)||(NR==3){print}’ file.txt
输出奇数行
awk ‘(NR%2)==1{print}’ file.txt
输出偶数行
awk ‘(NR%2)==1{print}’ file.txt
使用正则表达式
输出所有包含a的行
awk ‘/a/{print}’ file.txt
输出以a结尾的行
awk ‘/a$/’{print}’ file.txt
输出2-3行的第一列和第三列
awk ‘NR==2,NR==3{print $1,$3}’ file.txt
以.为分隔符且第五个字段是chai的行的所有列
awk –F. ‘$5==”chai”{print $0}’ file.txt
sed命令格式
显示操作后文件中的全部文本
sed ‘编辑指令’ file1 file2……..
只显示想要显示的文本
sed -n ‘编辑指令’ file1 file2……..
替换文件中的文本内容,并且把替换后的文本显示出来。
sed -i ‘编辑指令’ file1 file2……..
编辑指令写法:
格式:‘地址1,地址2操作类型’
多条指令之间以分号隔开
最常用的操作类型
p 输出/打印文本行
n 取下一行文本(跳过当前行)
d 删除
s 字符串替换
a 追加新的文本
示例:
输出3-5行
sed -n ‘3,5p’ /etc/hosts
输出第三行和第五行
sed -n ‘3p;5p’ /etc/hosts
输出奇数行
sed -n ‘p;n’ file.txt
输出偶数行
sed -n ‘n;p’ file.txt
使用正则表达式
输出从第一个包含a的行到最后一行的文本($为最后一行的意思)
sed –n ‘/a/,$p’ file.txt
输出包含单词This的行(linux下一个字符串前后有空格或者标点符号则判定其为单词)
sed –n ‘/\<This\>/p’ file.txt
删除第二行和第三行
sed ‘2,3d’ file.txt
删除不包含字符a的行
sed ‘/ne/!d’ file.txt
替换第3-4行内的a为b(g是global的意思,若不加则只替换一行的第一个a)
sed ‘3,4s/a/b/g’ file.txt
在1-2行的行首插入#
sed ‘1,2s/^/#/g’ file.txt
删除字符串ab
sed ‘s/ter//g’ file.txt