shell面試題

2021-01-06

  1. 計(jì)算向腳本傳遞的參數(shù)個(gè)數(shù)
$#
  1. 在腳本中獲取腳本的名稱
$0
  1. 檢查上一條命令是否執(zhí)行成功
$?     # 值為0說(shuō)明執(zhí)行成功,非0則執(zhí)行失敗
  1. 獲取文件最后一行
tail  -1     # tail 為顯示最后10行
  1. 獲取文件第一行
head -1     # head 為顯示前10行
  1. 向腳本傳遞參數(shù)
./test.sh  file.txt
cat test.sh
#!/bin/bash
echo $1
######
輸出為:file.txt
  1. 在腳本中使用傳進(jìn)來(lái)的參數(shù)
bash  copy.sh  file.txt  /home/
cat copy.sh
#!/bin/bash
cp $1 $2
  1. 獲取一個(gè)文件每一行的第三個(gè)元素
awk { print $3 }     # -F" "  指定分隔符,不寫(xiě)-F的時(shí)候默認(rèn)分隔符為空格
  1. 找出以“FIRST”開(kāi)頭的行,并獲取這些行的第四個(gè)元素
awk { if ( $1 == "FIRST") print $4 }    #注意{}前后有空格,在命令行使用if時(shí)用(),在腳本中用[]
  1. 調(diào)試腳本的方式
# 在解釋器后面加  -xv
cat test.sh
#!/bin/bash -xv
  1. 定義函數(shù),并調(diào)用函數(shù)
cat aa.sh
#!/bin/bash
function test {
    echo "The first func!"  
}
test
######
輸出結(jié)果為:The first func!
  1. 連接兩個(gè)字符串
#  變量在賦值時(shí),等號(hào)左右兩邊不能有空格,與python的格式有區(qū)別
a='haha '
b='kk'
c=$a$b
echo $c
######
輸出結(jié)果為:haha kk
  1. 兩數(shù)相加
a=5
b=6
法1:let c=$a+$b
echo $c
法2:echo $[$a+$b]  (常用)
######
輸出結(jié)果為:11
  1. 檢查文件系統(tǒng)是否存在某個(gè)文件
if [ -f /var/log/messages ]
then
  echo "file exists"
fi
######
輸出結(jié)果為:file exists
  1. for循環(huán)語(yǔ)法
for i in $(ls);
do
  echo "item:$i"
done
例子:循環(huán)輸出1到10
法1:
for j in {1..10};
do
    echo $j
done
法2:
for k in `seq 1 10`;
do 
    echo $k
done
# seq 產(chǎn)生指定兩個(gè)數(shù)之間的所有整數(shù),默認(rèn)間隔為1
seq -5 2 5   # 換行輸出-5 到 5 之間的整數(shù),間隔為2
  1. while循環(huán)語(yǔ)法
#!/bin/bash
a=0
while [ $a -lt 10 ];
do
  a=$[ $a+1 ]
  echo $a
done
# a 的值小于10就+1,并打印+1之后a的值
  1. until循環(huán)語(yǔ)法
# until與while相反,當(dāng)滿足條件時(shí)停止循環(huán),不滿足條件則執(zhí)行循環(huán)
#!/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 腳本文件的第一個(gè)符號(hào)是什么 #
  2. 命令[ -z "" ] && echo 0 || echo 1的解釋和輸出是什么
