shell学习笔记2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,用循环和截取实现)































相关文档
最新文档