【shell脚本】常见的shell脚本面试题目
1、请用shell脚本for,while,until这三种方式写出输出1到100的所有偶数的方法。
sum=0;for((i=0;i<=100;i+=2));do let sum+=i;done;echo $sum
sum=0;i=0;while [ $i -le 100 ];do let sum+=i;let i+=2;done;echo $sum
sum=0;i=0;until [ $i -gt 100 ];do let sum+=i;let i+=2;done;echo $sum
#!/bin/bash
sum=0
for((i=0;i<=100;i+=2))
do
let sum+=i
done
echo $sum
#!/bin/bash
sum=0
i=0
while [ $i -le 100 ]
do
let sum+=i
let i+=2
done
echo $sum
#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
let sum+=i
let i+=2
done
echo $sum
2、假设变量i=20 * 5,请用shell脚本格式写出4种方法输出 i 的值。
i=$[20*5]
i=$(expr 20 * 5)
i=`expr 20 * 5`
i=$((20*5))
let i=20*5 ##这个注意,是let在前面!!!
i=`echo 20*5|bc`
3、请通过在命令行中执行./output 20 30 输出20+30的值,脚本中使用sum()函数封装代码并通过调用sum函数返回结果,用2种方法返回结果。
##第一种
[root@localhost data]#vim output
#!/bin/bash
sum(){
local a=$1
local b=$2
echo $((${a}+${b}))
}
sum $1 $2
[root@localhost data]#chmod +x output
[root@localhost data]./output 20 30
##第二种
[root@localhost data]#vim output
#!/bin/bash
sum(){
echo $[${1}+${2}]
}
sum $1 $2
[root@localhost data]#chmod +x output
[root@localhost data]./output 20 30
4先mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,再用递归函数输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件
[root@localhost xh]#vim path.sh
#!/bin/bash
digui(){
for j in `ls $1`
do
if [ -d "$1/$j" ]
then
echo "$1/$j是目录"
digui "$1/$j" ##这里是递归调用自己
elif [ ! -x "$1/$j" ]
then
echo "$1/$j没有执行权限"
fi
done
}
方法一:
for((i=0;i<5;i++))
do
a[$i]=`echo $PATH|cut -d":" -f$[i+1]`
digui "${a[i]}" ##这里的调用函数
done
##方法二:使用类似c语言的用法
path=(`echo $PATH | sed 's/:/ /g'`)
l=${#path[*]}
for((i=0;i<$l;i++))
do
digui "${path[i]}"
done
##方法三:使用for i in
path=(`echo $PATH | sed 's/:/ /g'`)
for i in ${path[*]}
do
digui "${i}"
done
[root@localhost xh]#bash path.sh
/root/bin/aa是目录
/root/bin/aa/bb是目录
/root/bin/aa/bb/cc是目录
/root/bin/aa/bb/cc/dd是目录
/root/bin/aa/bb/cc/dd/abc.txt没有执行权限
5、请结合使用shell数组排序算法和linux命令两种方式把 123.txt 文件中的数字按照降序排序输出在同一行当中,并要求没有重复数字。
cat 123.txt
1 4 7 9 4
2 5 8 3 8
3 6 9 7 6
#!/bin/bash
sort_list(){
num=($1)
l=${#num[*]}
for((i=0;i<$l;i++))
do
for((j=0;j<$l-$i;j++))
do
one=${num[$j]}
k=j+1
two=${num[$k]}
if [[ $one -gt $two ]]
then
num[$k]=${one}
num[$j]=${two}
fi
done
done
echo ${num[*]}
}
uniq_list(){
un=($1)
l=${#un[*]}
for((i=0;i<$l;i++))
do
[ $i -eq 0 ] && echo -n "${un[$i]} "
[ ${un[$i]} -gt ${un[$i-1]} ] && echo -n "${un[$i]} "
done
echo
}
n=$(cat /data/123.txt|wc -l)
for((x=1;x<=$n;x++))
do
c=(`sed -n "${x}p" /data/123.txt`)
C=`sort_list "${c[*]}"`
uniq_list "${C[*]}"
done
#c=(`sed -n '1p' /data/123.txt`)
#C=`sort_list "${c[*]}"`
#uniq_list "${C[*]}"
##
#b=(`sed -n '2p' /data/123.txt`)
#B=`sort_list "${b[*]}"`
#uniq_list "${B[*]}"
##
#e=(`sed -n '3p' /data/123.txt`)
#E=`sort_list "${e[*]}"`
#uniq_list "${E[*]}"
方法二:
[root@localhost /data]#cat sort.sh
#!/bin/bash
uniq_list(){
num=($1)
l=${#num[*]}
for((i=0;i<$l;i++))
do
[ $i -eq 0 ]&& echo -n "${num[$i]} "
[ ${num[$i]} -gt ${num[$i-1]} ]&& echo -n "${num[$i]} "
done
echo
}
sort_list(){
num=($1)
l=${#num[*]}
for((i=0;i<$l-1;i++))
do
for((j=$i+1;$j<$l;j++))
do
if [ ${num[$i]} -gt ${num[$j]} ]
then
tmp=${num[$j]}
num[$j]=${num[$i]}
num[$i]=${tmp}
fi
done
done
echo ${num[*]}
}
n=$(cat /data/123.txt|wc -l)
for((x=1;x<=$n;x++))
do
c=(`sed -n "${x}p" /data/123.txt`)
C=`sort_list "${c[*]}"`
uniq_list "${C[*]}"
done
6、假设 file.txt 内容如下,请在grep,egrep,sed,awk中至少2种命令输出有效的号码:987 456-1230和(123) 456-7890,要求至少要有一种方法使用正则表达式匹配完整的号码。
cat file.txt
987-123-5430
987 456-1230
(123) 456-7890
方法一:
[root@localhost /data]#egrep "(-|\) )+[1-6]{3}-[0-9]{4}" tel.txt
987-123-5430
(123) 456-7890
##长一点
egrep "[()]?[0-9]{3}(-|\) )+[1-6]{3}-[0-9]{4}" tel.txt
方法二:
[root@localhost /data]#sed -nr "/(-|\) )+[1-6]{3}-[0-9]{4}/p" tel.txt
987-123-5430
(123) 456-7890
##长一点
sed -nr "/[(]?[0-9]{3}(-|\) )+[1-6]{3}-[0-9]{4}/p" tel.txt
7.遍历/data/resources/下的文件,找出大于200M的文件,判断其若以“tar”结尾,则使用rm删除;若以“log“结尾,则清空该文件。
[root@localhost /data]#cat tarlog.sh
#!/bin/bash
find_f(){
file=(`ls $1`)
for i in ${file[*]}
do
[[ $i == *.tar ]] && rm -rf ${1}/${i}
[[ $i == *.log ]] && echo " " > ${1}/${i}
[ -d $1/$i ] && find_f "${1}/${i}" ##这里是递归调用自己,因为是目录的话,需要在递归往下寻找
done
}
find_f $1
find_f "/data/resources"
8.(4分)有一个文件b.txt,内容如下:
[root@localhost test]# cat b.txt
http://www.baidu.com/index.html
http://www.google.com/index.html
http://www.baidu.com/get.html
http://www.baidu.com/set.html
http://www.google.com/index.html
http://www.yahoo.com.cn/put.html
8、现要求使用 两种 方法将该文件中的域名截取出来,统计重复域名出现的次数,然后按次数进行降序排列,统计后的结果如下:
3 www.baidu.com
2 www.google.com
1 www.yahoo.com.cn
方法一:
cat b.txt |tr -s "/"|cut -d"/" -f2|sort|uniq -c
方法二:
cat b.txt |awk -F"/" '{print $3}'|sort|uniq -c
方法三:表示把每一行进行分类,任意://(域名)/任意,只想要括号的内容\1
cat b.txt |sed -nr "s@.*://(.*)/.*@\1@p"|sort|uniq -c
3 www.baidu.com
2 www.google.com
1 www.yahoo.com.cn