天天看點

Linux Shell 腳本知識點

正規表達式線上生成工具: http://tools.jb51.net/regex/create_reg

0. shell 調試

複制代碼 代碼如下:

sh -x somefile.sh

在somefile.sh 檔案裡加上set+x set-x

1. 用 && || 簡化if else

複制代碼 代碼如下:

gzip -t a.tar.gz

if [[ 0 == $? ]]; then

    echo "good zip"

else

    echo "bad zip"

fi

可以簡化為:

複制代碼 代碼如下:

gzip  -t a.tar.gz && echo "good zip" || echo "bad zip"

2. 判斷檔案非空

複制代碼 代碼如下:

if [[ -s $file ]]; then

    echo "not empty"

fi

3. 擷取檔案大小

複制代碼 代碼如下:

stat -c %s $file

stat --printf='%s\n' $file

wc -c $file

4. 字元串替換

複制代碼 代碼如下:

${string//pattern/replacement}

a='a,b,c'

echo ${a//,/ /}

5. Contains 子字元串?

string="My string"

if [[ $string == *My* ]]; then

    echo "It's there!"

fi

6. rsync備份

複制代碼 代碼如下:

rsync -r -t -v /source_folder /destination_folder

rsync -r -t -v /source_folder [[email protected]:/destination_folder

7. 批量重命名檔案

為所有txt檔案加上.bak 字尾:

複制代碼 代碼如下:

rename '.txt' '.txt.bak' *.txt

去掉所有的bak字尾:

複制代碼 代碼如下:

rename '*.bak' '' *.bak

把所有的空格改成下劃線:

複制代碼 代碼如下:

find path -type f -exec rename 's/ /_/g' {} \;

把檔案名都改成大寫:

複制代碼 代碼如下:

find path -type f -exec rename 'y/a-z/A-Z/' {} \;

8. for/while 循環

複制代碼 代碼如下:

for ((i=0; i < 10; i++)); do echo $i; done

for line in $(cat a.txt); do echo $line; done

for f in *.txt; do echo $f; done

while read line ; do echo $line; done < a.txt

cat a.txt | while read line; do echo $line; done

9. 删除空行

複制代碼 代碼如下:

cat a.txt | sed -e '/^$/d'

(echo "abc"; echo ""; echo "ddd";) | awk '{if (0 != NF) print $0;}'

10. 比較檔案的修改時間

複制代碼 代碼如下:

` file1`.`txt -nt file2`.`txt ` && echo true || echo false

` file1`.`txt -ot file2`.`txt ` && echo true || echo false

11. 實作Dictionary結構

複制代碼 代碼如下:

hput() {

        eval "hkey_$1"="$2"

}

hget() {

        eval echo '${'"hkey_$1"'}'

        }

$ hput k1 aaa

$ hget k1

aaa

12. 去掉第二列

複制代碼 代碼如下:

$echo 'a b c d e f' | cut -d ' ' -f1,3-

$a c d e f

13. 把stderr輸出儲存到變量

複制代碼 代碼如下:

$ a=$( (echo 'out'; echo 'error' 1>&2) 2>&1 1>/dev/null)

$ echo $a

error

14. 删除前3行

複制代碼 代碼如下:

$cat a.txt | sed 1,3d

15. 讀取多個域到變量

複制代碼 代碼如下:

read a b c <<< "xxx yyy zzz"

16. 周遊數組

複制代碼 代碼如下:

array=( one two three )

for i in ${array[@]}

        do

echo $i

done

17. 檢視目錄大小

複制代碼 代碼如下:

$ du –sh ~/apps

18. 檢視CPU資訊

複制代碼 代碼如下:

$ cat /proc/cpuinfo

19. date

複制代碼 代碼如下:

$ date +%Y-%m-%d

2012-12-24

$ date +%Y-%m-%d –date ‘-1 day'

2012-12-23

$ date +%Y-m-%d –date ‘Dec 25'

2011-12-25

$ date +%Y-m-%d –date ‘Dec 25 – 10 days'

2011-12-15

20. 擷取路徑名和檔案名

複制代碼 代碼如下:

$ dirname ‘/home/lalor/a.txt'

/home/lalor

$ basename ‘/home/lalor/a.txt'

a.txt

21. 并集和交集

comm 可以用來求并集,交集,差集,假設現在有兩個檔案a和b,它們的内容如下:

複制代碼 代碼如下:

$cat a

1

3

5

$cat b

3

4

5

6

7

$comm a b

1

        3

    4

        5

    6

    7

$comm -1 -2 a b #交集

3

5

$comm a b | sed 's/\t//g' #并集

1

2

3

4

5

6

7

$comm -1 -3 a b | sed 's/\t//g' #b-a

4

6

7

22. awk複雜分隔符

多字元作分隔符

複制代碼 代碼如下:

$ echo "a||b||c||d" | awk -F '[|][|]' '{print $3}'

  c

多種分隔符1

複制代碼 代碼如下:

$echo "a||b,#c d" | awk -F '[| ,#]+' '{print $4}'

  d

多種分隔符2

複制代碼 代碼如下:

$echo "a||b##c|#d" | awk -F '([|][|])|([#][#])' '{print $NF}'

  c|#d

23. 産生一個随機數

複制代碼 代碼如下:

echo $RANDOM

24. 按照模式split 檔案

複制代碼 代碼如下:

csplit server.log /PATTERN/ -n 2 -s {*} -f server_result -b "%02d.log" -z

/PATTERN/ 用來比對某一行,分割過程由此開始

{*} 根據比對,重複執行分割

-s 靜默模式

-n 分割後檔案名字尾中,數字的個數

-f 分割後的檔案名字首

-b 指定字尾格式

25. 擷取檔案名或者擴充名

複制代碼 代碼如下:

var=hack.fun.book.txt

echo ${var%.*}

hack.fun.book

echo ${var%%.*}

hack

echo ${var#.*}

fun.book.txt

echo ${var##.*}

txt

26. 以 root 帳戶執行上一條指令。

複制代碼 代碼如下:

$sudo !!

其中: * !! 是指上一條指令 * !$ 上一條指令的最後一個參數 * !* 上一條指令的所有參數 * !:3 上一條指令的第3個參數

例如:

複制代碼 代碼如下:

$ls /tmp/somedir

 ls: cannot access /tmp/somedir: No such file or directory

$mkdir !$

 madir /tmp/somedir

27. 利用 python 搭建一個簡單的 Web 伺服器,可通過 http://$HOSTNAME:8000 通路。

複制代碼 代碼如下:

python -m SimpleHTTPServer

28. 在 Vim 中無需權限儲存編輯的檔案。

複制代碼 代碼如下:

:w !sudo tee %

29. 将上一條指令中的 foo 替換為 bar,并執行。

複制代碼 代碼如下:

^foo^bar

30. 快速備份或複制檔案。

複制代碼 代碼如下:

cp filename{,.bak}

31. 将 ssh keys 複制到 [email protected] 以啟用無密碼 SSH 登入。

複制代碼 代碼如下:

$ssh-copy-id [email protected]

32. 把 linux 桌面錄制為視訊。

複制代碼 代碼如下:

ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

33. man 妙用

複制代碼 代碼如下:

man ascii

man test

34. 在 vim 中編輯上一條指令

複制代碼 代碼如下:

fc

35. 删除0 位元組檔案或垃圾檔案

複制代碼 代碼如下:

find . -type f -size 0 -delete

find . -type f -exec rm -rf {} \;

find . -type f -name "a.out" -exec rm -rf {} \;

find . type f -name "a.out" -delete

find . type f -name "*.txt" -print0 | xargs -0 rm -f

36. 在編寫SHELL 時顯示多行資訊

複制代碼 代碼如下:

cat << EOF

+--------------------------------------------------------------+

| === Welcome to Tunoff services === |

+--------------------------------------------------------------+

EOF

注意,在指定結束符時,它必須是該行的唯一内容,并且該行必須以這個字元開頭。

37. 如何給mysql建軟連結

複制代碼 代碼如下:

cd /usr/local/mysql/bin

for i in *

do ln /usr/local/mysql/bin/$i /usr/bin/$i

done

38. 擷取IP位址:

複制代碼 代碼如下:

ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6-

39. 打開檔案數目

複制代碼 代碼如下:

lsof

40. 清除僵屍程序

複制代碼 代碼如下:

ps -eal | awk '{ if ($2 == "Z"){ print $4}}' | kill -9

41. 列印唯一行

複制代碼 代碼如下:

awk '!a[$0]++' file

42. 列印奇數行

複制代碼 代碼如下:

awk 'i=!i' file

awk 'NR%2' file

43. 列印比對行後的某一行

複制代碼 代碼如下:

seq 10 | awk '/4/{f=4};--f==0{print;exit}'

44. 列印某行後後面的10行

複制代碼 代碼如下:

cat file | grep -A100 string

cat file | grep -B100 string #前面

cat file | grep -C100 string #前後

sed -n '/string/,+100p'

awk '/string/{f=100}--f>=0'

45. 擷取指令行最後一個參數

複制代碼 代碼如下:

echo ${!#}

echo ${$#} #錯誤的嘗試

46. 輸出重定向

如果你願你,可以将STDERR 和 STDOUT 的輸出重定向到一個輸出檔案,為此,bash 提供了特殊的重定向符号 &>

複制代碼 代碼如下:

ls file nofile &> /dev/null

我們如何在腳本裡面重定向呢?沒有什麼特别之處,和普通重定向一樣。

複制代碼 代碼如下:

#!/bin/bash

#redirecting output to different locations

echo "now redirecting all output to another location" &>/dev/null

問題就來了,如果我們要将所有的輸出都重定向到某個檔案呢?我們都不希望每次輸出的時候都重定向一下吧,正所謂,山人自有妙計。我們可以用exec 來永久重定向,如下所示:

複制代碼 代碼如下:

#!/bin/bash

#redirecting output to different locations

exec 2>testerror

echo "This is the start of the script"

echo "now redirecting all output to another location"

exec 1>testout

echo "This output should go to testout file"

echo "but this should go the the testerror file" >& 2

輸出結果如下所示:

複制代碼 代碼如下:

This is the start of the script

now redirecting all output to another location

[email protected]:~/temp$ cat testout

This output should go to testout file

[email protected]:~/temp$ cat testerror

but this should go the the testerror file

[email protected]:~/temp$

以追加的方式重定向:

複制代碼 代碼如下:

exec 3 >> testout

取消重定向:

複制代碼 代碼如下:

exec 3> -

47. 函數

任何地方定義的變量都是全局變量,如果要定義局部變量,需加local 關鍵字

shell中的函數也可以用遞歸

複制代碼 代碼如下:

#!/bin/bash

  function factorial {

      if [[ $1 -eq 1 ]]; then

          echo 1

      else

          local temp=$[ $1 - 1 ]

          local result=`factorial $temp`

          echo $[ $result * $1 ]

      fi

  }

  result=`factorial 5`

  echo $result

建立函數庫

将函數定一個在另一個檔案,然後通過source 指令加載到目前檔案

在指令行使用函數

将函數定義在~/.bashrc 中即可

向函數傳遞數組

複制代碼 代碼如下:

#!/bin/bash

  #adding values in an array

  function addarray {

      local sum=0

      local newarray

      newarray=(`echo "$@"`)

      for value in ${newarray[*]}

      do

          sum=$[ $sum+$value ]

      done

      echo $sum

  }

  myarray=(1 2 3 4 5)

  echo "The original array is: ${myarray[*]}"

  arg1=`echo ${myarray[*]}`

  result=`addarray $arg1`

  echo "The result is $result"

48.正規表達式

比對中文字元的正規表達式:[u4e00-u9fa5]

評注:比對中文還真是個頭疼的事,有了這個表達式就好辦了

比對雙位元組字元(包括漢字在内):[^x00-xff]

評注:可以用來計算字元串的長度(一個雙位元組字元長度計2,ASCII字元計1)

比對空白行的正規表達式:^ *$

評注:可以用來删除空白行

比對HTML标記的正規表達式:<(S*?)[^>]*>.*?</1>|<.*? />

評注:網上流傳的版本太糟糕,上面這個也僅僅能比對部分,對于複雜的嵌套标記依舊無能為力

比對首尾空白字元的正規表達式:^s*|s*$

評注:可以用來删除行首行尾的空白字元(包括空格、制表符、換頁符等等),非常有用的表達式

比對Email位址的正規表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

評注:表單驗證時很實用

比對網址URL的正規表達式:[a-zA-z]+://[^s]*

評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

比對帳号是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

評注:表單驗證時很實用

比對國内電話号碼:d{3}-d{8}|d{4}-d{7}

評注:比對形式如0511-4405222或021-87888822

比對騰訊QQ号:[1-9][0-9]{4,}

評注:騰訊QQ号從10000開始

比對中國郵政編碼:[1-9]d{5}(?!d)

評注:中國郵政編碼為6位數字

比對×××:d{15}|d{18}

評注:中國的×××為15位或18位

比對ip位址:d+.d+.d+.d+

評注:提取ip位址時有用

比對特定數字:

^[1-9]d*$  //比對正整數

^-[1-9]d*$ //比對負整數

^-?[1-9]d*$  //比對整數

^[1-9]d*|0$ //比對非負整數(正整數+ 0)

^-[1-9]d*|0$  //比對非正整數(負整數+ 0)

^[1-9]d*.d*|0.d*[1-9]d*$  //比對正浮點數

^-([1-9]d*.d*|0.d*[1-9]d*)$ //比對負浮點數

^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //比對浮點數

^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$  //比對非負浮點數(正浮點數+ 0)

^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //比對非正浮點數(負浮點數+ 0)

評注:處理大量資料時有用,具體應用時注意修正

比對特定字元串:

^[A-Za-z]+$  //比對由26個英文字母組成的字元串

^[A-Z]+$  //比對由26個英文字母的大寫組成的字元串

^[a-z]+$  //比對由26個英文字母的小寫組成的字元串

^[A-Za-z0-9]+$  //比對由數字和26個英文字母組成的字元串

^w+$  //比對由數字、26個英文字母或者下劃線組成的字元串

Q:1 Shell腳本是什麼、它是必需的嗎?

答:一個Shell腳本是一個文本檔案,包含一個或多個指令。作為系統管理者,我們經常需要使用多個指令來完成一項任務,我們可以添加這些所有指令在一個文本檔案(Shell腳本)來完成這些日常工作任務。

Q:2 什麼是預設登入shell,如何改變指定使用者的登入shell

答:在Linux作業系統,“

/bin/bash

”是預設登入shell,是在建立使用者時配置設定的。使用chsh指令可以改變預設的shell。示例如下所示:

# chsh <使用者名> -s <新shell># chsh linuxtechi -s /bin/sh      

Q:3 可以在shell腳本中使用哪些類型的變量?

答:在shell腳本,我們可以使用兩種類型的變量:

  • 系統定義變量
  • 使用者定義變量

系統變量是由系統系統自己建立的。這些變量通常由大寫字母組成,可以通過“

set

”指令檢視。

使用者變量由系統使用者來生成和定義,變量的值可以通過指令“

echo $<變量名>

”檢視。

Q:4 如何将标準輸出和錯誤輸出同時重定向到同一位置?

答:這裡有兩個方法來實作:

方法一:

2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )      

方法二:

&> (如# ls /usr/share/doc &> out.txt )      

Q:5 shell腳本中“if”文法如何嵌套?

答:基礎文法如下:

if [ 條件 ]then指令1指令2…..elseif [ 條件 ]then指令1指令2….else指令1指令2…..fifi      

Q:6 shell腳本中“

$?

”标記的用途是什麼?

答:在寫一個shell腳本時,如果你想要檢查前一指令是否執行成功,在if條件中使用“

$?

”可以來檢查前一指令的結束狀态。簡單的例子如下:

[email protected]:~# ls /usr/bin/shar/usr/bin/shar
[email protected]:~# echo $?0      

如果結束狀态是0,說明前一個指令執行成功。

[email protected]:~# ls /usr/bin/sharels: cannot access /usr/bin/share: No such file or directory
[email protected]:~# echo $?2      

如果結束狀态不是0,說明指令執行失敗。

Q:7 在shell腳本中如何比較兩個數字 ?

答:在

if-then

中使用測試指令(

-gt

等)來比較兩個數字,例子如下:

#!/bin/bashx=10y=20if [ $x -gt $y ]thenecho “x is greater than y”elseecho “y is greater than x”fi      

Q:8 shell腳本中break指令的作用 ?

答:

break

指令一個簡單的用途是退出執行中的循環。我們可以在while和until循環中使用

break

指令跳出循環。

Q:9 shell腳本中continue指令的作用 ?

答:

continue

指令不同于

break

指令,它隻跳出目前循環的疊代,而不是整個循環。

continue

指令很多時候是很有用的,例如錯誤發生,但我們依然希望繼續執行大循環的時候。

Q:10 告訴我shell腳本中Case語句的文法 ?

答:基礎文法如下:

case 變量 in值1)指令1指令2…..最後指令!! 值2)指令1指令2……最後指令;;esac      

Q:11 shell腳本中while循環文法 ?

答:如同for循環,while循環隻要條件成立就重複它的指令塊。不同于for循環,while循環會不斷疊代,直到它的條件不為真。基礎文法:

while [ 條件 ]do指令…done      

Q:12 如何使腳本可執行 ?

答:使用

chmod

指令來使腳本可執行。例子如下:

# chmod a+x myscript.sh      

Q:13 “

#!/bin/bash

”的作用 ?

答:

#!/bin/bash

是shell腳本的第一行,稱為釋伴(shebang)行。這裡

#

符号叫做hash,而

!

叫做 bang。它的意思是指令通過

/bin/bash

來執行。

Q:14 shell腳本中for循環文法 ?

答:for循環的基礎文法:

for 變量 in 循環清單do指令1指令2….最後指令done      

Q:15 如何調試shell腳本 ?

答:使用'

-x

'參數(

sh -x myscript.sh

)可以調試shell腳本。另一個種方法是使用‘

-nv

’參數(

sh -nv myscript.sh

)。

Q:16 shell腳本如何比較字元串?

答:

test

指令可以用來比較字元串。測試指令會通過比較字元串中的每一個字元來比較。

Q:17 Bourne shell(bash) 中有哪些特殊的變量 ?

答:下面的表列出了

Bourne shell

為指令行設定的特殊變量。

Linux Shell 腳本知識點

Q:18 在shell腳本中,如何測試檔案 ?

答:

test

指令可以用來測試檔案。基礎用法如下表格:

Linux Shell 腳本知識點

Q:19 在shell腳本中,如何寫入注釋 ?

答:注釋可以用來描述一個腳本可以做什麼和它是如何工作的。每一行注釋以

#

開頭。例子如下:

#!/bin/bash# This is a commandecho “I am logged in as $USER”      

Q:20 如何讓 shell 就腳本得到來自終端的輸入?

答:

read

指令可以讀取來自終端(使用鍵盤)的資料。

read

指令得到使用者的輸入并置于你給出的變量中。例子如下:

# vi /tmp/test.sh#!/bin/bashecho ‘Please enter your name’read name
echo “My Name is $name”# ./test.shPlease enter your nameLinuxTechiMy Name is LinuxTechi      

Q:21 如何取消變量或取消變量指派 ?

答:“

unset

”指令用于取消變量或取消變量指派。文法如下所示:

# unset <變量名>      

Q:22 如何執行算術運算 ?

答:有兩種方法來執行算術運算:

1.使用

expr

指令(# expr 5 + 2)

2.用一個美元符号和方括号(

$[ 表達式 ]

)例如:

test=$[16 + 4] ; test=$[16 + 4]

Q:23 do-while語句的基本格式 ?

答:do-while語句類似于while語句,但檢查條件語句之前先執行指令(LCTT 譯注:意即至少執行一次。)。下面是用do-while語句的文法

do{指令} while (條件)      

Q:24 在shell腳本如何定義函數呢 ?

答:函數是擁有名字的代碼塊。當我們定義代碼塊,我們就可以在我們的腳本調用函數名字,該塊就會被執行。示例如下所示:

$ diskusage () { df -h ; }譯注:下面是我給的shell函數文法,原文沒有[ function ] 函數名 [()] { 
  指令; 
  [return int;] }      

Q:25 如何在shell腳本中使用BC(bash電腦) ?

答:使用下列格式,在shell腳本中使用bc:

variable=`echo “options; expression” | bc`      

1) 如何向腳本傳遞參數 ?

./script argument      

例子: 顯示檔案名稱腳本

./show.sh file1.txt
cat show.sh
#!/bin/bash
echo $1      

(LCTT 譯注:謝謝某匿名訪客的提醒,原題有誤,修改之。)

2) 如何在腳本中使用參數 ?

第一個參數 : $1,第二個參數 : $2

例子 : 腳本會複制檔案(arg1) 到目标位址(arg2)

./copy.sh file1.txt /tmp/cat copy.sh#!/bin/bashcp $1 $2      

3) 如何計算傳遞進來的參數 ?

$#      

4) 如何在腳本中擷取腳本名稱 ?

$0      

5) 如何檢查之前的指令是否運作成功 ?

