小知识
- shell脚本if中的表达式条件可通过man test查看,比如-a就相当于&&。
- 2.
实例一:模拟登陆
#!/bin/bash
echo -n "login:"
read name
echo -n "password:"
read passwd
if [ $name = "wilcohuang" -a $passwd = "31415926yhwy." ];
then echo "the host and password is right"
else echo "input is error!"
fi
实例二:比较两个数的大小
#!/bin/bash
echo "please enter two number"
read a
read b
if test $a -eq $b
then echo "no.1 = no.2"
elif test $a -gt $b
then echo "no.1 > no.2"
else echo "no.1 < no.2"
fi
实例三:搜索某个目录下文件是否存在
#!/bin/bash
echo "enter a file name:"
read a
if test -e /data/home/wilcohuang/shell/$a
then echo "the file is exist!"
else echo "the file is not exist!"
fi
实例四:for循环的使用
#!/bin/bash
clear
for num in 1 2 3 4 5 6 7 8 9 10
do
echo $num
done
实例五:命令行输入
#!/bin/bash
echo "Please enter a user:"
read a
b=$(whoami)
if test $a = $b
then echo "the user is running"
else echo "the user is not running"
fi
实例六:删除当前目录下大小为0的文件
#!/bin/bash
for filename in `ls`
do
if test -d $filename
then continue
else a=$(ls -l $filename | awk '{print $5}')
if test $a -eq 0
then rm -rf $filename
fi
fi
done
实例七:如果某目录下有文件,那么将其文件系统大小改为3G
#!/bin/bash
while line=`ls /data/home/wilcohuang/shell/test1`
do
if test $line = ""
then echo "NULL"
sleep 1
else echo $line
chfs -a size=3G /data/home/wilcohuang/shell/test1
exit 0
fi
done
实例八:测试IP地址
#!/bin/bash
for i in {1..9}
do
echo "the number of $i computer is"
ping -c 1 192.168.0.$i
done
ping: -c count次数
实例九:从0.sh中读取内容并打印
#!/bin/bash
while read line
do
echo $line
done < 0.sh
实例十:从0.sh中读取内容并+1
#!/bin/bash
test -e 0.sh
while read line
do
a=$line+1
echo $a
done < 0.sh
实例十一:普通无参数函数
#!/bin/bash
p()
{
echo "hello"
}
p
实例十二:给函数传递参数
#!/bin/bash
p_num()
{
num=$1
echo $num
}
for n in $@
do
p_num $n
done
命令:bash para.sh 10
实例十三:获取本机IP地址
ifconfig | grep 'inet addr:' | awk '{print $2}' | sed 's/addr://g'
`
[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
`
实例十四:查找最大文件
#!/bin/bash
a=0
for name in *.*
do
b=$(ls -l $name | awk '{print $5}')
if test $b -ge $a
then a=$b
namemax=$name
fi
done
echo "the max file is $namemax"
实例十五:查找本网段的所有ip
a=1
while :
do
a=$(($a+1))
if test $a -gt 255
then break
else
echo $(ping -c 1 10.204.172.$a | grep "ttl" | awk '{print $4}' | sed 's/://g')
ip=$(ping -c 1 10.204.172.$a | grep "ttl" | awk '{print $4}' | sed 's/://g')
if [ -n "$ip" ];
then
echo $ip >> ip.txt
fi
fi
done
注意:shell中比较字符串必须加双引号,否则结果不正确,正确做法如:
a=""
if [ -n "$a" ];
then
echo 'yes'
else
echo 'no'
fi
实例十六:case练习
#!/bin/bash
clear
echo "enter a numbe from 1 to 5:"
read num
case $num in
1)echo "you enter 1"
;;
2)echo "you enter 2"
;;
3)echo "you enter 3"
;;
4)echo "you enter 4"
;;
*)echo 'default'
;;
esac
实例二十:yes/no返回不同结构
#!/bin/bash
clear
echo "enter [y/n]:"
read a
case $a in
y|Y|Yes|YES)echo "you enter $a"
;;
n|N|NO|no)echo "you enter $a"
;;
*)echo 'error'
;;
esac
实例二十二:使用内置命令
#!/bin/bash
clear
echo "hello,$USER"
echo "Today's date id `date`"
实例二十三:打印所有没有密码的用户
cat /etc/shadow | grep '!!' | awk -F ":" '{print $1}'
实例二十三:检查端口号是否启动
#!/bin/bash
n=1
echo "检查nginx服务..."
while true
do
if test $n -gt 20
then
echo "nginx服务启动失败"
break
fi
sleep 5
n=$(($n+1))
port=`netstat -natp | grep "0.0.0.0:80"`
if [ ${#port} -gt 3 ];
then
echo "nginx服务已经启动"
break
fi
done