shell面试题

2021-01-06

  1. 计算向脚本传递的参数个数
$#
  1. 在脚本中获取脚本的名称
$0
  1. 检查上一条命令是否执行成功
$?     # 值为0说明执行成功,非0则执行失败
  1. 获取文件最后一行
tail  -1     # tail 为显示最后10行
  1. 获取文件第一行
head -1     # head 为显示前10行
  1. 向脚本传递参数
./test.sh  file.txt
cat test.sh
#!/bin/bash
echo $1
######
输出为:file.txt
  1. 在脚本中使用传进来的参数
bash  copy.sh  file.txt  /home/
cat copy.sh
#!/bin/bash
cp $1 $2
  1. 获取一个文件每一行的第三个元素
awk { print $3 }     # -F" "  指定分隔符,不写-F的时候默认分隔符为空格
  1. 找出以“FIRST”开头的行,并获取这些行的第四个元素
awk { if ( $1 == "FIRST") print $4 }    #注意{}前后有空格,在命令行使用if时用(),在脚本中用[]
  1. 调试脚本的方式
# 在解释器后面加  -xv
cat test.sh
#!/bin/bash -xv
  1. 定义函数,并调用函数
cat aa.sh
#!/bin/bash
function test {
    echo "The first func!"  
}
test
######
输出结果为:The first func!
  1. 连接两个字符串
#  变量在赋值时,等号左右两边不能有空格,与python的格式有区别
a='haha '
b='kk'
c=$a$b
echo $c
######
输出结果为:haha kk
  1. 两数相加
a=5
b=6
法1:let c=$a+$b
echo $c
法2:echo $[$a+$b]  (常用)
######
输出结果为:11
  1. 检查文件系统是否存在某个文件
if [ -f /var/log/messages ]
then
  echo "file exists"
fi
######
输出结果为:file exists
  1. for循环语法
for i in $(ls);
do
  echo "item:$i"
done
例子:循环输出1到10
法1:
for j in {1..10};
do
    echo $j
done
法2:
for k in `seq 1 10`;
do 
    echo $k
done
# seq 产生指定两个数之间的所有整数,默认间隔为1
seq -5 2 5   # 换行输出-5 到 5 之间的整数,间隔为2
  1. while循环语法
#!/bin/bash
a=0
while [ $a -lt 10 ];
do
  a=$[ $a+1 ]
  echo $a
done
# a 的值小于10就+1,并打印+1之后a的值
  1. until循环语法
# until与while相反,当满足条件时停止循环,不满足条件则执行循环
#!/bin/bash
a=10
until [ $a -lt 5 ];
do
  let a-=1
  echo $a
done
  1. 常用解释器
#!/bin/bash
#!/usr/bin/python
  1. 获取文件第10行
head -10 file | tail -1
  1. bash 脚本文件的第一个符号是什么 #
  2. 命令[ -z "" ] && echo 0 || echo 1的解释和输出是什么
