shell脚本编程进阶面试题

一级标题

shell脚本编程进阶面试题

?for实现 :

1、判断/var/?录下所有?件的类型
[root@magedu ~]# vim filetype.sh

!/bin/sh

for i in $(find /var) ;do
if [ -b $i ];then
echo "$i是块设备"
elif [ -c $i ] ;then
echo "$i是字符设备"
elif [ -f $i ];then
echo "$i是普通文件"
elif [ -h $i ];then
echo "$i是符号链接文件"
elif [ -p $i ];then
echo "$i是管道文件"
elif [ -S $i ];then
echo "$i是套接字文件"
elif [ -d $i ];then
echo "$i是目录文件"
else
echo "文件或目录不存在"
fi
done
exit 0

2、添加10个?户user1-user10,密码为8位随机字符
[root@magedu ~]# vim userpassword.sh

!/bin/sh

for n in $(seq 1 10);do
name=user$n
useradd "$name"
echo "$(tr -cd [[:alnum:]!_#@] < /dev/urandom |head -c 8)"|passwd --stdin $name &> /dev/null
echo "User creation"
done
exit 0

3、 /etc/rc.d/rc3.d?录下分别有多个以K开头和以S开头的?件;分别读取每个?件, 以K开头的输出为?件加stop,以S开头的输出为?件名加start,如K34filename stop S66filename start
[root@magedu ~]# vim k_s.sh

!/bin/sh

for i in ls /data/ ;do
[[ "$i" =~ ^k.* ]] && echo "$i stop"
[[ "$i" =~ ^s.* ]] && echo "$i start"
done
或者
for i in ls /data/|egrep -i "^k.*";do
echo "$i stop"
done
for j in ls /data/|egrep -i "^s.*";do
echo "$j start"
done

4、编写脚本,提?输?正整数n的值,计算1+2+…+n的总和
[root@magedu ~]# vim numbersum.sh

!/bin/sh

read -p "please input a positive integer:" n
i=1
sum=0
for i in seq 1 $n;do
let sum+=i
done
echo "sum is $sum"

5、计算100以内所有能被3整除的整数之和
[root@magedu ~]# vim 100_3.sh

!/bin/sh

for i in {1..100};do
if [ $[ $i%3 ] -eq 0 ];then
let sum+=i
fi
done
echo "sum is $sum"

6、编写脚本,提?请输??络地址,如192.168.0.0,判断输?的?段
中主机在线状态
[root@magedu ~]# vim online.sh

!/bin/sh

read -p "Please input the network address, such as 192.168.0.0 :" IP
net=echo $IP | cut -d"." -f1-2
for i in {1..255};do
for j in {1..255};do
netip=$net.$i.$j
ping -w1 -c1 $netip &> /dev/null && echo "$netip is up!" || echo "$netip is down!"
done
done

7、打印九九乘法表
[root@magedu ~]# vim 99.sh

!/bin/sh

for i in {1..9};do
for j in $(seq $i);do
echo -en "${i}x${j}=$[$i*$j]\t"
done
echo
done

8、在/testdir?录下创建10个html?件,?件名格式为数字N(从1到
10)加随机8个字 ?,如: 1AbCdeFgH.html
[root@magedu ~]# vim html.sh

!/bin/sh

for N in {1..10} ;do
file=echo "$N$(tr -cd [:alpha:] < /dev/random |head -c 8).html"
touch /data/$file
echo "$file is establish."
done

9、打印等腰三?形
[root@magedu ~]# vim isoceles_triangle.sh

!/bin/sh

read -p "please input isoceles triangle:" line
for i in $(seq 1 $line);do
spacenum=$[$line-$i]
anum=$[2$i-1]
for j in $(seq 1 $spacenum);do
echo -e "" "\c"
done
for k in $(seq 1 $anum);do
echo -e "
\c"
done
echo
done

10、猴?第?天摘下若?个桃?,当即吃了?半,还不瘾,?多吃了?
个第?天早上?将剩下的桃?吃掉?半,?多吃了?个。以后每天早上都
吃了前?天剩下的?半零?个。到第10天早上想再吃时,只剩下?个桃
?了。求第?天共摘了多少?
[root@magedu ~]# vim monkey.sh

!/bin/sh

sum=1
for i in {1..9} ;do
let sum=(sum+1)*2
done
echo "num is : $sum"

?while实现 :

1、 编写脚本,求100以内所有正奇数之和
[root@magedu ~]# vim whilesum.sh

!/bin/sh

sum=0
i=1
while [ $i -le 100 ];do
let sum=sum+i
let i=i+2
done
echo $sum

