1. 程式人生 > >SHELL指令碼程式設計_1

SHELL指令碼程式設計_1


title: SHELL指令碼程式設計_1
data: 2018-9-18
tags: [SHELL,指令碼,程式設計,學習]
categories: [學習,SHELL]
grammar_cjkRuby: true
copyright: true

我已經瞭解瞭如何使用shell的命令列介面提示符來輸入命令和檢視命令的結果。shell指令碼的優點在於輸入多個命令並處理每個命令的結果,甚至需要將一個命令的結果傳給另一個命令。shell可以讓我將多個命令串起來,一次執行完成。


構建基本指令碼

建立 shell 指令碼檔案

建立shell指令碼檔案時,必須在檔案的第一行指定要使用的shell。其格式為:
#!/bin/bash


處第一行外,通常的shell指令碼中,井號( # )用作註釋行。

顯示訊息

在 echo 命令後面加上了一個字串,該命令就能顯示出這個文字字串。

$ echo This is a test
This is a test
$

echo 命令可用單引號或雙引號來劃定文字字串。如果在字串中用到了它們,你需要在文字中使用其中一種引號,而用另外一種來將字串劃定起來。

如果想把文字字串和命令輸出顯示在同一行中,可以用 echo 語句的 -n 引數。

echo -n "The time and date are: "
$ ./test1
The time and date are: Mon Feb 21 15:42:23 EST 2014

使用變數

環境變數

shell維護著一組環境變數,用來記錄特定的系統資訊。比如系統的名稱、登入到系統上的使用者名稱、使用者的系統ID(也稱為UID)、使用者的預設主目錄以及shell查詢程式的搜尋路徑。可以用set 命令來顯示一份完整的當前環境變數列表。在指令碼中,你可以在環境變數名稱之前加上美元符( $ )來使用這些環境變數。(你可能還見過通過${variable} 形式引用的變數。變數名兩側額外的花括號通常用來幫助識別美元符後的變數名。)

使用者變數

使用者變數可以是任何由字母、數字或下劃線組成的文字字串,長度不超過20個。使用者變數區分大小寫,所以變數 Var1 和變數 var1 是不同的。使用等號將值賦給使用者變數。在變數、等號和值之間不能出現空格(另一個困擾初學者的用法)。舉例:

var1=10
var2=-57
var3=testing
var4="still more testing"

shell指令碼會自動決定變數值的資料型別。在指令碼的整個生命週期裡,shell指令碼中定義的變數會一直保持著它們的值,但在shell指令碼結束時會被刪除掉。與系統變數類似,使用者變數可通過美元符引用。

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

執行指令碼會有如下輸出。

$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$

變數每次被引用時,都會輸出當前賦給它的值。重要的是要記住,引用一個變數值時需要使用美元符,而引用變數來對其進行賦值時則不要使用美元符。

命令替換

shell指令碼中最有用的特性之一就是可以從命令輸出中提取資訊,並將其賦給變數。把輸出賦給變數之後,就可以隨意在指令碼中使用了。這個特性在處理指令碼資料時尤為方便。

  • 反引號字元( ` )
  • $() 格式
testing='date'
testing=$(date)

這個例子毫無吸引人的地方(也可以乾脆將該命令放在 echo 語句中),但只要將命令的輸出放到了變數裡,你就可以想幹什麼就幹什麼了。

命令替換會建立一個子shell來執行對應的命令。子shell ( subshell)是由執行該指令碼的shell所創建出來的一個獨立的子shell(child shell)。正因如此,由該子shell所執行命令是無法使用指令碼中所建立的變數的。
在命令列提示符下使用路徑 ./ 執行命令的話,也會創建出子shell;要是執行命令的時候不加入路徑,就不會建立子shell。如果你使用的是內建的shell命令,並不會涉及子shell。在命令列提示符下執行指令碼時一定要留心!

數學運算

有了變數,有了數值就可以進行數學運算了。

expr 命令

expr 命令允許在命令列上處理數學表示式,但是特別笨拙。

$ expr 1 + 5
6
操作符 描述
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 的值

對於那些容易被shell錯誤解釋的字元,在它們傳入 expr 命令之前,需要使用shell的轉義字元(反斜線)將其標出來。比如 *

使用方括號

在bash中,在將一個數學運算結果賦給某個變數時,可以用美元符和
方括號( $[ operation ] )將數學表示式圍起來。

$ var1=$[1 + 5]
$ echo $var1
6
$ var2=$[$var1 * 2]
$ echo $var2
12
$

bash shell數學運算子只支援整數運算。若要進行任何實際的數學計算,這是一個巨大的限制。

浮點數解決方案-bc計算機

bash計算器實際上是一種程式語言,它允許在命令列中輸入浮點表示式,然後解釋並計算該表示式,最後返回結果。bash計算器能夠識別:

  • 數字(整數和浮點數)
  • 變數(簡單變數和陣列)
  • 註釋(以#或C語言中的 /* */ 開始的行)
  • 表示式
  • 程式設計語句(例如 if-then 語句)
  • 函式
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'.
12 * 5.4
64.8
3.156 * (3 + 5)
25.248
quit
$

要退出bash計算器,你必須輸入 quit 。浮點運算是由內建變數 scale 控制的。必須將這個值設定為你希望在計算結果中保留的小數位數,否則無法得到期望的結果。-q 命令列選項可以不顯示bash計算器冗長的歡迎資訊。

$ bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
$

現在你可能想問bash計算器是如何在shell指令碼中幫助處理浮點運算的。還記得命令替換嗎?是的,可以用命令替換執行 bc 命令,並將輸出賦給一個變數。基本格式如下:
variable=$(echo "options; expression" | bc)
舉例:

$ cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1
$

行了吧,我實在寫不下去,前兩天和我喜歡的女孩子分手了。這兩天狀態一直不好。我還愛她啊,只是異地戀太辛苦,實在沒有堅持下去的勇氣,願上天讓她幸福