[-z ''''] 的长度为零则为真,&& 如果符号前面结果为真,就执行符号后面的命令,反之不执行,|| 如果符号前面的结果为真,就不执行后面的命令,反之则执行后面的命令,因此输出为 0
  1. 命令 “export” 有什么用 ?
使变量在子shell中可用
  1. 在后台运行脚本
(1)在脚本后面加 $
(2)nohup command&
  1. chmod 500 test.sh 有什么用
使test.sh 的所有者拥有读权限和执行权限
  1. ">" 作用
重定向输出流到文件或另一个流
  1. & 与 && 的区别
&:使脚本在后台运行
&&:符号前一个命令执行成功,则执行符号后面的命令看,反之不执行
  1. name=kk && echo 'My name is $name' 输出是什么
输出为:My name is $name
正确写法:name=kk && echo "My name is $name",输出为,My name is kk
  1. echo ${num:-cc} 输出是什么
输出为cc
解析,若num有赋值,则使用num的值,否则使用-后的值,相当于设置默认值
若num=2,则输出为2
  1. '"的区别
':强引用,在单引号内的所有内容都被当成字符串
":弱引用,在双引号中可获取变量的值,例子见27
  1. 在脚本文件中重定向标准输出和标准错误流到 log.txt文件
exec > log.txt  2>&1
  1. 只用echo获取字符串的一部分
a=variable
echo ${a:0:3}
输出为:vari(注意:空格也占一个位置)
  1. variable="User:123:321:/home/dir"用echo获取路径
echo ${variable#*:*:*:}  输出为:/home/dir
# 解析:从variable这变量的开头(#)往后截取,*表示任何数据,:表示字符串中的分隔符,需要截取的具体内容在表达式不需要占位符
  1. variable="User:123:321:/home/dir"用echo获取user这个字段
echo ${variable%*:*:*:}   输出为:User
# 解析:%表示从后面往前截取
  1. 列出UID小于100的用户
awk -F":" '$3<100' /etc/passwd

35. 写程序为用户计算主组数目 并显示次数和组名

#!/bin/bash
cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
do
  { echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
done

36. 如何在bash shell中更改标准的域分隔符为:

IFS=":"
  1. 获取变量的长度
a="abcd"
echo ${#a}
输出为:4
  1. 打印变量的最后5个字符
a=abcd
echo ${a: -3}   #注意分号后面有空格,没有空格则效果如例28
输出为:bcd
  1. 用echo替换字符串的一部分
a=aabcd
echo ${a//aa/kk}
输出为:kkbcd

40. 哪个命令将命令替换成大写

tr '[:lower:]' '[:upper:]'
  1. 计算本地用户数目
cat /etc/passwd | wc -l
  1. 计算字符串中的单词数量
a="abc kkk lij uh xsjg yugdfc d dsc"
法1:echo $a | wc -w
法2:set ${a}
         echo $#
  1. export $abc 和 export abc 哪种写法正确
export abc
解析:export用于设置和显示环境变量
export -p:列出所有环境变量
  1. 列出第二个字母是a或b的文件
ls -d ?[ab]*
  1. 去除字符串中的所有空格
a='jsad iuwef i jgibkh ljv'
echo $a | tr -d " "
解析: tr 命令用于转换(替换)或删除文件中的字符,-d 删除
  1. 输出数字0到100中3的倍数,用命令行来写
法1:for i in {0..100..3}; do echo $i; done
法2:for (( i=0; i<=100; i=i+3 )); do echo "$i"; done
  1. 打印传递给脚本的所有参数
echo $*  或  echo $@
  1. [ b ] 和[ b ]的区别
[ $a == $b ]:用于字符串比较
[ $a -eq $b ]:用于数字比较
  1. = 和 == 的区别
=:用于变量赋值
==:用于字符串比较
  1. 测试$a是否大于10
[ $a -gt 10 ]
解析:-gt 大于    -lt 小于     -le 小于等于     -eq 等于
  1. 检查字符串是否以“abc”开头
[ $string == abc* ]
  1. [[ string == "abc" ]] 有什么区别
1.检查字符串是否以字母abc开头
2.检查字符串是否完全等于abc
  1. 列出以ab 或xy 开头的用户名
egrep "^ab|^xy" /etc/passwd | cut -d: -f1
解析:egrep是grep的扩展,支持更多re规则,若改用grep输出为空
  1. 判断文件夹是否为空
#!/bin/sh
##方法一 判断输出字符数统计为0
is_empty_dir(){ 
    return `ls -A $1|wc -w`
}
##方法二 判断输出string为空
is_empty_dir(){ 
   return $[ -z `ls -A $1` ]
}

if is_empty_dir $1
then
    echo " $1 is empty"
else
    echo " $1 is not empty"    
fi
  1. 判断文件是否为空,不为空则打印文件大小
#! /bin/bash
if [ -s ./file.sh ] ; then    #当文件大于0时,返回True
  echo 'ths file is not empyt and file size:'
  du -sh file.sh  #打印文件大小
else
  echo 'empty!'
fi
  1. $! 表示什么
后台最近执行命令的pid
  1. $?表示什么
前台最近命令的结束状态
  1. 显示当前shell的pid
echo $$
  1. @ 有什么区别
$*:以一个字符串形式输出所有传递到脚本的参数
$@:以$IFS为分隔符列出所有传递到脚本的参数
  1. 在bash中定义数组
list=("a" "b" "c")
  1. 打印数组的第一个元素
echo ${list[0]}
  1. 打印数组的所有元素
echo ${list[@]}
  1. 输出所有数组索引
echo ${!list[@]}
  1. 移除数组中索引为2的元素
unset list[2]
  1. 添加id为3的元素
list[3]="kk"
  1. 列出shell脚本获取输入的值的方法
法1:bash test.sh a b     #a b 为参数传入脚本
法2:read -p "请输入:"  variable
执行命令或脚本时需要键盘输入一个参数,这个参数将赋值给variable
  1. expect的使用(自动交互方法)
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD
  1. 用户登录Linux需要执行的文件(有顺序)
/etc/profile--->(~/.bash_profile )  ---> ~/.bashrc  ---> /etc/bashrc
  1. 获取系统当前时间(年月日时分秒)
date +%Y-%m-%d_%H:%M:%S

你可能感兴趣的:(shell面试题)