$?      

6) 如何擷取檔案的最後一行 ?

tail-1      

7) 如何擷取檔案的第一行 ?

head-1      

8) 如何擷取一個檔案每一行的第三個元素 ?

awk'{print $3}'      

9) 假如檔案中每行第一個元素是 FIND,如何擷取第二個元素

awk'{ if ($1 == "FIND") print $2}'      

10) 如何調試 bash 腳本

将 

-xv

 參數加到 

#!/bin/bash

 後

例子:

#!/bin/bash –xv      

11) 舉例如何寫一個函數 ?

function example {echo "Hello world!"}      

12) 如何向連接配接兩個字元串 ?

V1="Hello"V2="World"V3=${V1}${V2}echo $V3      

輸出

HelloWorld      

13) 如何進行兩個整數相加 ?

V1=1V2=2let V3=$V1+$V2
echo $V3      

輸出

3      

據 @kashu 的意見,本題的更佳回答為:

兩個整數相加,還有若幹種方法實作:

A=5B=6echo $(($A+$B))  # 方法 2echo $[$A+$B]    # 方法 3expr $A + $B     # 方法 4echo $A+$B | bc  # 方法 5awk 'BEGIN{print '"$A"'+'"$B"'}'   # 方法 6      

14) 如何檢查檔案系統中是否存在某個檔案 ?

