今天小编为大家讲的是shell脚本,这一块在我们Linux占了很大的分量,小编想了好久,还是觉的用练习题来讲述更具有说服力,小编会把每个解题的亮点与重点指出来。
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;并生成8位随机口令并存在一个文件中,初步提示改口令,显示添加的用户的id号等信息
read -p "input user: " user
if id $user &>/dev/null ;then
echo "$user is exist,the info is `id $user`"
else
useradd $user&& echo "123"|passwd --stdin $user &&echo "useradd is successful and passwd update,and the info is `id $user` "
fi
解题亮点:先用id进行判断比先判断用户是否存在更简洁,逆向思维。
2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
read -p "yuema ?yes or no: " ANS
ans=`echo $ANS|tr 'A-Z' 'a-z' `
case $ans in
y|yes)
echo "see you Now."
;;
n|no)
echo "bye bye"
;;
*)
echo "error input"
;;
esac
解题亮点:ans=`echo $ANS|tr 'A-Z' 'a-z' ` 用tr进行大写转换成小写,这会让下面的case命令的选项更简洁
3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
read -p "input file: " file1
n=` ls -l $file1|cut -c1 `
case $n in
-)
echo "this is 常规文件"
;;
d)
echo "this is 目录文件"
;;
c)
echo "this is 字符设备文件"
;;
b)
echo "this is 块设备文件"
;;
l)
echo "this is 符号链接文件"
;;
p)
echo "this is 管道文件"
;;
s)
echo "this is 套接字文件"
;;
*)
echo "input wrong"
;;
esac
此题重点在于把文件类型的记忆
4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
read -p "input int: " num
echo $num|grep "[^0-9]" && echo "是非正整数"|| echo "$num 是个正整数"
此题重点:利用grep对数字进行过滤(主要过滤正负号和点)
5、添加10个用户user1-user10,密码为8位随机字符
>/app/userinfo.txt
for i in {1..10};do
pwd=`tr -dc 'A-Za-z0-9'</dev/urandom|head -c8`
useradd user$i
echo user$i:$pwd|chpasswd
echo "user$i user$i$pwd" >> /app/userinfo.txt
done
重点在于怎么把密码写在脚本里,这个在以后的文章也会讲
6、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
for i in `ls /etc/rc.d/rc3.d` ;do
n1=`echo $i|cut -c1`
case $n1 in
K)
echo -e ${i}stop
;;
S)
echo -e ${i}start
;;
*)
echo "unkown"
;;
esac
done
重点在于${i}stop中的{},忘记的话,特别容易出错
7、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
read -p "input n: " n
sum=0
for i in $(seq $n);do
sum=$[sum + i]
done
echo " 1到 $n 的和为: $sum"
重点在于$n不能用于{ }里,这就让for循环容易出错,但是,我们可以用seq代替
8、打印九九乘法表
for i in {1..9} ; do
for j in `seq 1 $i`; do
echo -n "$i*$j=$[ i*j ] "
done
echo
done
重点同上for j in `seq 1 $i`
9、打印等腰三角形
read -p "input n: " n
for i in $(seq $n);do
for j in $(seq $[n-i]);do
echo -en " "
done
for k in $(seq $[2*i-1]);do
echo -en "*"
done
echo
done
重点在于: 空格数=总行数-当前行;*数=2n-1
10、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
> /app/a.txt
j=1
while [ $j -le 10 ];do
echo $[$[RANDOM%9]+1] |tee -a /app/a.txt
let j++
done
min=`sort -n /app/a.txt| head -1`
max=`sort -n /app/a.txt|tail -1`
echo "min: " $min
echo "max: " $max
亮点在于:用tee把随机数重定向到a.txt中,这样对它进行排序首行就是最小值,尾行就是最大值,会是代码简洁
11、编写脚本,实现打印国际象棋棋盘
y="\033[1;43m \033[0m"
R="\033[1;41m \033[0m"
for i in {1..8};do
if [ $[i%2] -eq 0 ];then
for j in {1..4};do
echo -en "$y$R"
done
else
for j in {1..4};do
echo -en "$R$y"
done
fi
echo
done
用变量y R对颜色进行定义会使下面的调用更具有调理性
好了今天小编先说这11道,剩下的待小编整理好一起讲讲