今天小編爲大家講的是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道,剩下的待小編整理好一起講講