歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux Shell 腳本攻略

Linux Shell 腳本攻略

日期:2017/3/1 9:48:15   编辑:SHELL編程

1.1 簡介

1 打開終端後,就會出現一個提示符,形式通常如下

username@hostname$ 或者root@hostname#

2 $表示的是普通用戶,#表示的是超級用戶。超級用戶是Linux中權限最高的用戶

3 有兩種運行腳本的方式

sh script.sh 或者是 path script (path是腳本所在的目錄)

4 在bash中每個命令是通過分號";"來分開的


1.2 終端打印

1 echo是用於終端打印的基本命令,在默認情況下echo在每次調用後都會添加一個換行符

2 另一個可以用來終端打印的命令是printf,printf的參數和C語言中的printf函數一樣

3 在默認情況下,echo會將一個換行符追加到輸出文本的尾部,可以使用-n來忽略結尾的換行符

4 如果需要使用轉義序列,則采用echo -e ”包含轉義序列的字符串"這種形式

1.3 玩轉變量和環境變量

1 我們可以使用pgrep來快速找到一個進程的pid,假如有一個gedti正在運行,那麼我們通過pgrep gedit就可以快速知道這個gedit的進程id

2 一個變量可以通過以下方式來進行賦值 var=value,var是變量名,value是變量值,如果value不包含任何空白字符,那麼他不需要使用引號來進行引用,否則就需要使用引號進行引用

3 環境是未在當前進程中定義,而從父進程中繼承來的變量

4 export命令用來設置環境變量

