亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Linux Shell編程

2019-11-10 18:27:56
字體:
來源:轉載
供稿:網友

簡介

Shell 是一個用C語言編寫的程序,它是用戶使用linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言。Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。Bourne Again Shell,由于易用和免費,Bash在日常工作中被廣泛使用。同時,Bash也是大多數Linux系統默認的Shell。

詳解

1.shell變量

變量名和等號之間不能有空格;

除了顯式地直接賦值,還可以用語句給變量賦值,如:

for file in `ls /etc`

推薦給所有變量加上花括號,這是個好的編程習慣,以免出現引用變量varible時出現$varible123引起混淆的情況;

使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變,如:

myUrl="http://www.w3cschool.cc"readonly myUrl

使用 unset 命令可以刪除變量,語法為:unset 變量名

字符串是shell編程中最常用最有用的數據類型,字符串可以用單引號,也可以用雙引號,也可以不用引號。

– 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的; – 單引號字串中不能出現單引號(對單引號使用轉義符后也不行);

– 雙引號里可以有變量 – 雙引號里可以出現轉義字符

雙引號中可以拼接字符串,如:

your_name="world"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1 #均輸出hello world !

字符串長度獲?。?/p>string="abcd"echo ${#string} #輸出 4

字符串截?。?/p>string="runoob is a great site"echo ${string:1:4} # 輸出 unoo

查找字串位置:

string="runoob is a great company"echo `exPR index "$string" is` # 輸出 8

bash支持一維數組(不支持多維數組),并且沒有限定數組的大小,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大于或等于0。

可以不使用連續的下標,而且下標的范圍沒有限制。

在Shell中,用括號來表示數組,數組元素用”空格”或換行符號分割開

讀取數組指定下標的元素值:

${數組名[下標]}

獲取數組所有元素:

${array_name[@]}

獲取數組的長度:

# 取得數組元素的個數length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得數組單個元素的長度lengthn=${#array_name[n]}

2.shell參數傳遞

可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。n 代表一個數字,0代表腳本文件名,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推…

如test.sh:

#!/bin/bashecho "Shell 傳遞參數實例!";echo "執行的文件名:$0";echo "第一個參數為:$1";echo "第二個參數為:$2";echo "第三個參數為:$3";

執行./test.sh 1 world reference,輸出內容為:

執行的文件名:./test.sh第一個參數為:1第二個參數為:world第三個參數為:reference

幾個用于處理傳遞參數的字符含義:

$# 傳遞到腳本的參數個數$* 以一個單字符串顯示所有向腳本傳遞的參數。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數,整體做為一個字符串回顯。$$ 腳本運行的當前進程ID號$! 后臺運行的最后一個進程的ID號$@ 與$*相同,但是使用時加引號,并在引號中返回每個參數。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數,每個參數做為單獨的字符串回顯。$- 顯示Shell使用的當前選項,與set命令功能相同。$? 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤

3.shell運算符

原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。

如:

#!/bin/basha=3b=5cc=`expr $a + $b`echo $cc

注:

表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣;完整的表達式要被 ` ` 包含;

算術運算符:

+ 加法 #如`expr $a + $b` 結果為 30。- 減法 #如`expr $a - $b` 結果為 -10。* 乘法 #如`expr $a /* $b` 結果為 200,這里*前需要轉義符號;/ 除法 #如`expr $b / $a` 結果為 2。% 取余 #如`expr $b % $a` 結果為 0。= 賦值 #如a=$b 將把變量 b 的值賦給 a。== 相等。#用于比較兩個數字,相同則返回 true。 如[ $a == $b ] 返回 false。!= 不相等。#用于比較兩個數字,不相同則返回 true。 如[ $a != $b ] 返回 true。

比較運算符:

-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。-gt 檢測左邊的數是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。-lt 檢測左邊的數是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。-ge 檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。-le 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。

布爾運算符:

! 非運算,表達式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。-o 或運算,有一個表達式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。-a 與運算,兩個表達式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

邏輯運算符:

&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串運算符:

= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。-z 檢測字符串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。-n 檢測字符串長度是否為0,不為0返回 true。 [ -n $a ] 返回 true。str 檢測字符串是否為空,不為空返回 true。 [ $a ] 返回 true。

文件測試運算符:

-b file 檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。-k file 檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。-p file 檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。-s file 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

4.shell echo命令

#!/bin/bash#-e 開啟轉義#/c 不換行echo "test/n" #輸出test/n,換行echo -e "test/n" #輸出test和一個空行echo -e "test/c" #輸出test,且不換行echo `date` #顯示執行命令的結果

運行結果:

test/ntesttest2017年 02月 08日 星期三 14:31:58 CST

5.shell printf命令

printf 命令模仿 C 程序庫(library)里的 printf() 程序。標準所定義,因此使用printf的腳本比使用echo移植性好。printf 使用引用文本或空格分隔的參數,外面可以在printf中使用格式化字符串,還可以指定字符串的寬度、左右對齊方式等。默認printf不會像 echo 自動添加換行符,我們可以手動添加 /n。

printf 命令的語法:

printf format-string [arguments...]

如:

printf "%-10s %-8s %-4.2f/n" 郭靖 男 66.1234

注:

%s %c %d %f都是格式替代符%-10s 指一個寬度為10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來%-4.2f 指格式化為小數,其中.2指保留2位小數。

6.shell test 命令

Shell中的 test 命令用于檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。

數值測試:

-eq 等于則為真-ne 不等于則為真-gt 大于則為真-ge 大于等于則為真-lt 小于則為真-le 小于等于則為真num1=100num2=100if test $[num1] -eq $[num2]then echo '兩個數相等!'else echo '兩個數不相等!'fi

字符串測試:

= 等于則為真!= 不相等則為真-z 字符串 字符串的長度為零則為真-n 字符串 字符串的長度不為零則為真num1="ru1noob"num2="runoob"if test $num1 = $num2then echo '兩個字符串相等!'else echo '兩個字符串不相等!'fi

文件測試:

-e 文件名 如果文件存在則為真-r 文件名 如果文件存在且可讀則為真-w 文件名 如果文件存在且可寫則為真-x 文件名 如果文件存在且可執行則為真-s 文件名 如果文件存在且至少有一個字符則為真-d 文件名 如果文件存在且為目錄則為真-f 文件名 如果文件存在且為普通文件則為真-c 文件名 如果文件存在且為字符型特殊文件則為真-b 文件名 如果文件存在且為塊特殊文件則為真cd /binif test -e ./bashthen echo '文件已存在!'else echo '文件不存在!'fi

Shell還提供了與( -a )、或( -o )、非( ! )三個邏輯操作符用于將測試條件連接起來,其優先級為:”!”最高,”-a”次之,”-o”最低。

如:

cd /binif test -e ./notFile -o -e ./bashthen echo '有一個文件存在!'else echo '兩個文件都不存在'fi

7.Shell 條件控制

sh的流程控制不可為空,在sh/bash里如果else分支沒有語句執行,就不要寫這個else。

if語法結構:

if conditionthen command1 command2 ... commandN fi例如:if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

if else語法結構:

if conditionthen command1 command2 ... commandNelse commandfi

if else-if else語法結構:

if condition1then command1elif condition2 then command2else commandNfi例如:a=10b=20if [ $a == $b ]then echo "a 等于 b"elif [ $a -gt $b ]then echo "a 大于 b"elif [ $a -lt $b ]then echo "a 小于 b"else echo "沒有符合的條件"fi

for 循環

for var in item1 item2 ... itemNdo command1 command2 ... commandNdone例如:for loop in 1 2 3 4 5do echo "The value is: $loop"done

while 語句

while conditiondo commanddone例如:#!/bin/shint=1while(( $int<=5 ))do echo $int let "int++"done

無限循環

while :do commanddone或while truedo commanddone或for (( ; ; ))

until 循環

until conditiondo commanddone

case

case 值 in模式1) command1 command2 ... commandN ;;模式2) command1 command2 ... commandN ;;esac例如:echo '輸入 1 到 4 之間的數字:'echo '你輸入的數字為:'read aNumcase $aNum in 1) echo '你選擇了 1' ;; 2) echo '你選擇了 2' ;; 3) echo '你選擇了 3' ;; 4) echo '你選擇了 4' ;; *) echo '你沒有輸入 1 到 4 之間的數字' ;;esac

