shell指令碼程式設計基礎

2021-10-03 19:20:36 字數 3934 閱讀 2764

1.使用多個命令

2.建立shell指令碼檔案

shell指令碼中注釋一般以#開頭,shell指令碼不會處理注釋的行。但是,shell指令碼的第一行是例外。#後的!會告訴shell用哪個shell來執行指令碼,shell會根據命令在檔案**現的先後順序進行處理。下面是建立指令碼名為demo的檔案。

#!/bin/bash

date

who

存在的問題:如何讓bash shell找到你建立的指令碼檔案?shell會通過path環境變數來查詢命令。path環境變數被設定成只在一組目錄中查詢命令。

[njust@njust tutorials]$ echo $path

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/njust/.local/bin:/home/njust/bin

由於你還沒有執行檔案的許可權,這是由於umask變數被設定為022,因此系統建立的檔案只有讀寫許可權。使用下面的命令賦予檔案有可執行許可權。

chmod u+x demo

為了引用當前目錄下的檔案,可以在shell中使用單點操作符.。正式執行指令碼demo

./demo

3.顯示訊息

4.使用變數

命令替換允許你將shell命令的輸出賦值給變數,具體如下所示:

#!/bin/bash

testing=`date`

test=$(date)

echo the date and time are: $testing

echo the date and time are: $test

# 結果

the date and time are: 2023年 03月 12日 星期四 09:11:38 cst

the date and time are: 2023年 03月 12日 星期四 09:11:38 cst

例項:通過命令替換獲得當前日期並用它來生成唯一的檔名。

#!/bin/bash

# copy the /usr/bin/directory listing to a log file

today=$(date +%y%m%d) # +%y%m%d格式是告訴date命令將日期顯示為兩位數的年月日數字組合

ls /usr/bin -al > log.$today

# 結果

生成log.200312日誌檔案

命令替換會建立乙個子shell來執行對應的命令,由該子shell所執行命令是無法使用指令碼中所建立的變數。在命令列中使用路徑./執行命令時,也會建立子shell;在執行命令時不加入路徑,就不會建立子shell。

5.重定向輸入和輸出

6.管道

7.執行數**算

expr命令允許在命令列中處理數學表示式,但特別笨拙。許多expr命令操作符在shell中另有含義,當它們出現在expr命令中時,會得到一些詭異的結果。對那些容易被shell錯誤解釋的字元,需要使用轉義字元。

[njust@njust tutorials]$ expr 5 * 2

expr: 語法錯誤

[njust@njust tutorials]$ expr 5 \* 2

10

在shell指令碼中expr命令也同樣複雜,如下所示:

#!/bin/bash

var1=10

var2=20

var3=$(expr $var2 / $var1) # 要將乙個數學表示式的結果賦值給乙個變數var3,也需要借助命令替換。

echo the result is $var3

# 結果

the result is 2

在bash中,在將乙個數**算結果賦給乙個變數時,可以使用美元符和將整個表示式圈起來

[njust@njust tutorials]$ var1=$[1+34]

[njust@njust tutorials]$ echo $var1

35

用方括號執行shell運算比用expr命令方便很多,在shell指令碼中也能看出。

#!/bin/bash

var1=10

var2=20

var3=`expr $var2 / $var1`

echo the result is $var3

var1=100

var2=200

var3=45

var4=$[$var1 * ($var3 - $var2)]

echo final result is $var4

# 結果

the result is 2

final result is -15500

bash shell數**算符只支援整數運算,這是乙個巨大的限制。

#!/bin/bash

var1=100

var2=45

var3=$[$var1 / $var2]

echo the final result is $var3

# 結果

the final result is 2

浮點數運算的解決方案:使用內建的bash計算器bc。bash計算器允許在命令列中輸入浮點表示式,然後解釋並計算該表示式,返回結果。

浮動運算是由內建變數scale控制的,這個值設定為你需要保留的小數點後幾位。

[njust@njust ~]$ bc -q  # -q引數表示不顯示歡迎資訊

3.44 /5

0scale=4

3.44 / 5

.6880

quit

bash計算器還支援變數,如下所示:

bc -q  

var1=10

var1*4

40var2=var1 / 5

print var2

2quit

在指令碼中使用bc:可以使用命令替換執行bc命令,並將輸出賦值給乙個變數,基本格式如下:

變數名=$(echo "可選項; 表示式" | bc)

例項:在指令碼中使用bc,如下所示。

#!/bin/bash

var1=$(echo "scale=4; 3.44/5" | bc)

echo $var1

.6880

上述方法適用於較短的運算,但有時候涉及更多的數字。需要進行大量的運算,在乙個命令列中列出多個表示式就會麻煩。解決方法:使用內聯輸入重定向,它允許你直接在命令列中重定向資料。基本格式為:

變數名=$(bc << eof

可選項語句

表示式eof)

在bash計算器中建立的變數只在bash計算器中有效,不能在shell指令碼中使用。

#!/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 final result is $var5

# 結果

final result is 2813.9882

8.退出指令碼

shell 程式設計 shell 指令碼基礎

shell 是乙個命令直譯器,它在作業系統的最外層,負責直接與使用者進行對話,把使用者的輸入解釋給作業系統,並處理各種各樣的作業系統的輸出結果,輸出到螢幕反饋給使用者。把 linux 命令或語句放在乙個檔案中,通過這個程式檔案去執行,這個程式為 shell 指令碼或 shell 程式 可以在指令碼中...

shell指令碼程式設計基礎

最近學習了shell指令碼程式設計,感覺自己的指令碼寫的不太好,所以想把shell指令碼相關的知識系統的整理一下,便於以後的學習和使用。shell指令碼是利用shell的功能所寫的乙個程式,這個程式是使用純文字檔案,將一些shell的語法與指令寫在裡面,然後用正規表示式,管道命令以及重定向向等功能,...

shell指令碼程式設計基礎

建立檔案,為檔案新增可執行許可權 chmod x file 格式 在檔案的第一行指定所使用的shell bin bash 注釋 開頭的命令 首行的 bin bash 除外 顯示訊息 echo命令 預設情況下不需要加引號,若需要顯示的字串中含有單引號或雙引號中的一種,可使用另一種將字串引起來以示區別。...