例一:运算符的写法
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=5; 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 {50..100}
do
echo -n $i
done
echo
for i in $(seq 100) --也是产生1到100的序列,这是另一种写法
do
echo -n $i
done
for i in /etc/* --也可以把一个目录下面所有文件和目录循环赋值给变量i,常用于批量改名或改权限
do
echo $i
done
for i in /etc/*
do
[ -f $i ] && echo $i --加一个判断,只要里面的文件
done
思考:
要把/etc/下所有的文件包括子目录下的文件也找出来,并echo出来
for i in `find /etc/ -type f`
do
echo $i
done
find /etc/ -type f | while read i --把前面find的结果通过管道read给i变量
do
echo $i
done
批量加10个用户,以student1到student10命名,并统一加一个新组,组名为class,统一改密码为123(统一把密码改成就是自己的用户名,使用passwd命令和EOF结合?)
groupadd> for i in `seq 10`
do
useradd -G> echo 123 | passwd --stdin "student$i" > /dev/null 2>&1
done
----------------
groupadd> for i in `seq 10`
do
useradd -G> passwd "student$i" &1
student$i
student$i
EOF --注意这几行要顶格写
done
批量删除刚才建立的10个用户(包括把用户的家目录和邮件目录给删除干净)
for i in `seq 10`
do
userdel -r "student$i"
done
groupdel> 计算1到100的奇数之和
total=0
for (( i=1 ;i > /tmp/downip || echo "$ip" >> /tmp/upip
done
echo "能ping通的ip有:"
cat /tmp/upip
echo "#################"
echo "不能ping通的ip有:"
cat /tmp/downip
read输入一个目录,找出目录下为死链接的文件(同步也要判断子目录下的所有文件又如何写?)
read -p "输入一个目录:" dir
for i in $dir/*
do
[ -h $i -a ! -e $i ] && echo "$i是死链接"
done
------------------------
read -p "输入一个目录:" dir
for i in `find $dir -type l`
do
[ ! -e $i ] && echo "$i是死链接"
done
用read输入一个目录,使用脚本判断目录里每个文件的权限(是否可读,是否可写,是否可执行)
#!/bin/bash
read -p "输入一个目录:" dir
[ -d $dir ] && echo "是一个目录,继续执行" || echo "不是一个目录,请重新运行脚本"
for i in `find $dir -type f`
do
[ -r $i ] && r=yes || r=no
[ -w $i ] && w=yes || w=no
[ -x $i ] && x=yes || x=no
echo "当前用户对$i的权限为:"
echo $r
echo $w
echo $x
done
用read输入一个用户,再用read输入一个目录,使用脚本判断目录里每个文件的权限(read输入的用户对其是否可读,是否可写,是否可执行)
--提示:如何去用root用户去变成一个普通用户身份去执行脚本? man su 查看-c参数
--第一个脚本
[root@dns shell02]# cat example10.sh
#!/bin/bash
read -p "输入你要判断的用户名:" name
id $name > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "用户名存在,继续执行"
else
echo "用户名不存在,请重新运行脚本,输入正确的用户名"
exit 1
fi
su - $name -c "sh /tmp/example102.sh"
第二个脚本: --此脚本最后放到/tmp下,让所有用户可以执行
[root@dns shell02]# cat example102.sh
#!/bin/bash
user=`id | cut -d"(" -f2 |cut -d ")" -f1` --查找自己的用户名,可以用whoami替代
read -p "输入一个目录:" dir
if [ -d $dir ];then
echo "是一个目录,继续执行"
else
echo "不是一个目录或目录不存在,请重新运行脚本"
exit 1
fi
for i in `find $dir -type f`
do
[ -r $i ] && r=yes || r=no
[ -w $i ] && w=yes || w=no
[ -x $i ] && x=yes || x=no
echo "$user对$i的权限为:"
echo "read=$r"
echo "write=$w"
echo "execute=$x"
done
=================================
until 循环 --直到满足条件就退出循环
例十二:用until实现打印1到5
a=1
until [ $a -gt 5 ] for ((a=1;a>5;a++))
do
echo $a
let a++
done
练习:
使用unitl去改写上面的批量加用户的脚本
groupadd> i=1
until [ $i -gt 10 ]
do
useradd -G> passwd "student$i" &1
student$i
student$i
EOF
let i++
done
=====================================================
while 用于不定次数的循环,或死循环
while [条件]
do
command
done
死循环两种:
while true
do
command
done
while :
do
command
done
写一个30秒就时间同步2.2.2.35一次的脚本
while true
do
rdate -s 2.2.2.35
sleep 30
done
--不定次数循环,当满足一定条件,就退出循环
while true
do
rdate -s 2.2.2.35 > /dev/null 2>&1
[ $? -ne 0 ] && echo "rdate failed" | mail root && exit 100
sleep 30
done
写一个小闹钟的程序 (每秒都显示时间,当到了时间,就循环打印5个*,间隔一秒)
while true
do
now=`date +%H:%M:%S`
echo $now
sleep 1
clear
if [ "$1" == "$now" ];then
for (( i=0;i> /tmp/systemuser
[ $uid -eq 65534 ] && echo "$name" >> /tmp/systemuser
[ $uid -gt 500 -a $uid -ne 65534 ] && echo "$name" >> /tmp/nomaluser
done
写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数
read -p "输入一个你要删除空文件的目录:" dir
a=0
for i in `find $dir -type f`
do
[ ! -s $i ] && rm -rf $i && let a++
done
echo "删除的个数为:" "$a"
-----------------------------------
--下面这种写法有问题,循环内部let a++确实加了值,但循环之后的a值还是为0
a=0
find $dir -size 0c | while read i
do
rm -rf $i && let a++
done
echo $a --???????
写一个倒计时脚本,要求显示离2012年1月1日的凌晨0点,还有多少时间
#!/bin/bash
while true
do
year=$[2011-`date +%Y`]
month=$[12-`date +%m`]
day=$[31-`date +%d`]
hour=$[23-`date +%H`]
minute=$[59-`date +%M`]
second=$[60-`date +%S`]
echo "离2012年还有$year年:$month月:$day天:$hour时:$minute分:$second秒"
sleep 1
done
--上面的问题大概有几个:
1.倒计时不用月,因为每月的天数不一样。只用天的话,用365去减也不准确,因为闰年是366天
2,当分钟为0几分时,如08分 那么59-08,它不能减
--正确写法如下:
#!/bin/bash
goal=`date +%s -d 20120101`
while true
do
now=`date +%s`
day=$[($goal-$now)/86400]
hour=$[($goal-$now-$day*86400)/3600]
minute=$[($goal-$now-$day*86400-$hour*3600)/60]
second=$[$goal-$now-$day*86400-$hour*3600-$minute*60]
echo "离2012年还有$day天:$hour时:$minute分:$second秒"
sleep 1
done
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com