日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复习(一)—— Shell基本编程

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复习(一)—— 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.sh

Step3. 執行腳本:

./first.sh 或 sh first.sh 或 bash first.sh

2、Shell變量及表達式

2.1、變量類型

A.環境變量(系統工作環境需要的全局變量)

$PATH, $BASH, $HOME, $PWD ,$TERM, $PWD

B.自定義變量(僅在腳本中使用局部變量)

語法格式:變量名=變量值 #變量名約定大寫

例如:

A=10; echo $A SA=“hello Linux”; echo $SA

C. 只讀變量 readonly 變量名

D. 導出局部變量 export 變量名(或者 export 變量名=變量值)

E. 函數中的同名局部變量: local 變量名=變量值


2.2、注意問題

幾個注意問題

A. 變量指向一個字符串(含有空格),則變量值必須使用雙引號括起來。
例如:

SA=“Hello Linux”

B. 引用時變量前加$,單引號和雙引號的區別
例子:

SA=“hello Linux”; echo $SA echo '$SA'; echo "$SA"----------------- 結果: hello Linux #都不加 $SA #加單引號 hello Linux #加雙引號

C.清除不需要的變量:unset 變量名
如:unset SA


2.3、常用的Shell預定義變量

$#:位置參數的數量。

$*:所有位置參數的內容。

$?:命令執行后返回的狀態。

$$:當前進程的進程號。

$!:后臺運行的最后一個進程號。

$0:當前執行的進程名。


2.4、位置參數(程序的參數)

一個關于命令位置參數的腳本文件 arg.sh

#!/bin/bash echo “完整的命令行:$0$*echo “程序是:$0echo “所有的參數:$*echo “參數個數:$#” echo “第1個參數: $1

2.5、缺省參數(位置替換)

VAR=${參數-word} :有則用參數,否則用word VAR=${參數=word} :有則用參數, 否則兩個用word VAR=${參數? word} :有則用參數,否則報錯退出 VAR=${參數+word} :有則用word,否則不做

注意:上述四條經常用在位置參數的使用上。
示例:

#!/bin/bash LEFT=${1-100} #第一個參數缺省為100 RIGHT=${2-100} #第二個參數缺省為100 RE='expr $LEFT + $RIGHT' #進行相加echo "$LEFT + $RIGHT = $RE"------------------------ 執行結果: 100 + 100 = expr $LEFT + $RIGHT

1、Shell中的變量表達式主要利用各種測試語句、條件來獲得字符串、文件、數字等所處的狀態。
表達式的操作符主要包括:

字符操作符: =, !=, -n , -z 數字操作符:-eq, -ne, -ge, -gt, -le, -lt ==, !=, >=, >, <=, < 邏輯操作符:!, -a, -o 文件操作符:-d, -f, -L,-r, -w, -x, -s, -e, -z,-c, -b,-o 可以使用 test 命令來測試上述各種表達式狀態。


2、test是Shell程序中的一個表達式,通過和Shell提供的if等條件語句相結合可以方便地測試字符串、文件狀態和數字。其語法如下:

test [表達式]


3、表達式所代表的操作符有字符串操作符、數字操作符、邏輯操作符以及文件操作符,測試字符串是否相等,長度是否為零,字符串是否為NULL。
常用的字符串比較符號如下:

=:比較兩個字符串是否相同,相同則為“是”。 !=:比較兩個字符串是否相同,不同則為“是”。 -n:比較字符串的長度是否大于0,如果大于0則為“是”。 -z:比較字符串的長度是否等于0,如果等于0則為“是”。

示例:(字符串)

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語句不使用“>?”類似的符號來表達大小的比較,而是用整數來表示,常用的數字比較符號如下。

-eq:相等。 -ge:大于等于。 -le:小于等于。 -ne:不等于。 -gt:大于。 -lt:小于。

示例:(數字比較)

A=1234; test $A –eq 1234; echo $? test $A –gt 1000; echo $?------------------------ 執行結果: 0 0


4、常用的邏輯測試符號如下:

!:與一個邏輯值相反的邏輯值。 -a與(and):兩個邏輯值都為“是”返回值才為“是”,反之為“否”。 -o或(or):兩個邏輯值有一個為“是”,返回值就為“是”。


5、文件測試表達式通常是為了測試文件的文件操作邏輯,測試符號如下:

-d:對象存在且為目錄,則返回值為“是”。 -f:對象存在且為文件,則返回值為“是”。 -L:對象存在且為符號連接,則返回值為“是”。 -r:對象存在且可讀,則返回值為“是”。 -s:對象存在且長度非0,則返回值為“是”。 -w:對象存在且可寫,則返回值為“是”。 -x:對象存在且可執行,則返回值為“是”

示例:(邏輯比較)

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 0

3、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---------------- 執行結果: 5050

3.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命令 done

3.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命令 done

3.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] 全局變量和局部變量的使用區別,如gsum

3.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 done

3.5、序列函數

seq
生成一個序列(有點類似python中的range函數)

示例:

生成從1到100的100個元素的數組: A=seq 100 # seq 1 to B=seq 1 100 # seq from to

3.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 --->320

3.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基本编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。