[-z ''''] 的長(zhǎng)度為零則為真,&& 如果符號(hào)前面結(jié)果為真,就執(zhí)行符號(hào)后面的命令,反之不執(zhí)行,|| 如果符號(hào)前面的結(jié)果為真,就不執(zhí)行后面的命令,反之則執(zhí)行后面的命令,因此輸出為 0
  1. 命令 “export” 有什么用 ?
使變量在子shell中可用
  1. 在后臺(tái)運(yùn)行腳本
(1)在腳本后面加 $
(2)nohup command&
  1. chmod 500 test.sh 有什么用
使test.sh 的所有者擁有讀權(quán)限和執(zhí)行權(quán)限
  1. ">" 作用
重定向輸出流到文件或另一個(gè)流
  1. & 與 && 的區(qū)別
&:使腳本在后臺(tái)運(yùn)行
&&:符號(hào)前一個(gè)命令執(zhí)行成功,則執(zhí)行符號(hào)后面的命令看,反之不執(zhí)行
  1. name=kk && echo 'My name is $name' 輸出是什么
輸出為:My name is $name
正確寫(xiě)法:name=kk && echo "My name is $name",輸出為,My name is kk
  1. echo ${num:-cc} 輸出是什么
輸出為cc
解析,若num有賦值,則使用num的值,否則使用-后的值,相當(dāng)于設(shè)置默認(rèn)值
若num=2,則輸出為2
  1. '"的區(qū)別
':強(qiáng)引用,在單引號(hào)內(nèi)的所有內(nèi)容都被當(dāng)成字符串
":弱引用,在雙引號(hào)中可獲取變量的值,例子見(jiàn)27
  1. 在腳本文件中重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流到 log.txt文件
exec > log.txt  2>&1
  1. 只用echo獲取字符串的一部分
a=variable
echo ${a:0:3}
輸出為:vari(注意:空格也占一個(gè)位置)
  1. variable="User:123:321:/home/dir"用echo獲取路徑
echo ${variable#*:*:*:}  輸出為:/home/dir
# 解析:從variable這變量的開(kāi)頭(#)往后截取,*表示任何數(shù)據(jù),:表示字符串中的分隔符,需要截取的具體內(nèi)容在表達(dá)式不需要占位符
  1. variable="User:123:321:/home/dir"用echo獲取user這個(gè)字段
echo ${variable%*:*:*:}   輸出為:User
# 解析:%表示從后面往前截取
  1. 列出UID小于100的用戶
awk -F":" '$3<100' /etc/passwd

35. 寫(xiě)程序?yàn)橛脩粲?jì)算主組數(shù)目 并顯示次數(shù)和組名

#!/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中更改標(biāo)準(zhǔn)的域分隔符為:

IFS=":"
  1. 獲取變量的長(zhǎng)度
a="abcd"
echo ${#a}
輸出為:4
  1. 打印變量的最后5個(gè)字符
a=abcd
echo ${a: -3}   #注意分號(hào)后面有空格,沒(méi)有空格則效果如例28
輸出為:bcd
  1. 用echo替換字符串的一部分
a=aabcd
echo ${a//aa/kk}
輸出為:kkbcd

40. 哪個(gè)命令將命令替換成大寫(xiě)

tr '[:lower:]' '[:upper:]'
  1. 計(jì)算本地用戶數(shù)目
cat /etc/passwd | wc -l
  1. 計(jì)算字符串中的單詞數(shù)量
a="abc kkk lij uh xsjg yugdfc d dsc"
法1:echo $a | wc -w
法2:set ${a}
         echo $#
  1. export $abc 和 export abc 哪種寫(xiě)法正確
export abc
解析:export用于設(shè)置和顯示環(huán)境變量
export -p:列出所有環(huán)境變量
  1. 列出第二個(gè)字母是a或b的文件
ls -d ?[ab]*
  1. 去除字符串中的所有空格
a='jsad iuwef i jgibkh ljv'
echo $a | tr -d " "
解析: tr 命令用于轉(zhuǎn)換(替換)或刪除文件中的字符,-d 刪除
  1. 輸出數(shù)字0到100中3的倍數(shù),用命令行來(lái)寫(xiě)
法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. 打印傳遞給腳本的所有參數(shù)
echo $*  或  echo $@
  1. [ a ==b ] 和[ a -eqb ]的區(qū)別
[ $a == $b ]:用于字符串比較
[ $a -eq $b ]:用于數(shù)字比較
  1. = 和 == 的區(qū)別
=:用于變量賦值
==:用于字符串比較
  1. 測(cè)試$a是否大于10
[ $a -gt 10 ]
解析:-gt 大于    -lt 小于     -le 小于等于     -eq 等于
  1. 檢查字符串是否以“abc”開(kāi)頭
[ $string == abc* ]
  1. [[ string == abc* ]] 和 [[string == "abc" ]] 有什么區(qū)別
1.檢查字符串是否以字母abc開(kāi)頭
2.檢查字符串是否完全等于abc
  1. 列出以ab 或xy 開(kāi)頭的用戶名
egrep "^ab|^xy" /etc/passwd | cut -d: -f1
解析:egrep是grep的擴(kuò)展,支持更多re規(guī)則,若改用grep輸出為空
  1. 判斷文件夾是否為空
#!/bin/sh
##方法一 判斷輸出字符數(shù)統(tǒng)計(jì)為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    #當(dāng)文件大于0時(shí),返回True
  echo 'ths file is not empyt and file size:'
  du -sh file.sh  #打印文件大小
else
  echo 'empty!'
fi
  1. $! 表示什么
后臺(tái)最近執(zhí)行命令的pid
  1. $?表示什么
前臺(tái)最近命令的結(jié)束狀態(tài)
  1. 顯示當(dāng)前shell的pid
echo $$
  1. * 和@ 有什么區(qū)別
$*:以一個(gè)字符串形式輸出所有傳遞到腳本的參數(shù)
$@:以$IFS為分隔符列出所有傳遞到腳本的參數(shù)
  1. 在bash中定義數(shù)組
list=("a" "b" "c")
  1. 打印數(shù)組的第一個(gè)元素
echo ${list[0]}
  1. 打印數(shù)組的所有元素
echo ${list[@]}
  1. 輸出所有數(shù)組索引
echo ${!list[@]}
  1. 移除數(shù)組中索引為2的元素
unset list[2]
  1. 添加id為3的元素
list[3]="kk"
  1. 列出shell腳本獲取輸入的值的方法
法1:bash test.sh a b     #a b 為參數(shù)傳入腳本
法2:read -p "請(qǐng)輸入:"  variable
執(zhí)行命令或腳本時(shí)需要鍵盤(pán)輸入一個(gè)參數(shù),這個(gè)參數(shù)將賦值給variable
  1. expect的使用(自動(dòng)交互方法)
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD
  1. 用戶登錄Linux需要執(zhí)行的文件(有順序)
/etc/profile--->(~/.bash_profile )  ---> ~/.bashrc  ---> /etc/bashrc
  1. 獲取系統(tǒng)當(dāng)前時(shí)間(年月日時(shí)分秒)
date +%Y-%m-%d_%H:%M:%S
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、 Shell腳本是什么,它是必需的嗎?答:一個(gè)shell腳本是一個(gè)文本文件,包含一個(gè)或多個(gè)命令。作為系統(tǒng)的管理...
    心帝_w閱讀 780評(píng)論 0 2
  • 我們?yōu)槟愕拿嬖嚋?zhǔn)備選擇了 70 個(gè)你可能遇到的 shell 腳本面試問(wèn)題及解答。了解腳本或至少知道基礎(chǔ)知識(shí)對(duì)系統(tǒng)管...
    zwb_jianshu閱讀 1,234評(píng)論 0 1
  • 我們?yōu)槟愕拿嬖嚋?zhǔn)備選擇了 70 個(gè)你可能遇到的 shell 腳本面試問(wèn)題及解答。了解腳本或至少知道基礎(chǔ)知識(shí)對(duì)系統(tǒng)管...
    佛心看世界閱讀 14,042評(píng)論 0 31
  • 企業(yè)面試題: 1.批量生產(chǎn)隨機(jī)字符文件名 使用for循環(huán)在/oldboy目錄下批量創(chuàng)建10個(gè)html文件,期中每個(gè)...
    WhatGui_c607閱讀 1,520評(píng)論 0 0
  • 問(wèn)題1[金和網(wǎng)絡(luò)]:請(qǐng)用shell腳本寫(xiě)出查找當(dāng)前文件夾(/home)下所有的文本文件內(nèi)容中包含有字符”shen”...
    bigdata三十五畫(huà)生閱讀 1,139評(píng)論 0 0

友情鏈接更多精彩內(nèi)容