8.shell 函數

inux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。shell中函數的定義格式如下:

[ function ] funname [()]{ action; [return int;]}可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)

無參 無顯示返回值函數

demoFun(){ echo "這是我的第一個 shell 函數!"}

帶顯示返回值函數

funWithReturn(){ echo "這個函數會對輸入的兩個數字進行相加運算..." echo "輸入第一個數字: " read aNum echo "輸入第二個數字: " read anotherNum echo "兩個數字分別為 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum))}funWithReturnecho "輸入的兩個數字之和為 $? !" ##返回命令執行狀態

帶參函數

funWithParam(){ echo "第一個參數為 $1 !" echo "第二個參數為 $2 !" echo "第十個參數為 $10 !" echo "第十個參數為 ${10} !" echo "第十一個參數為 ${11} !" echo "參數總數有 $# 個!" echo "作為一個字符串輸出所有參數 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73

處理參數的幾個特殊字符

$# 傳遞到腳本的參數個數$* 以一個單字符串顯示所有向腳本傳遞的參數$$ 腳本運行的當前進程ID號$! 后臺運行的最后一個進程的ID號$@ 與$*相同,但是使用時加引號,并在引號中返回每個參數。$- 顯示Shell使用的當前選項,與set命令功能相同。$? 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

8.Shell 輸入/輸出重定向

重定向命令列表

command > file 將輸出重定向到 file。command < file 將輸入重定向到 file。command >> file 將輸出以追加的方式重定向到 file。n > file 將文件描述符為 n 的文件重定向到 file。n >> file 將文件描述符為 n 的文件以追加的方式重定向到 file。n >& m 將輸出文件 m 和 n 合并。n <& m 將輸入文件 m 和 n 合并。<< tag 將開始標記 tag 和結束標記 tag 之間的內容作為輸入。

一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件: 標準輸入文件(stdin):stdin的文件描述符為0,Unix程序默認從stdin讀取數據。 標準輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數據。 標準錯誤文件(stderr):stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。

Here Document 是 Shell 中的一種特殊的重定向方式,用來將輸入重定向到一個交互式 Shell 腳本或程序。它的基本的形式如下:

command << delimiter documentdelimiter

它的作用是將兩個 delimiter 之間的內容(document) 作為輸入傳遞給 command。

注:

結尾的delimiter 一定要頂格寫,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 縮進。開始的delimiter前后的空格會被忽略掉。

9.Shell 文件包含

和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。Shell 文件包含的語法格式如下:

. filename # 注意點號(.)和文件名中間有一空格或source filename

參考

http://www.runoob.com/linux/linux-shell.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线看日韩欧美| 精品精品国产国产自在线| 亚洲一区中文字幕在线观看| 九九热最新视频//这里只有精品| 欧美俄罗斯性视频| 久久久999精品免费| 亚洲欧洲美洲在线综合| 欧美精品videos另类日本| 欧美美女15p| 欧美性受xxxx黑人猛交| 亚洲欧美另类自拍| 中文字幕欧美精品日韩中文字幕| 成人a在线观看| 2021久久精品国产99国产精品| 国产一区玩具在线观看| 欧美性资源免费| 国产精品久久久av| 亚洲www视频| 久久精品99无色码中文字幕| 欧美精品免费在线| 一区二区亚洲精品国产| 国产精品视频xxx| 欧美日韩ab片| 98精品在线视频| 精品欧美aⅴ在线网站| 成人激情在线观看| 成人激情视频小说免费下载| 性欧美亚洲xxxx乳在线观看| 欧美日韩国产中文精品字幕自在自线| 在线观看国产欧美| 亚洲第一福利视频| 精品亚洲va在线va天堂资源站| 欧美一级黑人aaaaaaa做受| 国产成人精品在线观看| 国产精品精品一区二区三区午夜版| 国产成人aa精品一区在线播放| 国内精品模特av私拍在线观看| 亚洲aⅴ男人的天堂在线观看| 精品国产乱码久久久久久婷婷| 国产丝袜一区二区三区免费视频| 久精品免费视频| 最近免费中文字幕视频2019| 欧美激情小视频| 国产精品久久久久一区二区| 精品成人久久av| 亚洲第一二三四五区| 欧美日韩国产精品| 日韩在线国产精品| 久久国产精彩视频| 亚洲欧美一区二区三区情侣bbw| 日韩精品免费在线视频| 尤物九九久久国产精品的特点| 一本色道久久88综合亚洲精品ⅰ| 亚洲欧美福利视频| 成人有码在线播放| 成人免费视频a| 毛片精品免费在线观看| 欧美激情一级欧美精品| 日韩在线视频线视频免费网站| 爽爽爽爽爽爽爽成人免费观看| 在线观看欧美成人| 26uuu日韩精品一区二区| 亚洲国产精品成人va在线观看| 国产精品无码专区在线观看| 一本色道久久88综合日韩精品| 欧美日韩在线视频一区二区| 国产成人亚洲综合青青| 国产裸体写真av一区二区| 中文字幕av一区二区三区谷原希美| 精品久久久香蕉免费精品视频| 97色在线视频| 久热精品视频在线免费观看| 日韩电影中文字幕在线观看| 在线视频日韩精品| 精品久久久久久久久久久久久久| 亚洲一区制服诱惑| 欧美另类极品videosbest最新版本| 日韩va亚洲va欧洲va国产| 国产一区二区三区三区在线观看| 麻豆乱码国产一区二区三区| 不卡在线观看电视剧完整版| 久久男人的天堂| 日韩av黄色在线观看| 成人免费淫片aa视频免费| 久久激情五月丁香伊人| 亚洲乱码国产乱码精品精| 久久综合色88| 91免费国产网站| 精品久久久久久久久久| 国产中文字幕91| 91国产精品视频在线| 欧美有码在线观看| 国产欧美精品日韩精品| 中文字幕日韩精品在线| 成人伊人精品色xxxx视频| 最好看的2019年中文视频| 亚洲图片欧洲图片av| 欧美亚洲国产日本| 懂色av一区二区三区| 欧美裸体xxxx极品少妇软件| 国产偷国产偷亚洲清高网站| 成人精品福利视频| 久久亚洲综合国产精品99麻豆精品福利| 欧美激情亚洲一区| 国产精品偷伦免费视频观看的| 在线看日韩av| 国产精品网站大全| 91啪国产在线| 日本视频久久久| 成人激情电影一区二区| 精品美女国产在线| 中文字幕视频在线免费欧美日韩综合在线看| 午夜精品久久久久久久久久久久久| 欧美日韩久久久久| 欧洲成人午夜免费大片| 这里只有精品在线播放| 国产精品av在线| 久久免费视频在线观看| 精品久久久香蕉免费精品视频| 亚洲国产欧美一区二区三区久久| 国产噜噜噜噜久久久久久久久| 91精品在线看| 欧美国产日本高清在线| 91免费电影网站| 97视频免费在线看| 国产精品久久久久久久久久小说| 欧美性精品220| 欧美激情第一页xxx| 欧美最猛性xxxxx免费| 国产欧美精品在线| 成人性教育视频在线观看| 欧美大片第1页| 九九热99久久久国产盗摄| 久久91精品国产| 久久91亚洲人成电影网站| 国产精品一区二区3区| 38少妇精品导航| 91香蕉亚洲精品| 久久精品男人天堂| 色小说视频一区| 欧美性少妇18aaaa视频| 久久精品在线播放| 亚洲毛片在线免费观看| 在线播放日韩精品| 57pao精品| 亚洲精品videossex少妇| 午夜精品一区二区三区在线视频| 亚洲激情国产精品| 亚洲电影天堂av| 亚洲美女中文字幕| 国产精品欧美日韩| 精品中文字幕久久久久久| 日韩激情av在线播放| 午夜精品视频在线| 日本精品中文字幕| 亚洲欧美色图片| 成人免费福利视频| 国产日本欧美一区二区三区在线| 久久久中文字幕| 久久久亚洲福利精品午夜| 成人激情视频在线播放| 91在线直播亚洲| 国产乱肥老妇国产一区二| 国产精品一区二区三区毛片淫片|