复习(一)—— Shell基本编程
Linux體系中的shell編程在實現系統管理與維護、系統使用、用戶環境定制等方面作用突出。
使用shell寫的程序通常也稱為腳本。
在用戶主目錄中,在/etc目錄中,隨處可見腳本文件。
腳本是由各種變量、表達式、命令等通過一定的邏輯組裝而成的,具有順序解釋執行的特性。
文章目錄
- 1、Shell腳本基本結構
- 1.1、Shell腳本的運行過程
- 1.2、Shell腳本及運行
- 2、Shell變量及表達式
- 2.1、變量類型
- 2.2、注意問題
- 2.3、常用的Shell預定義變量
- 2.4、位置參數(程序的參數)
- 2.5、缺省參數(位置替換)
- 3、Shell腳本流程控制
- 3.1、分支語句
- 3.2、循環控制
- 3.3、函數
- 3.4、數組
- 3.5、序列函數
- 3.6、補充:細節問題
1、Shell腳本基本結構
#!/bin/bash ?# 腳本必須以#! 開始
#! 表示:/bin/bash將執行該腳本文件中的程序
# 表示此后的字符串為注釋
腳本支持:變量、表達式、流程控制、函數、注釋、各種外部命令和程序調用、命令行參數、系統變量等等。
腳本就是將上述各種元素通過一定的邏輯關系進行組裝已完成特定任務的程序。
1.1、Shell腳本的運行過程
1.創建文件
2.設置可執行權限
3.執行Shell程序 ./
4.使用bash命令執行程序 sh
1.2、Shell腳本及運行
step1.利用vi編輯如下腳本并保存成 first.sh
#!/bin/bash echo “Hello,welcome to Linux world” echo “Today is: $(date)”Step2. 設置執行權限:
chmod u+x first.shStep3. 執行腳本:
./first.sh 或 sh first.sh 或 bash first.sh2、Shell變量及表達式
2.1、變量類型
A.環境變量(系統工作環境需要的全局變量)
$PATH, $BASH, $HOME, $PWD ,$TERM, $PWDB.自定義變量(僅在腳本中使用局部變量)
語法格式:變量名=變量值 #變量名約定大寫例如:
A=10; echo $A SA=“hello Linux”; echo $SAC. 只讀變量 readonly 變量名
D. 導出局部變量 export 變量名(或者 export 變量名=變量值)
E. 函數中的同名局部變量: local 變量名=變量值
2.2、注意問題
幾個注意問題
A. 變量指向一個字符串(含有空格),則變量值必須使用雙引號括起來。
例如:
B. 引用時變量前加$,單引號和雙引號的區別
例子:
C.清除不需要的變量:unset 變量名
如:unset SA
2.3、常用的Shell預定義變量
$#:位置參數的數量。
$*:所有位置參數的內容。
$?:命令執行后返回的狀態。
$$:當前進程的進程號。
$!:后臺運行的最后一個進程號。
$0:當前執行的進程名。
2.4、位置參數(程序的參數)
一個關于命令位置參數的腳本文件 arg.sh
#!/bin/bash echo “完整的命令行:$0$*” echo “程序是:$0” echo “所有的參數:$*” echo “參數個數:$#” echo “第1個參數: $1”2.5、缺省參數(位置替換)
VAR=${參數-word} :有則用參數,否則用word VAR=${參數=word} :有則用參數, 否則兩個用word VAR=${參數? word} :有則用參數,否則報錯退出 VAR=${參數+word} :有則用word,否則不做注意:上述四條經常用在位置參數的使用上。
示例:
1、Shell中的變量表達式主要利用各種測試語句、條件來獲得字符串、文件、數字等所處的狀態。
表達式的操作符主要包括:
2、test是Shell程序中的一個表達式,通過和Shell提供的if等條件語句相結合可以方便地測試字符串、文件狀態和數字。其語法如下:
3、表達式所代表的操作符有字符串操作符、數字操作符、邏輯操作符以及文件操作符,測試字符串是否相等,長度是否為零,字符串是否為NULL。
常用的字符串比較符號如下:
示例:(字符串)
A=abcd; test $A = abcd; echo $? A=" "; test –z $A; echo $? test –n $A; echo $? test –z “$A”; echo $?------------------------ 執行結果: 0 1 0 1
3、test語句不使用“>?”類似的符號來表達大小的比較,而是用整數來表示,常用的數字比較符號如下。
示例:(數字比較)
A=1234; test $A –eq 1234; echo $? test $A –gt 1000; echo $?------------------------ 執行結果: 0 0
4、常用的邏輯測試符號如下:
5、文件測試表達式通常是為了測試文件的文件操作邏輯,測試符號如下:
示例:(邏輯比較)
test -f /etc/passwd –a –s /etc/passwd;echo $? test -f /etc/passwd –a –d /etc/passwd;echo $? test -d /root; echo $? test ! –z /etc/passwd; echo $?------------------------ 執行結果: 0 1 0 03、Shell腳本流程控制
Shell支持的流程控制語句主要有:
分支語句:if elif else fi, case … esac 循環語句:for, while, until 函數定義:function funname()3.1、分支語句
3.1.1、if
①單分支(常見)
if [ 條件 ] then語句 fi 或者 if ((條件)) then語句 fi 或者(常見) if [ 條件 ]; then語句 fi 或者 if ((條件)); then語句 fi②雙分支
if [ 條件 ] then語句 else語句 fi③多分支
if [ 條件 ];then語句 elif [ 條件 ];then語句 else語句 fi注意:[ 條件 ]中,條件前后必須留有一個空格[];then連在一起寫,必須加上分號;
3.1.2、case
case 表達式 in expr-1) 命令1;; expr-2) 命令2;; … *) 其他命令 esac示例 1:
echo -n "Input A=" read A case $A in 1)echo "select 11";; 2)echo "seelct 22";; *)echo "select else";; esac------------------------ 執行結果: Input A=1 select 11 # 輸入的值為1結果Input A=2 seelct 22 # 輸入的值為2結果示例 2:
echo -n "Input A=" read A case $A in "fu zhou")echo "select 11";; "xia men")echo "seelct 22";; *)echo "select else";; esac------------------------ 執行結果: Input A=fu zhou select 11 # 輸入的值為fuzhou結果Input A=xia men seelct 22 # 輸入的值為xiamen結果注意:如果是字符串變量且含有空格,則必須在匹配位置加上引號,如"fu zhou"。
3.1.3、菜單式
示例:
OPTIONS="fuzhou xiamen" select opt in $OPTIONS; do case "$opt" in fuzhou) echo "select fuzhou";; xiamen) echo "select xiamen";; *) exit;; esac done------------------- 執行結果: 1) fuzhou 2) xiamen注意:可能沒有循環執行!
3.2、循環控制
3.2.1、for
for 變量 [ in 數值列表] # for i in 1 2 3 4 do #省略 [ ] 則表示取編所有位置參數命令 done示例:(實現1加到100)
sum=0 len=101 #指定循環次數 for((i=1;i<"$len";i=i+1)) dolet sum=sum+$i done echo $sum---------------- 執行結果: 50503.2.2、while
while 條件命令為真 do命令 done示例:(實現1加到100)
k=1 sum=0 while [ $k –le 100 ] dolet sum=$sum+$klet k++ done echo $sum------------------ 執行結果: 5050注意:如果沒有條件命令只有:代表無限循環
while : #無限循環 do命令 done3.2.3、until
until 條件命令為假 do命令 done示例:(實現1加到100)
k=1 sum=0 until [ $k –gt 100 ] dolet sum=$sum+$klet k++ done echo $sum------------------ 執行結果: 5050注意:如果沒有條件命令只有:代表無限循環
until : #無限循環 do命令 done3.3、函數
function 函數名() {[return 整數] }注意:
[1]函數必須先聲明,才能調用
[2]函數中的變量同全局變量名相同時,則使用 local val=value
定義局部變量
[3]無需(不能)定義參數
[4]如果沒有return則最后一條命令的返回值就是函數的返回值。
示例 1:
#!/bin/bash gsum=0 function sumn() { sum=0for((i=1;i<=$1;i++))dolet sum=$sum+$idonegsum=$sumreturn $sum } sumn 10 echo "sum=$?"------------------- 執行結果: sum=55調用注意: [1] 直接傳遞參數,如 sumn 10 [2] 函數就是命令,返回值只能通過 $?獲取,如 echo “sum=$?” [3] 如果需要返回變量值, 則通過全局變量帶回值,如 gsum示例 2:
#!/bin/bash gsum=0 function sumn() { local gsum=0for((i=1;i<=$1;i++))dolet gsum=$gsum+$idonereturn $gsum } sumn 10 echo "sum=$?" echo $gsum------------------ 執行結果: sum=55 0調用注意: [1] 全局變量和局部變量的使用區別,如gsum3.4、數組
[1]定義: A=(元素列表,空格隔開) 下標從0開始,如A=(a b c d)[2]數組長度 ${#A[*]}[3]引用第i個元素 ${A[$i]}[4]賦值 A[$i]=value[5]以字符串輸出所有元素 echo ${A[*]}[6] 循環輸出所有元素 Len=${#A[*]} for((i=0;i<“$Len”;i++)) doecho ${A[$i]} done 或者 for value in ${A[*]} doecho $value done3.5、序列函數
seq
生成一個序列(有點類似python中的range函數)
示例:
生成從1到100的100個元素的數組: A=seq 100 # seq 1 to B=seq 1 100 # seq from to3.6、補充:細節問題
3.6.1、整數的四則運算
示例:
A=10 B=20C='expr $A + $B';echo $C --->expr $A + $B C='expr $A \* $B';echo $C --->expr $A \* $BD=$(($A+$B));echo $D --->30 D=$(($A*$B));echo $D --->200 D=$((A+B));echo $D --->30 D=$[$A+$B];echo $D --->30 D=$[A+B];echo $D --->30let E=A+B;echo $E --->30 ((F=A+B));echo $F --->30let E=A*B;echo $E --->200 ((F=A*B));echo $F --->200let A++;echo $A --->11 ((A++));echo $A --->12let A+=10;echo $A --->22 ((A+=10));echo $A --->32 ((A*=10));echo $A --->3203.6.2、字符串函數
字符串A="HELL:LINUX:WORLD"
1. 獲得字符串長度 LEN=${#A} 2. 提取6-10字符 SUB1=${A:5:5} 結果 LINUX 3. 從第6個字符開始提取 SUB2=${A:5} 結果 LINUX:WORLD 4. 將符號:替換為符號/ REP=${A//:/\/}結果 HELL/LINUX/WORLD將符號:替換為cc REP=${A//:/cc}3.6.3、浮點數運算
主要工具使用bc,(默認為整數運算,可以通過scale=bits,精度小數點尾數,+,-,*,/,^,%)
1. 計算 5-2/3 保留4位小數 A=$(echo "scale=4; 5-2/3"|bc)echo $A ---->結果:4.33342. bc –q #進入bc計算器環境scale=4 #設置小數點4位5-2/3quit #退出環境3. bc –q file #執行file文件中的代碼,類C代碼。示例:
define is_prime(n) { auto prime,i; prime=1; for (i=2;i^2<=n;++i){ if (n%i==0){ prime=0; break; } } return prime; } print "\nPlease enter a positive integer n:\n"; n=read(); print "\n\n" for (i=2;i<=n;++i) { if (is_prime(i)){ print i; print "\n"; } } quit;總結
以上是生活随笔為你收集整理的复习(一)—— Shell基本编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、八、十、十六进制及小数间的转换
- 下一篇: 复习笔记(八)——C++模板