if [ -f /var/log/messages ]thenecho "File exists"fi      

15) 寫出 shell 腳本中所有循環文法 ?

for 循環 :

foriin$(ls);doecho item:$idone      

while 循環 :

#!/bin/bashCOUNTER=0while [ $COUNTER -lt 10 ]; doecho The counter is $COUNTER
let COUNTER=COUNTER+1done      

until 循環 :

#!/bin/bashCOUNTER=20until [ $COUNTER -lt 10 ]; doecho COUNTER $COUNTER
let COUNTER-=1done      

16) 每個腳本開始的 

#!/bin/sh

 或 

#!/bin/bash

 表示什麼意思 ?

這一行說明要使用的 

shell

#!/bin/bash

 表示腳本使用 

/bin/bash

。對于 python 腳本,就是 

#!/usr/bin/python

17) 如何擷取文本檔案的第 10 行 ?

head -10 file|tail -1      

18) bash 腳本檔案的第一個符号是什麼

#      

19) 指令:

[ -z "" ] && echo 0 || echo 1

 的輸出是什麼

20) 指令 

“export”

 有什麼用 ?

使變量在子 

shell

 中可用。

21) 如何在背景運作腳本 ?

在腳本後面添加 

“&”

據 @kashu 的意見,更好的答案是:

