一.BASH
说bash之前,先说说脚本:脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具无法实现的功能。
二.shell脚本实例
1.用户输入一个ip,检测这个ip的那台主机是否开机
#!/bin/bash
read -p "please input ip:" IP
ping $IP -w 1s &> /dev/null && echo $IP is up || echo $IP is down
这个脚本存在一个交互的过程,需要用户输入ip,然后才会执行接下来的命令。如果能ping的通,就会打印up,否则会打印down。
2.实现一个脚本,脚本后面跟一个动作(create or delete)再跟一个文件(用户信息),来实现用户的创建和删除
#!/bin/bash
### This script add or delete the userfile's user
### 2017-4-27
### by gan_ke
## The function for add user
CREATE_USER(){
L=`wc -l $1 | cut -d " " -f 1`
for NUM in `seq 1 "$L"`
do
USERNAME=`sed -n ${NUM}p $1`
CHECK_USER=`getent passwd $USERNAME`
if
[ -z "$CHECK_USER" ]
then
useradd $USERNAME
echo "$USERNAME is create successfully!"
else
echo "$USERNAME is exist!"
fi
done
}
## The function for delete user
DELETE_USER(){
L=`wc -l $1 | cut -d " " -f 1`
for NUM in `seq 1 "$L"`
do
USERNAME=`sed -n ${NUM}p $1`
CHECK_USER=`getent passwd $USERNAME`
if
[ -n "$CHECK_USER" ]
then
userdel $USERNAME
echo "$USERNAME is delete successfully!"
else
echo "$USERNAME is not exist!"
fi
done
}
if
[ -n "$1" -a -n "$2" ]
then
case "$1" in
create)
CREATE_USER $2
;;
delete)
DELETE_USER $2
;;
*)
echo 'ERROR:If you wang to add user ,please input "create" !'
echo 'ERROR:If you wang to delete user,please input "delete" !'
esac
else
echo "ERROR:please input a active and a userfile!"
fi
在这个脚本中使用到了函数,使用函数并不是为了提高我们脚本的运行速度,但是可以让我们的脚本的逻辑变得的清晰,结构变得明了。
首先,先判断用户是否将动作和文件跟在命令的后面,如果没缺少,则提示用户输入;然后用了一个case语句,case语句和if语句都可以实现相同的功能,但是效率不同,现在可能体现不出来,当你的分支的数量级达到一定程度,就会很明显,这是因为case和if的实现原理是不同的,if语句是一条一条进行判断,恰巧要执行的在最后面,那么前面的条件都得遍历一遍,而case语句则不同,case语句只匹配一次,所以能大大提高效率。case匹配用户输入的动作,如果是create,则执行CREATE_USER函数,如果是delete,则执行DELETE_USER函数;
CREATE_USER函数和DELETE_USER函数的思想大致相同,首先遍历文件内的用户名,判断在系统内是否存在,然后再执行相应的操作。
3.实现一个1分10秒的计时器
#!/bin/bash
### This script is time count down
### 2017-04-27
### by gan_ke
MIN=1
for ((s=10;s>=0;s--))
do
echo -n "1:${s}"
echo -ne "\r"
sleep 1
if
[ "$s" -eq "0" ]
then
for ((s=59;s>0;s--))
do
echo -n "0:${s}"
echo -ne "\r"
sleep 1
done
fi
done
计时器主要用到了for循环来实现,每一秒可以用sleep 1 来实现。然后就是逻辑的构造,首先让秒先循环,直到秒为0,分钟为1的时候,进入子循环,分钟被赋值为0,秒被赋值为59。其次就是刷新的问题,如果不做任何处理,每一秒都会打印出一个时间,这里我们用到了echo -n “1:${s}” echo -ne “\r”来实现刷新。
三.小结
写得一手好脚本对于玩linux来说是很有用的,这次展示的脚本只是我初学脚本的几个例子,多说无益,要想得心应手,还得多写、多练。