Linux_《Linux命令行與shell腳本編程大全》第十一章學習總結

時間:2017年08月28日星期一
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十一章學習總結shell

第十一章:構建基本腳本

本章內容express

使用多個命令
建立腳本文件
顯示消息
使用變量
輸入輸出重定向
管道
數據運算
退出腳本

11.1 使用多個命令

shell腳本的關鍵在於輸入多個命令並處理每一個命令的結果,甚至須要將一個命令的結果傳給另外一個命令。shell可讓你將多個命令串起來,一次執行完成。若是要兩個命令一塊兒運行,能夠把它們放在同一行中,彼此用分號隔開。最大命令行字符數不超過255個字符。編程

命令演示:date ; who
命令說明:先執行date顯示當前日期和時間,而後執行who顯示當前是誰登錄到了系統上

使用這種方式,在每次運行以前,都必須在命令提示符下輸入整個命令。能夠將這些命令組合成一個簡單的文本文件,這樣就不須要在命令行中手動輸入了。vim

11.2 建立shell腳本文件

命令演示:vim test1
命令說明:建立一個名爲test1的文件

在建立shell腳本文件時,必須在文件的第一行指定要使用的shell,格式爲數組

#!/bin/bash

在一般的shell腳本中,井號(#)用做註釋行。shell並不會處理shell腳本中額註釋行。但shell腳本文件的第一行是個例外,#後面的驚歎號會告訴shell用哪一個shell來運行腳本。bash

使用vim編輯test1並保存函數

#!/bin/bash
# my shell script
date
who
命令演示:echo $PATH
命令說明:查看PATH環境變量
命令演示:chmod u+x test1
命令說明:經過chmod命令賦予文件屬主執行文件的權限
命令演示:./test1
命令說明:運行在當前目錄下的test1腳本

11.3 顯示消息

命令格式:echo "msg"
命令說明:顯示 echo後面的文本字符串msg
命令格式:echo -n "msg"
命令說明:顯示echo後面的文本字符串且不換行

修改test1以下保存並運行查看效果學習

#!/bin/bash
# my shell script
echo -n The time and date are:
date
echo "Let's see who's logged init the system:"
who

11.4 使用變量

11.4.1 環境變量

命令演示:set
命令說明:顯示當前環境變量列表
命令演示:$UID
命令說明:經過美圓符($)來使用環境變量

使用vim編寫test2以下並運行ui

#!/bin/bash
# display user infomation from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME

說明:也能夠經過${variable}形式引用變量。變量名兩側額外的花括號一般用來幫助識別美圓符後的變量名。若是要顯示$符號,則須要使用進行轉義,如:\$this

11.4.2 用戶變量

用戶變量

變量容許臨時存儲數據並在整個腳本中使用
由字母、數字或下劃線組成,長度不超過20個
特別注意變量名區分大小寫
使用等號進行賦值,且等號兩邊不能出現空格
例如:var1=十、var2="still more testing"
shell腳本自動識別決定變量值的數據類型
經過美圓符號引用

使用vim編寫test3以下

#!/bin/bash
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

引用一個變量值時須要使用美圓符,而引用變量來對其進行賦值時則不要使用美圓符

使用vim編寫test4以下

#!/bin/bash
value1=10
value2=$value1
echo The resulting value2 is $value2
value3=value1
echo The resulting value3 is $value3

11.4.3 命令替換

shell腳本中最有用的特性之一就是能夠從命令輸出中提取信息,並將其賦給變量。把輸出賦給變量以後,就能夠隨意在腳本中使用了。

有兩種方法能夠將命令輸出賦給變量

反引號字符(`):testing=`date`
$()格式:testing=$(date)

使用vim編寫test5以下

#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today

警告:命令替換會建立一個子shell來運行對應的命令。子shell(subshell)是由運行該腳本的shell所建立出來的一個獨立的子shell(child shell)。正由於如此,由該子shell所執行命令是沒法使用腳本中所建立的變量的。在命令行提示符下使用路徑./運行命令的話,也會建立出子shell;要是運行命令的時候不加入路徑,就不會建立子shell。

11.5 重定向輸入和輸出

11.5.1 輸出重定向

命令格式:command > outputfile
命令說明:使用大於號(>)重定向將命令的輸出發送到一個文件中
命令演示:date > test6
命令說明:重定向操做符建立了一個文件test6,並將date命令的輸出重定向到該文件中,   
         若是文件已經存在,則會覆蓋已有文件
命令演示:date >> test6
命令說明:將date命令的輸出追加到test6文件中

11.5.2 輸入重定向

命令格式:command < inputfile
命令說明:使用小於號(<)輸入重定向將文件的內容重定向到命令

簡單的記憶方法:在命令行上,命令老是在左側,而重定向符號「指向」數據流動的方向。小於號說明數據正在從輸入文件流向命令

命令演示:wc < test6
命令說明:使用wc命令對數據中的文本進行計數。

默認狀況下,它會輸出3個值

文本的行數
文本的詞數
文本的字節數

命令格式:command << marker
         data
         marker
命令說明:內聯輸入重定向。使用遠小於符號(<<),
         指定一個文本標記來劃分輸入數據的開始和結尾。
命令演示:wc << EOF
        test string 1
        test string 2
        test string 3
        EOF
命令說明:使用wc命令對輸入的文本內容進行計數

11.6 管道

有時須要將一個命令的輸出做爲另外一個命令的輸入。能夠將一個命令的輸出直接重定向到另外一個命令,這個過程叫做管道鏈接。

管道鏈接

命令格式:command1 | command2
使用符號:|
不要覺得由管道串起來的兩個命令爲依次執行。
Linux系統實際上會同時運行這兩個命令,在系統內部將它們鏈接起來。
在第一個命令產生輸出的同時,輸出會被當即送給第二個命令
數據傳輸不會用到中間文件或緩衝區

命令演示:apt list | sort | more
命令說明:顯示已安裝的軟件包並排序並安裝more命令來顯示

命令:more。經常使用操做

按Space鍵:顯示文本的下一屏內容
按Enter鍵:只顯示文本的下一行內容
按斜線符|:接着輸入一個模式,能夠在文本中尋找下一個相匹配的模式
按H鍵:顯示幫助屏,該屏上有相關的幫助信息
按B鍵:顯示上一屏內容
按Q鍵:退出rnore命令

11.7 執行數學運算

11.7.1 expr命令

命令:expr
命令說明:使用expr命令在命令行上處理數學表達式,特別笨拙
命令演示:expr 1 + 5
命令說明:計算1+5的值

expr命令操做符

ARG1 | ARG2:若是ARG1既不是null也不是零值,返回ARG1;不然返回ARG2
ARG1 & ARG2:若是沒有參數是null或零值,返回ARG1;不然返回0
ARG1 < ARG2:若是ARG1小於ARG2,返回1;不然返回0
ARG1 <= ARG2:若是ARG1小於或等於ARG2,返回1;不然返回0
ARG1 = ARG2:若是ARG1等於ARG2,返回1;不然返回0
ARG1 != ARG2:若是ARG1不等於ARG2,返回1;不然返回0
ARG1 >= ARG2:若是ARG1大於或等於ARG2,返回1;不然返回0
ARG1 > ARG2:若是ARG1大於ARG2,返回1;不然返回0
ARG1 + ARG2:返回ARG1和ARG2的算術運算和
ARG1 - ARG2:返回ARG1和ARG2的算術運算差
ARG1 * ARG2:返回ARG1和ARG2的算術乘積
ARG1 / ARG2:返回ARG1和ARG2的算術商(注意:只支持整數運算)
ARG1 % ARG2:返回ARG1和ARG2的算術餘數
STRING:REGEXP:若是REGEXP匹配到了STRING中的某個模式,返回該模式匹配
match STRING REGEXP:若是REGEXP匹配到了STRING中的某個模式,返回該模式匹配
substr STRING POS LENGTH:返回起始位置爲POS(從1開始計數)、長度爲LENGTH子字符串
index STRING CHARS:返回在STRING中找到CHARS字符串的位置;不然,返回0
length STRING:返回字符串STRING的數值長度
+ TOKEN:將TOKEN解釋成字符串,即便是個關鍵字
(EXPRESSION):返回EXPRESSION的值

修改test6腳本

#!/bin/bash
var1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3

在使用的時候,注意對特殊符號進行轉義。在腳本中使用expr命令比較複雜。

11.7.2 使用方括號

命令格式:$[ operation ]
命令說明:使用美圓符和方括號將數學表達式圍起來。
         這種方式比用expr命令方便,也適用於shell腳本。

編寫test7腳本

#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2-$var3)]
echo The final result is $var4

編寫test8腳本

#!/bin/bash
# 只支持整數運算
var1=100
var2=45
var3=$[$var1 / $var2]
echo The final result is $var3

11.7.3 浮點解決方案

1.bc的基本用法

bc是內建的bash計算器,用於解決bash中數學運算的整數限制

bash計算器能夠識別

數字(整數和浮點數)
變量(簡單變量和數組)
註釋(以#或C語言中的/* */開始的行)
表達式
編程語句(例如if-then語句)
函數

命令格式:bc

命令說明:訪問bash計算器
命令格式:quit
命令說明:進入bash計算器後,輸入quit退出bash計算器

2.在腳本中使用bc

命令格式:variable=$(echo "options;expression" | bc)
命令說明:使用命令替換運行bc命令,並將輸出賦給一個變量。
    options容許你設置變量,多個變量用分號隔開
    expression參數定義了經過bc執行的數據表達式

編寫test9腳本

#!/bin/bash
# 使用scale指定小數點後的位數
var1=$(echo "scale=4;3.44 / 5" | bc)
echo The answer is $var1

編寫test10腳本

#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo The answer for this is $var3

編寫test11腳本

#!/bin/bash
var1=20
var2=3.14159
var3=$(echo "scale=4; $var1 * $var2" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo The final result is $var4

內聯重定向

命令格式:variable=$(bc << EOF
         options
         statements
         expressions
         EOF)
命令說明:使用內聯重定向數據進行命令替換符號將bc命令的輸出賦給變量

編寫test12腳本

#!/bin/bash

var1=10.46
var2=43.67
var3=33.2
var4=71

var5=$(bc << EOF
scale=4
a1 = ( $var1 * $var2)
b1 = ( $var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5

11.8 退出腳本

11.8.1 查看退出狀態碼

shell中運行的每一個命令都使用退出狀態碼(exit status)告訴shell它已經運行完畢。退出狀態碼是一個0~255的整數值,在命令結束運行時由命令傳給shell。能夠捕獲這個值並在腳本中使用。

命令格式:$?
命令說明:查看由shell所執行的最後一條命令的退出狀態碼
命令演示:echo $?
命令說明:顯示由shell所執行的最後一條命令的退出狀態碼

Linux錯誤退出狀態碼沒有什麼標準可循,但有一些有用的參考

0:命令成功結束
1:通常性未知錯誤
2:不適合的shell命令
126:命令不可執行(代表用戶沒有執行命令的正確權限)
127:沒找到命令
128:無效的退出參數
128+x 與Linux信號x相關的嚴重錯誤
130:經過Ctrl+C終止的命令
255:正常範圍以外的退出狀態碼

11.8.2 exit命令

默認狀況下,shell腳本會以腳本中的最後一個命令的退出狀態碼退出。exit命令容許你在腳本結束時指定一個退出狀態碼

編寫test13腳本

#!/bin/bash
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5

編寫test14腳本

#!/bin/bash
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit $var3

編寫test14b腳本

#!/bin/bash
var1=10
var2=30
var3=$[$var1 * $var2]
echo The value is $var3
exit $var3

當指定的退出狀態碼超過255時,最終的結果是指定的數值除以256後獲得的餘數。在下一章,經過使用if-then語句來檢查某個命令返回的錯誤狀態,以便知道命令是否成功。

11.9 小結

bash shell腳本容許你將多個命令串起來放進腳本中。講解了shell腳本的基本結構,變量的使用以及管道命令和算術運算,最後介紹了退出狀態碼。本章介紹了echo、$、$()、>、>>、<、<<、|、expr、$[]、bc、exit命令。

本章學習命令我的總結以下

echo:顯示消息
$:取變量值
$():命令替換
>:輸出重定向(覆蓋數據)
>>:輸出重定向(追加數據)
<:輸入重定向
<<:內聯輸出重定向
|:管道命令
expr:處理數據表達式進行算術運算
$[]:被方括號包圍的內容進行算術運算
bc:bash計算器進行浮點數算術運算
exit:指定退出狀態碼
相關文章
相關標籤/搜索