nohup command&      

大部分時間我們可能是遠端使用Linux,我碰到過由于網絡斷線使得在背景運作的

command &

沒了...

22) 

"chmod 500 script"

 做什麼 ?

使腳本所有者擁有可執行權限。

23) 

">"

 做什麼 ?

重定向輸出流到檔案或另一個流。

24) 

&

 和 

&&

 有什麼差別

  • &

     - 希望腳本在背景運作的時候使用它
  • &&

     - 目前一個腳本成功完成才執行後面的指令/腳本的時候使用它

25) 什麼時候要在 

[ condition ]

 之前使用 

“if”

 ?

當條件滿足時需要運作多條指令的時候。

26) 指令: 

name=John && echo 'My name is $name'

 的輸出是什麼

variable      

27) 

bash shell

 腳本中哪個符号用于注釋 ?

#      

28) 指令: 

echo ${new:-variable}

 的輸出是什麼

variable      

29) 

'

 和 

"

 引号有什麼差別 ?

  • '

     - 當我們不希望把變量轉換為值的時候使用它。
  • "

     - 會計算所有變量的值并用值代替。

30) 如何在腳本檔案中重定向标準輸出和标準錯誤流到 

log.txt

 檔案 ?

在腳本檔案中添加 

"exec >log.txt 2>&1"

 指令。

