shell学习笔记2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
--
--运算的方法
例一:运算符的写法
a=1
let a++
let 'a+=2'
b=`expr $a + 3` #注意=号两边不要有空格,还有+号两边要有空格
c=$((a+5))
d=$[a+7]
echo $a
echo $b
echo $c
echo $d
-------------------------------------------------------------------------
--常用的bash内部命令
echo exit continue break
例二:循环 (使用sh $0)
echo 'aaaaa'
sleep 3
sh $0 --这一句是代表再重新执行上面的代码
exit 10 --这个定义退出整个脚本,但是在这个脚本里永远也到不了这一步
---------------------------------------------
for 循环语句
for var in 1 2 3 4 5
do
command
done
for (( var=1 ; var < 6 ; var++ ))
do
command
done
for (( var=6; var >0 ; var--))
do
command
done
---------------------------------------------------------------------
例三: for循环举例
for i in 1 2 3 4 5
do
echo -ne "$i\n"--如果不使用-n参数,默认会一个数字打印一行,-e参数代表后面如果使用\n(换行),\t(制表符)等这种字符时会生效,所以这句和echo $i效果一样
done
for i in `seq 100` --产生1到100的序列
do
echo -n $i
done
for i in $(seq 100) --也是产生1到100的序列,这是另一种写法
do
echo -n $i
done
for i in /etc/* --也可以把一个目录下面所有文件和目录循环赋值给变量i,常用于批量改名或改权限
do
echo $i
done
for (( i=5; i < 11 ;i++)) --产生 5到10的循环
do
echo $i
done
例四:批量加10个用户,以student1到student10命名,并统一加一个新组,组名为class,统一改密码为123
groupadd class
for a in `seq 10`
do
useradd student$a -G class
echo '123' |passwd --stdin student$a > /dev/null
done
例五:批量删除刚才建立的10个用户(包括把用户的家目录和邮件目录给删除干净)
groupdel class
for a in `seq 10`
do
userdel -r student$a
done
例六:写一个脚本,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里(如果例举整个网段的254个IP花的时间比较长,可以只分类10.1.1.1到10.1.1.10这十个IP)
[ -f /tmp/up.log ] && :> /tmp/up.log -- :>符号代表存在就删除此文件,再创建出来
[ -f /tmp/down.log ] && :> /tmp/down.log
for a in `seq 10`
do
ip=10.1.1.$a
b=`ping -c 1 $ip |grep receive |cut -d " " -f4`
[ $b -eq 0 ] && echo $ip >> /tmp/down.log || echo $ip >> /tmp/up.log
done
echo "****************"
echo 'these server is up':
cat /tmp/up.log
echo "*****************"
echo 'these server is down':
cat /tmp/down.log
例七:用read输入一个目录,使用脚本判断目录里每个文件的权限(是否可读,是否可写,是否
可执行)
read -p "input a directory:" file
if [ ! -e $file -o ! -d $file ];then
echo 'it is not existed or it is not a directory'
exit 1 --如果不存在或者不是目录,会退出整个脚本,并返回错误代码1
fi
for a in $file/*
do
if [ -r $a ];then
r='read=yes'
else
r='read=no'
fi
if [ -w $a ];then
w='write=yes'
else
w='write=no'
fi
if [ -x $a ];then
x='execute=yes'
else
x='execute=no'
fi
echo --直接一个echo命令是代表空格一行
echo "$a permission is"
echo $r
echo $w
echo $x
done
-------------------------------------------------------------------------------
until 循环 --直到满足条件就退出循环
例8:用until实现打印1到5
a=1
until [ $a -gt 5 ]
do
echo $a
sleep 1
let a++
done
练习:
使用unitl去改写上面的循环 --见例四,例五的脚本
--------------------------------------------------------
while
while [条件]
do
command
done
死循环两种:
while true
do
command
done
while :
do
command
done
例九:写一个30秒就时间同步10.1.1.1一次的脚本
while true
do
ntpdate 10.1.1.1 >/dev/null 2>&1
sleep 30
done
练习:用while的方式改写例四,例五 --见例四,例五的脚本
例十:写一个小闹钟的程序
while true
do
now=`date +%H:%M:%S`
echo $now
sleep 1
clear
if [ "$1" == "$now" ];then
for (( i=0;i<10;i++))
do
echo -n "*"
sleep 1
done
break
fi
done
echo
echo 'it is time'
例十一:写一个猜数字的脚本
num=56
while true
do
read -p "guess:" a
if [ $a -gt $num ];then
echo 'it is bigger'
continue --跳出循环,循环体内下面的代码不执行,重新开始循环
fi
if [ $a -lt $num ];then
echo 'it is smaller'
continue
fi
if [ $a -eq $num ];then
echo 'it is right'
break --中断循环,跳出循环体,执行循环体外下面的代码,也就是说下面echo 'test break'可以执行,如果这里把break换成exit,那就是中断整个脚本,循环体外下面的代码也不执行
fi
done
echo 'test break'
例十二:找出/etc/的所有以conf结尾的文件,拷到/tmp/conf目录下,然后全部把conf结尾换成以html结尾
第一种方法:
[ -d "/tmp/conf" ] && rm -rf /tmp/conf ; mkdir /tmp/conf || mkdir /tmp/conf
find /etc/ -name "*.conf" -exec cp {} /tmp/conf/ \;
cd /tmp/conf
rename .conf .html *
第二
种方法:
思考用循环
但要把*.conf文件前面的名字截取出来,才能重命名
例十三:找出/usr/share/doc目录下所有文件名为index.html的文件,把他们拷到/tmp/index目录下,文件名按找到的先后更改,第一个找到的为index.html.1,第二个找到的为index.html.2。。。。类推
[ -d "/tmp/index" ] && rm -rf /tmp/index;mkdir /tmp/index || mkdir /tmp/index
b=1
find /usr/share/doc/ -name index.html |while read a --用这种管道的形式将前面的结果给read给一个变量
do
cp $a /tmp/index/index.html.$b
let b++
done
------------------------------------------------------------------
循环嵌套
例十四:
打印出
1
12
123
1234
12345
第一种写法:
a=1
while [ $a -lt 6 ]
do
for (( b=1;b<=$a;b++ ))
do
echo -n $b
done
let a++
echo
done
第二种写法:
a=1
while [ $a -lt 6 ]
do
b=1
while [ $b -le $a ]
do
echo -n $b
let b++
done
let a++
echo
done
--------------------------------------------------------
随机数:
bash默认有一个$RANDOM的变量 使用set |grep RANDOM 查看上一次产生的随机数
echo $RANDOM
#产生0到1的随机数
ran1=`expr $RANDOM % 2`
echo $ran1
#产生100到200的随机数
ran2=`expr $RANDOM % 101 + 100`
echo $ran2
#产生50到100的随机数
ran3=$((RANDOM % 101))
while [ "$ran3" -lt 50 ]
do
ran3=$((RANDOM % 101))
done
echo $ran3
作业题:
1,用随机数改写上面写的猜数字游戏
2,写一个九九乘法表
3,找出/etc/的所有以conf结尾的文件,拷到/tmp/conf目录下,然后全部把conf结尾换成以html结尾(要求不用rename,用循环和截取实现)