一、bash 中如何进行条件测试:
有三种类型的测试:整数测试、字符串测试、文件测试
1.整数测试:
-eq 左边的值是否等于右边
-gt 左边的值是否大于右边
-ge 左边的值是否大于等于右边
-lt 左边的值是否小于右边
-le 左边的值是否小于等于右边
-ne 左边的值是否不等于右边
2.字符串测试:
== 也可以写成= 左右两个字符串是否相同
!= 左右两个字符串是否不同
-z 查看字符串是否为空
-n 查看字符串是否不为空
3.文件测试:
-e FILE 判断是否为单目操作
-f FILE 判断是否为普通文件
-d FILE 判断是否为目录
-h/-l FILE 判断是否为符号链接文件
-b FILE 判断是否为块设备文件
-c FILE 判断是否为字符设备文件
-r FILE 判断当前所用的文件是否有读权限
-w FILE 判断文件是否有写权限
-x FILE 判断文件是否有执行权限
二、sed编辑器介绍
1.sed:(stream editor) ,是一个很好用的行编辑器,支持正则表达式的处理,具有如下特点:
(1)sed是一个非交互式的编辑器
(2)没有破坏性,不修改源文件,除非使用shell的重定向符来保存结果
(3)sed还支持sed脚本
使用格式:
(1)1,4 :表示查找范围是1-4行,使用格式:sed‘addr1,addr2s@from@tog/i’
其中addr1是开始行,addr2是结束行,;s 是替换,@为分隔符,也可以是其他
字符,但是不能与查找的字符一样,from是查找什么,to 是替换成什么,g是全
局查找,i 是忽略大小写查找
(2)/pattern/command sed 也支持模式匹配,
(3)/pattern1/ ,/pattern2/
i\ 在当前行的上方添加一行或者多行
a\ 在当前行的下方添加一行或者多行
! 对模式匹配到的内容取反
d 删除匹配到的内容 ,如:sed '5d' filename ,将文件中的第5行删除;sed '5,7d' filename 将文件中的第5-7行删除
2.sed 的一些常用选项
-n 静默模式,只显示被模式匹配到的内容
-e 一次指定多个条件 ,例如:sed -e ‘’ ‘’ ‘’ 文件名
-i 可以直接修改原文件
-f 读取sed 脚本
3.sed用法的简单例子:
echo "var/log/httpd/access_log/" | sed 's@.*/\([^/]\{1,\}\)/\{0,1\}@\1@g'
显示结果:access_log
echo "/etc/log/httpd/access_log" | sed '1,$s@\(.*\)/[^/]\{1,\}@\1@g'
显示结果:/etc/log/httpd
三、Shell 脚本编程范例:
1.写一个脚本:
(1)创建目录/tmp/scripts
(2)切换工作目录至此目录中
(3)复制/etc/pam.d目录至当前目录,并重命名为test
(4)将当前目录中的test及其里面的文件和子目录的属主改为redhat
(5)将test及其子目录中的文件的其他用户的权限改为没有任何权限
#!/bin/bash
WDIR='/tmp/scripts'
mkdir $WDIR &> /dev/null
cd $WDIR
cp -r /etc/pam.d test &> /dev/null
chown -R redhat test &> /dev/null
chmod -R o= test &> /dev/null
2.写一个脚本:
(1).切换工作目录至/var
(2).依次向/var目录中的每个文件或者子目录问好
第1种方法
#!/bin/bash
echo "lian xi "
cd /var
echo "qie huan mulu chenggong "
for file in `ls /var`; do
echo "hello,$file" | cut -d/ -f1,3
done
第2种方法
#!/bin/bash
echo "lian xi "
cd /var
echo "qie huan mulu chenggong "
for file in /var/*; do
echo "hello,`basename $file`"
done
3.求100以内的整数的和:
#!/bin/bash
declare -i SUM=0
for I in {1..100}; do
SUM=$[$SUM+$I]
done
echo "the sum is:$SUM"
4.求100以内偶数的和;
#!/bin/bash
declare -i SUM=0
for I in `seq 0 2 100`; do
SUM=$[$SUM+$I]
done
echo "the sum is:$SUM"
5.写一个脚本:
(1)设定变量FILE的值为/etc/passwd
(2)使用循环读取文件/etc/passwd 的第2,4,6,10,13,15行,并显示其内容:
(3)把这些行保存至/tmp/mypasswd文件中
#!/bin/bash
FILE='/etc/passwd'
for LINE in 2 4 6 10 13 15; do
head -$LINE $FILE | tail -1 | tee -a /tmp/mypasswd
done
6.写一个脚本:
(1)设定变量FILE的值为/etc/passwd
(2)依次向/etc/passwd中的每个用户问好,形如:Hello,root,显示自己的shell ,
形如:your shell : bash
(3)统计一共有多少个用户
第一种方法:
#!/bin/bash
FILE='/etc/passwd'
LINES=`wc -l $FILE | cut -d' ' -f1`
for LINE in `seq 1 $LINES`; do
echo "Hello ,`head -$LINE $FILE | tail -1 | cut -d: -f1`, your shell:`head -$LINE $FILE | tail -1 | cut -d: -f7`"
done
也可以这样:
for LINE in `seq 1 $LINES`; do
MYUSER=`head -$LINE $FILE | tail -1 | cut -d: -f1`
MYSHELL=`head -$LINE $FILE |tail -1 | cut -d: -f7`
echo "Hello ,$MYUSER,your shell: $MYSHELL"
7.创建10个用户并为其添加密码,以用户一样的密码
for NEWUSER in {1..10};do
useradd user$Newuser &> /dev/null
echo "user$Newuser" | passwd --stdin user$NEwuser &> /dev/null
done