31) 如何隻用 

echo

 指令擷取字元串變量的一部分 ?

echo ${variable:x:y}x - 起始位置y - 長度      

例子:

variable="My name is Petras, and I am developer."echo ${variable:11:6} # 會顯示 Petras      

32) 如果給定字元串 

variable="User:123:321:/home/dir"

,如何隻用 

echo

 指令擷取 

home_dir

 ?

echo ${variable#*:*:*:}      

echo ${variable##*:}      

33) 如何從上面的字元串中擷取 

“User”

 ?

echo ${variable%:*:*:*}      

echo ${variable%%:*}      

34) 如何使用 

awk

 列出 UID 小于 100 的使用者 ?

awk -F: '$3<100' /etc/passwd      

35) 寫程式為使用者計算主組數目并顯示次數群組名

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

36) 如何在 

bash shell

 中更改标準的域分隔符為 

":"

 ?

IFS=":"      

37) 如何擷取變量長度 ?

${#variable}      

38) 如何列印變量的最後 5 個字元 ?

echo ${variable: -5}      

39) 

${variable:-10}

 和 

${variable: -10}

 有什麼差別?

  • ${variable:-10}

     - 如果之前沒有給 variable 指派則輸出 10;如果有指派則輸出該變量
  • ${variable: -10}

     - 輸出 variable 的最後 10 個字元

