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命令 預設情況下不需要加引號,若需要顯示的字串中含有單引號或雙引號中的一種,可使用另一種將字串引起來以示區別。...