2、 编写脚本, 提?请输??络地址,如192.168.0.0,判断输?的?
段中主机 在线状态,并统计在线和离线主机各多少
[root@magedu ~]# vim nettest.sh

!/bin/sh

read -p "please input new(eg:192.168.0.0): " net
netid=echo $net|cut -d. -f1-2
i=0
up=0
down=0
while [ $i -le 254 ];do
j=1
while [ $j -le 254 ];do
if ping -c1 -w1 $netid.$i.$j &>/dev/null;then
echo "the $netid.$i.$j is up"
let up++
else
echo "the $netid.$i.$j is down"
let down++
fi
let j++
done
let i++
done
echo "the up is $up"
echo "the down is $down"

3、 编写脚本,打印九九乘法表
[root@magedu ~]# vim 99_while.sh

!/bin/sh

i=1
while [ $i -le 9 ];do
j=1
while [ $j -le $i ];do
let k=ij
echo -en "$i
$j=$k\t"
let j++
done
echo
let i++
done

4、 编写脚本,利?变量RANDOM?成10个随机数字,输出这个10数
字,并显 ?其中的最?值和最?值.
[root@magedu ~]# vim minormax.sh

!/bin/sh

i=0
while [ $i -le 9 ];do
num[$i]=$RANDOM
if [ $i -eq 0 ];then
MAX=${num[$i]}
MIN=${num[$i]}
else
if [ "$MAX" -lt "${num[$i]}" ];then
MAX=${num[$i]}
elif [ "$MIN" -gt "${num[$i]}" ];then
MIN=${num[$i]}
else
true
fi
fi
let i++
done
echo "num is : ${num[@]}"
echo "max num is : $MAX"
echo "min num is : $MIN"

5、编写脚本,实现打印国际象棋棋盘
[root@magedu ~]# vim chess2.sh

!/bin/sh

i=1
while [ $i -le 8 ];do
j=1
while [ $j -le 4 ];do
if [ $[$i%2] -eq 0 ];then
echo -e "\e[1;41m \e[0m\e[1;43m \e[0m\c"
else
echo -e "\e[1;43m \e[0m\e[1;41m \e[0m\c"
fi
let j++
done
echo
let i++
done
[root@magedu ~]# vim chess.sh

!/bin/sh

for i in {1..8};do
for j in {1..4};do
if [ $[i%2] -eq 0 ];then
echo -e "\e[1;41m \e[0m\e[1;43m \e[0m\c"
else
echo -e "\e[1;43m \e[0m\e[1;41m \e[0m\c"
fi
done
echo
done

6、后续六个字符串: efbaf275cd、 4be9c40b8b、 44b2395c46、 f8c8873ce0、 b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机 执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些 字符串对应的RANDOM值
[root@magedu ~]# vim random.sh

!/bin/sh

ps1=efbaf275cd
ps2=4be9c40b8b
ps3=44b2395c46
ps4=f8c8873ce0
ps5=b902c16c8b
ps6=ad865d2f63
echo ‘num ‘ ‘random‘
time=1
for i in {0..32767} ;do
if [ $time -gt 6 ];then
break
fi
ps=$(echo $i | md5sum | cut -c1-10)
for j in $ps1 $ps2 $ps3 $ps4 $ps5 $ps6 ; do
if [ $ps == $j ];then
echo $i $ps
let time++
fi
done
done
[root@magedu ~]# vim random2.sh

!/bin/sh

ps1=efbaf275cd
ps2=4be9c40b8b
ps3=44b2395c46
ps4=f8c8873ce0
ps5=b902c16c8b
ps6=ad865d2f63
echo ‘num ‘ ‘random‘
time=1
i=0
while [ $i -lt 32767 ]; do
if [ $time -gt 6 ];then
break
fi
ps=$(echo $i | md5sum | cut -c1-10)
for j in $ps1 $ps2 $ps3 $ps4 $ps5 $ps6 ; do
if [ $ps == $j ];then
echo $i $ps
let time++
fi
done
let i++
done

1、每隔3秒钟到系统上获取已经登录的?户的信息;如果发现?户hacker登录, 则将登录时间和主机记录于?志/var/log/login.log中,并退出脚本
[root@magedu ~]# vim userlog.sh

!/bin/sh

until false;do
if who |grep "^hacker>" &> /dev/null;then
who|grep "^hacker>" > /var/log/login.log
break
fi
sleep 3
done

2、随机?成10以内的数字,实现猜字游戏,提??较?或?,相等则退

[root@magedu ~]# vim guess.sh

!/bin/sh