40) 如何隻用 

echo

 指令替換字元串的一部分 ?

echo ${variable//pattern/replacement}      

41) 哪個指令将指令替換為大寫 ?

tr '[:lower:]' '[:upper:]'      

42) 如何計算本地使用者數目 ?

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l      

43) 不用 wc 指令如何計算字元串中的單詞數目 ?

set ${string}echo $#      

44) 

"export $variable"

 或 

"export variable"

 哪個正确 ?

export variable      

45) 如何列出第二個字母是 a 或 b 的檔案 ?

ls -d ?[ab]*      

46) 如何将整數 a 加到 b 并指派給 c ?

c=$((a+b))      

c=`expr $a + $b`      

c=`echo "$a+$b"|bc`      

47) 如何去除字元串中的所有空格 ?

echo $string|tr -d " "      

48) 重寫這個指令,将輸出變量轉換為複數: 

item="car"; echo "I like $item"

 ?

item="car"; echo "I like ${item}s"      

49) 寫出輸出數字 0 到 100 中 3 的倍數(0 3 6 9 …)的指令 ?

for i in {0..100..3}; do echo $i; done      

for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done      

50) 如何列印傳遞給腳本的所有參數 ?

echo $*      

echo $@      

51) 

[ $a == $b ]

 和 

[ $a -eq $b ]

 有什麼差別

  • [ $a == $b ]

     - 用于字元串比較
  • [ $a -eq $b ]

     - 用于數字比較

