【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

你可能感兴趣的:(shell脚本,linux,运维,服务器,bash)