我們為你的面試準備選擇了 70 個你可能遇到的 shell 腳本面試問題及解答。了解腳本或至少知道基礎知識對系統管理者來說至關重要,它也有助于你在工作環境中自動完成很多任務。在過去的幾年裡,我們注意到所有的 linux 工作職位都要求腳本技能。

<a target="_blank"></a>
<code>./script argument</code>
例子 : 顯示檔案名稱腳本
<code>./show.sh file1.txt</code>
<code></code>
<code>cat show.sh</code>
<code>#!/bin/bash</code>
<code>echo $1</code>
(lctt 譯注:謝謝某匿名訪客的提醒,原題有誤,修改之。)
第一個參數 : $1,第二個參數 : $2
例子 : 腳本會複制檔案(arg1) 到目标位址(arg2)
<code>./copy.sh file1.txt /tmp/</code>
<code>cat copy.sh</code>
<code>cp $1 $2</code>
<code>$#</code>
<code>$0</code>
<code>$?</code>
<code>tail -1</code>
<code>head -1</code>
<code>awk '{print $3}'</code>
<code>awk '{ if ($1 == "find") print $2}'</code>
将 -xv 參數加到 #!/bin/bash 後
例子:
<code>#!/bin/bash –xv</code>
<code>function example() {</code>
<code>echo "hello world!"</code>
<code>}</code>
<code>v1="hello"</code>
<code>v2="world"</code>
<code>v3=${v1}${v2}</code>
<code>echo $v3</code>
輸出
<code>helloworld</code>
據匿名網友評論,本題原答案有誤,已經修正。
<code>v1=1</code>
<code>v2=2</code>
<code>let v3=$v1+$v2</code>
<code>3</code>
據 @kashu 的意見,本題的更佳回答為: 兩個整數相加,還有若幹種方法實作:
<code>a=5</code> <code>b=6</code> <code></code> <code>echo $(($a+$b)) # 方法 2</code> <code>echo $[$a+$b] # 方法 3</code> <code>expr $a + $b # 方法 4</code> <code>echo $a+$b | bc # 方法 5</code> <code>awk 'begin{print '"$a"'+'"$b"'}' # 方法 6</code>
<code>if [ -f /var/log/messages ]</code>
<code>then</code>
<code>echo "file exists"</code>
<code>fi</code>
<code>for i in $( ls ); do</code>
<code>echo item: $i</code>
<code>done</code>
<code>counter=0</code>
<code>while [ $counter -lt 10 ]; do</code>
<code>echo the counter is $counter</code>
<code>let counter=counter+1</code>
<code>counter=20</code>
<code>until [ $counter -lt 10 ]; do</code>
<code>echo counter $counter</code>
<code>let counter-=1</code>
<code>head -10 file|tail -1</code>
<code>#</code>
<code>0</code>
使變量在子 shell 中可用。
在腳本後面添加 “&”。
據 @kashu 的意見,更好的答案是:
<code>nohup command &</code> 大部分時間我們可能是遠端使用linux,我碰到過由于網絡斷線使得在背景運作的command &沒了...
使腳本所有者擁有可執行權限。
重定向輸出流到檔案或另一個流。
& - 希望腳本在背景運作的時候使用它
&& - 目前一個腳本成功完成才執行後面的指令/腳本的時候使用它
當條件滿足時需要運作多條指令的時候。
<code>my name is $name</code>
<code>variable</code>
' - 當我們不希望把變量轉換為值的時候使用它。
" - 會計算所有變量的值并用值代替。
在腳本檔案中添加 "exec >log.txt 2>&1" 指令。
<code>echo ${variable:x:y}</code>
<code>x - 起始位置</code>
<code>y - 長度</code>
例子:
<code>variable="my name is petras, and i am developer."</code>
<code>echo ${variable:11:6} # 會顯示 petras</code>
<code>echo ${variable#*:*:*:}</code>
或
<code>echo ${variable##*:}</code>
<code>echo ${variable%:*:*:*}</code>
<code>echo ${variable%%:*}</code>
<code>awk -f: '$3<100' /etc/passwd</code>
<code>cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g</code>
<code>do</code>
<code>{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2</code>
<code>ifs=":"</code>
<code>${#variable}</code>
<code>echo ${variable: -5}</code>
${variable:-10} - 如果之前沒有給 variable 指派則輸出 10;如果有指派則輸出該變量
${variable: -10} - 輸出 variable 的最後 10 個字元
<code>echo ${variable//pattern/replacement}</code>
<code>tr '[:lower:]' '[:upper:]'</code>
wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l
<code>set ${string}</code>
<code>echo $#</code>
<code>export variable</code>
<code>ls -d ?[ab]*</code>
<code>c=$((a+b))</code>
<code>c=`expr $a + $b`</code>
<code>c=`echo "$a+$b"|bc`</code>
<code>echo $string|tr -d " "</code>
<code>item="car"; echo "i like ${item}s"</code>
<code>for i in {0..100..3}; do echo $i; done</code>
<code>for (( i=0; i<=100; i=i+3 )); do echo "welcome $i times"; done</code>
<code>echo $*</code>
<code>echo $@</code>
[ $a == $b ] - 用于字元串比較
[ $a -eq $b ] - 用于數字比較
= - 用于為變量指派
== - 用于字元串比較
<code>[ $a -gt 12 ]</code>
<code>[ $b -le 12 ]</code>
<code>[[ $string == abc* ]]</code>
[[ $string == abc* ]] - 檢查字元串是否以字母 abc 開頭
[[ $string == "abc*" ]] - 檢查字元串是否完全等于 abc*
<code>egrep "^ab|^xy" /etc/passwd|cut -d: -f1</code>
背景最近執行指令的 pid.
前台最近指令的結束狀态。
<code>echo $$</code>
(lctt 譯注:和第3題重複了。)
$* - 以一個字元串形式輸出所有傳遞到腳本的參數
$@ - 以 $ifs 為分隔符列出所有傳遞到腳本中的參數
<code>array=("hi" "my" "name" "is")</code>
<code>echo ${array[0]}</code>
<code>echo ${array[@]}</code>
<code>echo ${!array[@]}</code>
<code>unset array[2]</code>
<code>array[333]="new_element"</code>
a) 通過參數
<code>./script param1 param2</code>
b) 通過 read 指令
<code>read -p "destination backup server : " desthost</code>
<code>/usr/bin/expect << eod</code>
<code>spawn rsync -ar ${line} ${desthost}:${destpath}</code>
<code>expect "*?assword:*"</code>
<code>send "${password}\r"</code>
<code>expect eof</code>
<code>eod</code>
祝你好運 !! 如果你有任何疑問或者問題需要解答都可以在下面的評論框中寫下來。讓我們知道這對你的面試有所幫助:-)
<b>原文釋出時間為:2015-06-12</b>
<b>本文來自雲栖社群合作夥伴“linux中國”</b>