n=$[$RANDOM%11]
time=1
while read -p "input a 0-10 number : " num ;do
if [ $num -gt $n ];then
echo "$num is greater"
elif [ $num -lt $n ];then
echo "$num is lower"
else
echo "guess right!"
break
fi
done

3、??件名做为参数,统计所有参数?件的总?数
[root@magedu ~]# vim fileline.sh

!/bin/sh

sum=0
while [ $# -gt 0 ];do
lines=cat $1|wc -l
shift
sum=$[$sum+$lines]
done
echo $sum

4、??个以上的数字为参数,显?其中的最?值和最?值
[root@magedu ~]# vim minmax.sh

!/bin/sh

max=$1
min=$1
while [ $# -gt 0 ]
do
if [ $1 -lt $min ];then
min=$1
fi
if [ $1 -gt $max ];then
max=$1
fi
shift
done
echo "maxnum is $max"
echo "minnum is $min"

1、编写函数,实现OS的版本判断
[root@magedu ~]# vim os.sh

!/bin/sh

os () {
if [ sed -r "s@.*([0-9]+)\..*@\1@" /etc/centos-release` -eq 6 ];then
echo "os is 6"
else
echo "os is 7."
fi
}
os

2、编写函数,实现取出当前系统eth0的IP地址
[root@magedu ~]# vim eth0ip.sh

!/bin/sh

eth0ip () {
ip=ifconfig eth0|grep netmask|tr -s ‘ ‘|cut -d ‘ ‘ -f3
echo ip=$ip
}
eth0ip

3、编写函数,实现打印绿?OK和红?FAILED
[root@magedu ~]# vim rog.sh

!/bin/sh

redgreen(){
echo -e "\033[1;32mOK\033[0m"
echo -e "\033[1;31mFAILD\033[0m"
}
redgreen

4、编写函数,实现判断是否?位置参数,如?参数,提?错误
[root@magedu ~]# vim args.sh

!/bin/sh

args(){
if [ $# -eq 0 ];then
echo "please give a parameter!"
fi
}
args $1

5、编写服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数: start, stop, restart, status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功” 考虑:如果事先已经
启动过一次,该如何处理?

(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成” 考虑:如果事先已然
停止过了,该如何处理?

(5) 如是restart,则先stop, 再start 考虑:如果本来没有start,如何处理?

(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is
running...” ,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is
stopped...”

(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理 说明: SCRIPT_NAME为当前脚本名

[root@magedu ~]# vim /root/bin/testsrv.sh

!/bin/sh

chkconfig:- 96 07

description

[ -f /etc/rc.d/init.d/basename $0 ]||mv /app/script/basename $0
/etc/rc.d/init.d/basename $0&>/dev/null
chkconfig --add basename $0
start () {
touch /var/lock/subsys/basename $0
. /etc/init.d/functions
action "basename $0 start successful!" true
}
stop () {
rm /var/lock/subsys/basename $0
. /etc/init.d/functions
action "basename $0 is stopped" true
}
restart () {
stop
start
}
status () {
if [ -f /var/lock/subsys/basename $0 ];then
. /etc/init.d/functions
action "basename $0 is running" true
else
action "basename $0 is stopped" true
fi
}
case $1 in
start)
if [ -f /var/lock/subsys/basename $0 ];then
echo "basename $0 is running"
else
start
fi ;;
stop)
if [ -f /var/lock/subsys/basename $0 ];then
stop
else
echo "basename $0 has been stopped before"
fi ;;
restart)
if [ -f /var/lock/subsys/basename $0 ];then
stop
start
else
start
fi ;;
status)
status ;;
esac

6、编写脚本/root/bin/copycmd.sh

(1) 提示用户输入一个可执行命令名称

(2) 获取此命令所依赖到的所有库文件列表

(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如: /bin/bash ==> /mnt/sysroot/bin/bash /usr/bin/passwd ==>
/mnt/sysroot/usr/bin/passwd

(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如: /lib64/ldlinux-x86-
64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2

(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令, 并重复完成上述功能;直到用户输入quit退出

[root@magedu ~]# vim /root/bin/copycmd.sh

!/bin/sh

while read -p "please input a COMMND : " command ;do
if [[ "$command" =~ [Qq][Uu][Ii][Tt] ]];then
break
elif [ -z "$command" ];then
echo "empty is not allowed."
continue
else
dir=which $command 2> /dev/null
if [ -z $dir ];then
echo "command is not exit."
continue
else
echo "command in the directory of $dir."
ldd $dir &> /dev/null
lib=ldd $dir |grep -Eo "/lib64/.*"|sed -r ‘s#(.*)\(.*\)#\1#‘
fi
cpall(){
mkdir -p /mnt/sysrootdirname $dir
mkdir -p /mnt/sysroot/lib64
cp -a $dir /mnt/sysroot$dir && echo ""$command" has been copied."
cp -a $lib /mnt/sysroot/lib64 && echo ""$command" lib has been copied."
}
cpall
fi
done

7、编写函数实现两个数字做为参数,返回最?值
[root@magedu ~]# vim max.sh

!/bin/sh

max() {
if [ $# -ne 2 ];then
echo "please enter two digits"
exit 1
else
if [[ $1 =~ ^-?[0-9]+$ ]] && [[ $2 =~ ^-?[0-9]+$ ]];then
if [ $1 -gt $2 ];then
echo $1
else
echo $2
fi
else
echo "please enter integer"
exit 2
fi
fi
}
max $1 $2

8、斐波那契数列?称??分割数列.
因数学家列昂纳多·斐波那契以兔子繁殖为例 子而引入,故又称为“兔子数列”,指的是这样一个数列: 0、 1、 1、 2、 3、 5、 8、 13、 21、 34、 ……,斐波纳契数列以如下被以递归的方法定义: F(0) =0, F(1) =1, F(n) =F(n-1)+F(n-2)(n≥2) 利用函数,求n阶斐波那契数列

[root@magedu ~]# vim fibonacci.sh

!/bin/sh

fibonacci(){
if [ $1 -eq 0 ];then
echo 0
elif [ $1 -le 1 ];then
echo 1
else
echo $[$(fibonacci $[$1-1])+$(fibonacci $[$1-2])]
fi
}
fibonacci $1

9、汉诺塔(?称河内塔)问题
是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且 规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用 函数,实现N片盘的汉诺塔的移动步骤

[root@magedu ~]# vim hannuota.sh

!/bin/sh

step=0
move (){
let step++
echo "$step: move disk $1 $2 -----> $3"
}
hanoi(){
if [ $1 -eq 1 ];then
move $1 $2 $4
else
hanoi "$[$1-1]" $2 $4 $3
move $1 $2 $4
hanoi "$[$1-1]" $3 $2 $4
fi
}
read -p "please input the number of plates: " number
hanoi $number A B C

1、输?若?个数值存?数组中,采?冒泡算法进?升序或降序排序
[root@magedu ~]# vim bubble.sh

!/bin/sh

declare -a rand
declare -i sub=
echo "Please input the numbers you want to sort:"
read -a rand
for ((i=0;i<${#rand[]}-1;i++));do
for ((j=0;j<${#rand[
]}-i-1;j++));do
if [ ${rand[$j]} -gt ${rand[$j+1]} ];then
sub=${rand[$j+1]}
rand[$j+1]=${rand[$j]}
rand[$j]=$sub
fi
done
done
echo "The numbers have been sorted:${rand[*]}"

2、将下图所?,实现转置矩阵matrix.sh
1 2 3 1 4 7
4 5 6 ===> 2 5 8
7 8 9 3 6 9

[root@magedu ~]# vim arrayconvert.sh

!/bin/sh

arr=([00]=1 [01]=2 [02]=3 [10]=4 [11]=5 [12]=6 [20]=7 [21]=8 [22]=9)
size=3
showmatrix () {
for ((i=0;i<size;i++));do
for ((j=0;j<size;j++));do
echo -e "${arr[$i$j]} \c"
done
echo
done
}
echo "Before convert"
showmatrix
for ((i=0;i<size;i++));do
for ((j=i;j<size;j++));do
if [ $i -ne $j ];then
temp=${arr[$i$j]}
arr[$i$j]=${arr[$j$i]}
arr[$j$i]=$temp
fi
done
done
echo "After convert"
showmatrix

3、打印杨辉三?形
[root@magedu ~]# vim yanghuisanjiao.sh

!/bin/sh

read -p "输入高度" g #g是最高行
declare -a a
for i in seq $g #$i是当前行
do
if [ $i -eq 1 ]
then
for o in seq $[$g-$i]
do
echo -n " "
done
a[1]=1
echo "1"
continue
fi
for j in seq $i #j表示当前行的第几个数字
do
if [ $j -eq 1 ]
then
for o in seq $[$g-$i]
do
echo -n " "
done
echo -n "1"
a[$i$j]=1
elif [ $j -eq $i ]
then
echo -n " 1"
a[$i$j]=1
else
let a[$i$j]=${a[$[i-1]$[j-1]]}+${a[$[i-1]$[j]]}
echo -n " ${a[$i$j]}"
fi
done
echo
done

shell脚本编程进阶面试题

上一篇:Linux(CentOS)卸载原有JDK


下一篇:linux操作系统