5 獲得字符串的長度 length=${#var},可以用來求變量var的長度

1.4 通過shell進行數學運算

1 在bash環境中,我們可以使用let (()) 和[]來進行基本的算數操作,在進行高級的運算中,可以使用expr和bc

2 當使用let的時候,變量名之前是不需要再添加$,例如let res=num1+num2

3 let支持++和--等各種操作

4 操作符[]的使用方法和let命令類似,例如res=$[ num1 + num2 ]

5 也可以使用(()),但是使用(())時,變量名之前要加上$,例如res=$(( num1 + num2 ))

6 我們可以使用scale=2來將小數點位數設置為2


1.5 玩轉文件描述符和重定向

1 文件描述符是於文件輸入,輸出相關聯的整數,他們用來跟蹤與打開的文件,最常見的文件描述符是stdin,stdout,stderr。

2 文件描述符是與一個打開的文件或數據流相關聯的整數,文件描述符0,1和2是系統預留的

0 - stdin標准輸入,1 - stdout標准輸出,2 - stderr標准錯誤

3 用下面的方法可以把輸出文本重定向到一個文件中

echo "this ...." > out , 這樣便可以把輸出的字符串重定向到out文件中

4 >和>>並不相同,前者是會先清空文件再寫入內容,而後者是會將內容追加到現有的文件的尾部

5 當使用重定向操作符的時候,重定向的內容不會出現在終端,而是直接被導入文件。重定向操作默認使用標准輸出

6 >等同於1>;對於>>來說,等同於1>>

7 借助重定向,我們可以使用stdin那樣從文件中讀取數據 cmd < file

8 我們可以使用exec命令創建自定義的文件描述符

1.6 數組和關聯數組

1 bash同時支持數組和關聯數組,普通數組只能使用整數做為數組索引,而關聯數組可以使用字符串做為數組索引

2 定義數組的方法有很多種

第一種:array_var=(1 2 3 4 5),這些值會存儲在以0為起始索引的連續位置上

第二種:array_var[0]=1

array_var[1]=2

......................

3 打印特定元素的數組內容,${array_var[index]},將會打印處索引為index的內容

4 以清單形式打印處數組中的所有值,${array_var[*]}

5 打印數組的長度${#array_var[*]}

6 在關聯數組中,我們可以使用任意的文本做為數組索引,在普通數組中,只能用整數做為索引

7 首先我們需要單獨的聲明語句將一個變量名聲明為關聯數組declare -A ass_array

1.7 使用別名

1 別名有多種實現方式,可以使用函數,也可以使用alias命令

2 可以按照以下方式來創建一個別名 alias new_command='command'

3 alias命令的作用只是暫時的,我們要寫在~/.bashrc中,然後用source ~/.bashrc這樣就可以長久的使用別名

4 如果要刪除別名,我們可以使用unalias或者直接刪除~/.bashrc

1.8 獲取終端信息

1 獲取終端的行數和列數 tput cols 和 tput lines

2 打印當前的終端名 tput longname

3 刪除當前光標位置到行尾的所有內容 tput ed

1.9 獲取/設置日期和延時

1 我們使用date來打印處日期

2 打印紀遠時 date +%s,紀遠時被定義為從世界標准時間1970年1月1號0時0分0秒至當前時刻的總秒數

3 用格式串結合+作為date命令的參數,可以按照你的選擇打印出對應的格式和日期

4 我們可以使用sleep time來延時time秒

5 tput sc是用來存儲光標位置,tput rc是恢復光標位置,tput ed是清除從當前光標位置到行末的內容

1.10

1 使用-x,啟動跟蹤調試shell腳本,運行帶有-x標志的腳本能夠打出所執行的每一行命令及當前狀態

2 針對每一種情況,我們可以在腳本中設置啟用或是禁止調試打印

set -x 在執行時顯示參數和命令

set +x 禁止調試

set -v 當命令進行讀取時顯示輸入

set +v 禁止打印輸入

3 我們可以直接使用shebang #!/bin/bash改成#!/bin/bash -xv不用其它顯項直接進行調試

1.11

1 函數定義

function fname(){

statements

}

或者是

fname(){

statements

}

2 只要使用函數名就可以調用某個函數 fname,就會執行fname函數

3 參數可以傳遞給函數 fname arg1 arg2

4 類似地,參數可以傳遞給腳本並通過script來訪問

$1 是第一個參數

$2 是第二個參數

$n 是第n個參數

$@ 被擴展成"$1" “$2" "$3"

$* 被擴展成"$1c$2c$3",其中c是IFS的第一個字符

$@ 用的比較多,由於$*把所有的參數都當作單個字符串,因此很少被利用

5 在bash中每一條命令執行之後都會返回一個值,如果是0表示執行成功,其它表示執行失敗

1.12

1 我們使用管道pipe來連接每一個過濾器,例如$cmd1 | cmd2 | cmd3,這裡組合了三個命令,cmd1輸出傳遞給cmd2,而cmd2傳遞給cmd3,最終輸出將會被打印或導入某個文件

2 我們有兩種方法取得命令序列的輸出

第一種:output=$(cmd),這樣就會把cmd命令的結果輸出到output上

第二種:output=`cmd`,這樣就會把cmd命令的結果輸出到output上

3 假設我們使用子shll或反引用的方法將命令的輸出讀入一個變量中,可以將它放入雙引號中,以保留空格和換行符


1.13 字段分割符和迭代器

1 內部字段分割符IFS是shell腳本中一個重要的概念,默認的IFS是空白字符(換行符,制表符或者空格)

2 我們可以輕松的生成不同序列

echo {1..50} 這樣能夠生成一個從1到50的序列

echo {a..z} 這樣能夠生成a到z的序列

3 for循環

for i in list

do

statements

done

4 while循環

while condition

do

statements

done

1.14 比較和測試

1 if條件

if condition

then

statements

elif condition

statements

else

statements

fi

2 我們可以使用邏輯運算符來減少if else的使用

[ condition ] && action 如果condition條件為真,那麼執行action

[ condition ] || action 如果condition條件為假,那麼執行action

3 算術比較

-eq: 相等

-ne: 不相等

-gt: 大於

-lt: 小於

-ge: 大於等於

-le: 小於或等於

4 文件系統相關測試

[ -f $file ] 如果給定的文件是普通文件則��回真

[ -x $file ] 如果給點的文件具有執行權限則返回真

[ -d $file ] 如果給點的文件是目錄則返回真

[ -e $file ] 如果文件file存在則返回真

[ -c $file ] 如果給定的文件是字符設備文件則返回真

[ -b $file ] 如果給點的文件是塊設備文件則返回真

[ -w $file ] 如果給點的文件具有可些權限則返回真

[ -r $file ] 如果文件file具有可讀權限則返回真

[ -L $file ] 如果給點的文件file是一個符號鏈接文件則返回真

5 字符串比較

1 使用字符串比較的時候,最好使用雙中括號,因為有時候采用單個中括號會產生錯誤

2 [[ $str1 = $str2 ]],當str1等於str2的時候,返回真

[[ $str1 != $str2 ]],當str1不等於str2的時候,返回真
[[ $str1 > $str2 ]],當str1大於str2的時候,返回真

[[ $str1 < $str2 ]],當str1小於str2的時候,返回真

[[ -z $str ]]如果str是空字符串返回真

[[ -n $str ]]如果str是非空字符串則返回真

6 test命令同樣可以用來執行條件檢測,有助於避免過多的括號

Copyright © Linux教程網 All Rights Reserved