52) 

=

 和 

==

 有什麼差別

  • =

     - 用于為變量指派
  • ==

     - 用于字元串比較

53) 寫出測試 

$a

 是否大于 12 的指令 ?

[ $a -gt 12 ]      

54) 寫出測試 

$b

 是否小于等于 12 的指令 ?

[ $b -le 12 ]      

55) 如何檢查字元串是否以字母 

"abc"

 開頭 ?

[[ $string == abc* ]]      

56) 

[[ $string == abc* ]]

 和 

[[ $string == "abc*" ]]

 有什麼差別

  • [[ $string == abc* ]]

     - 檢查字元串是否以字母 abc 開頭
  • [[ $string == "abc" ]]

     - 檢查字元串是否完全等于 abc

57) 如何列出以 

ab

 或 

xy

 開頭的使用者名 ?

egrep "^ab|^xy" /etc/passwd|cut -d: -f1      

58) bash 中 

$!

 表示什麼意思 ?

背景最近執行指令的 PID.

59) 

$?

 表示什麼意思 ?

前台最近指令的結束狀态。

60) 如何輸出目前 

shell

 的 

PID

 ?

echo $$      

61) 如何擷取傳遞給腳本的參數數目 ?

echo $#      

(LCTT 譯注:和第3題重複了。)

*62) 

$*

 和 

$@

 有什麼差別*

  • $*

     - 以一個字元串形式輸出所有傳遞到腳本的參數
  • $@

     - 以 $IFS 為分隔符列出所有傳遞到腳本中的參數

63) 如何在 

bash

 中定義數組 ?

array=("Hi" "my" "name" "is")      

64) 如何列印數組的第一個元素 ?

echo ${array[0]}      

65) 如何列印數組的所有元素 ?

echo ${array[@]}      

66) 如何輸出所有數組索引 ?

echo ${!array[@]}      

67) 如何移除數組中索引為 2 的元素 ?

unset array[2]      

68) 如何在數組中添加 id 為 333 的元素 ?

array[333]="New_element"      

69) 

shell

 腳本如何擷取輸入的值 ?

a) 通過參數

./script param1 param2      

b) 通過 

read

 指令

read -p "Destination backup Server : " desthost      

70) 在腳本中如何使用 

"expect"

 ?

/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}expect "*?assword:*"send "${password}\r"expect eof
EOD      

轉載于:https://blog.51cto.com/aftree/1979490