宝塔任务,写shell执⾏脚本,真的很实⽤
⼤家好!我是handsomecui,下⾯我为⼤家讲解⼀下shell脚本的写法,讲的不好的地⽅,欢迎⼤家留⾔拍砖。希望同仁们,⽀持下鄙⼈的⼩窝
1.在linux下会写shell脚本是⾮常重要的,下⾯我参照例⼦给⼤家展⽰⼏个脚本,顺带这学习shell 的语法:
什么时候helloworld是必不可少的,第⼀个脚本肯定与helloworld是离不开的:
#!/bin/sh
a="hello world!"
num=2
echo "a is : $a num is : ${num}nd"
运⾏结果: a is : hello world! num is : 2nd
shell脚本简单易懂,只要有⼀点点c语⾔的基础,这些都是⼩case;
2.下⾯带着⼤家学学if语句:
先抛出⼀个问题:写⼀个脚本,判断当前所⽤的shell
#!/bin/sh
#注意if的空格以及[]⾥⾯的空格这⾥错了半天啊
if [ "$SHELL" = "/bin/bash" ];then
echo "your login shell is the bash \n"
echo "SHELL is : $SHELL"
else
echo "your login shell is not bash but $SHELL"
fi
#[ -f "somefile" ] : 判断是否是⼀个⽂件
#[ -x "/bin/ls" ] : 判断/bin/ls是否存在并有可执⾏权限
#{ -n "$var" } : 判断$var变量是否有值
#[ "&a" = "$b" ] : 判断$a和$b是否相等
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
if [ -f "/etc/shadow" ];then
echo "电脑密码使⽤隐藏字符"
else
echo "并没有"
fi
#是注释的意思,相关部分已经在⾥⾯详细给⼤家注释解释了,注意if语句的格式
if[];then
elif[];then
else
fi
另外注意if语句还可以简单的⽤&&与||或语句来代替;另外如果想要深⼊了解if可以男⼈test(在linux遇到问题要学会男⼈解决,man)
3.为了让⼤家更加熟练的运⽤shell,那么练习下吧,问题:写⼀个脚本使其从⼀个⽂件⾥⾯读⼊有echo的语句,并把其写在本⽂件末尾;
#!/bin/sh
#-r代表此⽂件是否可读,具体见man test
mailfolder=/home/handsome/work/linux_learn/shell_
#[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1;}
#echo "$mailfolder has mail from : "
#grep "^echo " $mailfolder
if [ -r "$mailfolder" ];then
echo "$mailfolder has massage from : "
echo | grep '^echo ' $mailfolder >>
chmod +
>> $mailfolder
rm -
else
echo "Can not read $mailfolder"
touch $mailfolder
chmod +rw $mailfolder
echo "echo ⼈⽣⾃古谁⽆死,六区蛋清旱情! " >> $mailfolder
fi
这⾥由于重定向不能本⽂见输出到本⽂件输出,于是我就想了个办法,新建个⽂件,再重定向到这个⽂件,⼤神有别的简单⽅法可以下⾯留⾔拍砖;
4.接下来,我们练习下while的⽤法,⽼规矩具体问题来分析;
问题:写⼀个脚本(不建议使⽤for变量--for是根据空格取值)
1.设定变量FILE的值为/etc/passwd
2.依次向/etc/passwd中的每个⽤户问好,并且说出对⽅的ID什么(Hello,root,your UID is0.)
3.统计⼀个有多少个⽤户
#!/bin/bash
fl=/etc/passwd
count=`cat $fl | wc -l`
#下⾯是⼀个管道,下⾯循环读⽂件中的每⼀⾏
cat $fl |
while read line
do
user=`echo $line|awk -F ':' '{print $1}'`
#代表以:分段$1就是取第1段
uid=`echo $line|awk -F ':' '{print $3}'`
echo "hello, $user Your UID is $uid"
done
echo "====User_count:$count===="
#前⾯求得的⽤户数
这⾥要注意到awk的⽤法,可以linux的男⼈解决;
5.练习⼀下for语句吧
问题:写个脚本;
1.切换⼯作⽬录⾄/tmp
2.依次向/tmp⽬录中的每个⽂件或⼦⽬录问好(Hello,log)
3.统计/tmp⽬录下共有多个⽂件,并显⽰出来
1 2 3 4 5 6 7 8#!/bin/bash
cd /tmp
for i in/tmp/*
do
echo "Hello , $i"
done
count=`ls -l|grep '^-'|wc -l`
echo "====file_count:$count===="
这个问题就相对简单了些,⼀个for语句就可以搞定,当然可以while搞搞6.那么问题来了:
question:
传递两个整数给脚本,让脚本分别计算并显⽰这两个整数的和,差,积,商
#!/bin/bash
a=$1
b=$2
[ -z $a ] && echo "please \$1 number1" && exit 1
[ -z $b ] && echo "please \$2 number2" && exit 2
[ ! $# -eq 2 ] && echo "--please num1 num2" && exit 3
# $#传递到脚本的参数个数
# -eq相当于=, -ne相当于不等于, -ge >= , -gt >, -le <=, -lt <
echo "$a + $b = $(($a+$b))"
echo "$a - $b = $(($a - $b))"
echo "$a * $b = $(($a*$b))"
echo "$a / $b = $(($a/$b))"
shell最简单脚本这⾥要注意的是,需要传⼊两个参数;
具体⽤到的⼀些知识请看下⾯:
读到这⾥⼤家对上⾯的⼩脚本是不是感觉特别easy了,哈哈;
7.写⼀个脚本;求1到100的和?
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$(($sum + $i))
i=$(($i+1))
done
echo "$sum"
这个脚本就so easy了;
8.接下来,我们写个很实⽤的脚本吧,假设你现在在机房,你想要看看机房哪些ip在开着,⽅便咱。。。,是吧。我们可以 通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线
#!/bin/bash
for i in `seq 2 254`
do
ping -c1 -w1 192.168.51.$i > /dev/null 2>&1
#-c可以指定ping的次数,-w测试的时间 -w 1就是1秒中⽆论成功失败都结束
#-c -w后⾯都要输⼊参数所以都要带上l
#$?代表最后命令退出状态,0代表没错,其他代表有错
[ $? -eq 0 ] && echo "192.168.51.$i IP is UP!" || echo "192.168.51.$i IP is down!"
done
在这⾥2>&1代表不显⽰错误信息,其实就是把错误重定向到标准输出,然后重定向到/dev/null,/dev/null就是个⿊洞,写⼊的任何东西都会丢失,其实简要说就是把正确或错误的输出扔到垃圾桶。
写到这⾥⼤家是不是感觉⽿⽬⼀新呐,哈哈!
随笔练习:还有点bug

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。