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. [ a ==b ] 和[ a -eqb ]的区别
[ $a == $b ]:用于字符串比较
[ $a -eq $b ]:用于数字比较
  1. = 和 == 的区别
=:用于变量赋值
==:用于字符串比较
  1. 测试$a是否大于10
[ $a -gt 10 ]
解析:-gt 大于    -lt 小于     -le 小于等于     -eq 等于
  1. 检查字符串是否以“abc”开头
[ $string == abc* ]
  1. [[ string == abc* ]] 和 [[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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容