Shell便是一種命令語言,又是一種程序設計語言,使用者能夠經過Shell訪問操做系統的內核服務。java
Shell編程和java、python、C同樣,只要一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就能夠了,Linux的Shell種類衆多,咱們只關注與Bash(Bourne Again Shell (/bin/bath))python
#! /bin/sh和#! /bin/bash沒多大區別,#!告訴系統須要什麼解釋器來執行該Shell腳本程序。linux
shell的打印輸出函數 echo。shell
從鍵盤獲取輸入信息---- read 編程
read name //從鍵盤數據保存在name變量中 echo "從鍵盤獲取的信息是 $name"
一、read命令提供了-p參數,-p後面的字符串會顯示出來數組
read -p "輸入第一個數字:" a #獲取鍵盤輸入的 a 變量數字 read -p "輸入第二個數字:" b #獲取鍵盤輸入的 b 變量數字 r=$[a+b] #計算a+b的結果 賦值給r 不能有空格 echo "sum = ${r}" #輸出顯示結果 r
輸出結果bash
輸入第一個數字:1 輸入第二個數字:2 sum = 3
二、計時輸入編程語言
使用read命令存在着潛在危險。腳本會阻塞下來等待用戶的輸入。若是不管是否輸入數據腳本都必須繼續執行,可使用-t選項指定一個計時器。編輯器
if read -t 5 -p "please enter your name:" name then echo "hello $name ,welcome to my script" else echo "sorry,too slow" fi
三、設置read命令計數輸入的字符。當輸入的字符數目達到預約數目時,自動退出,並將輸入的數據賦值給變量。
read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y | y) echo "fine ,continue";; N | n) echo "ok,good bye";; *) echo "error choice";; esac
使用了-n選項,後接數值1,指示read命令只要接受到一個字符就退出
四、讀文件
還可使用read命令讀取Linux系統上的文件。每次調用read命令都會讀取文件中的"一行"文本。當文件沒有可讀的行時,read命令將以非零狀態退出。讀取文件的關鍵是將文本中的數據傳送給read命令,最經常使用的方法是對文件使用cat命令並經過管道將結果直接傳送給包含read命令的while命令
count=1 //賦值語句,不加空格 cat test | while read line //cat 命令的輸出做爲read命令的輸入,read讀到的值放在line中 do echo "Line $count:$line" count=$[ $count + 1 ] //注意中括號中的空格。 done echo "finish" exit 0
Shell單行註釋 # 註釋內容
多行註釋
:<<EOF
註釋內容...
註釋內容...
EOF
EOF也可使用其餘字符,只要先後保持一致就行。
運行 Shell 腳本有兩種方法:
一、做爲可執行程序
將上面的代碼保存爲 test.sh,並 cd 到相應目錄:
chmod +x ./test.sh #使腳本具備執行權限 ./test.sh #在當前目錄執行腳本test.sh
二、做爲解釋器參數
這種運行方式是,直接運行解釋器,其參數就是 shell 腳本的文件名,如:
/bin/sh test.sh
三、在Git Bash命令行中運行.sh文件
$ sh test.sh
Shell變量
定義變量時,變量名不加美圓符號"$",如:
you_name="LXP-Never"
變量名和等號之間不能有空格, 這和咱們熟悉的python編程語言不同,可是變量名的命名規則是同樣的。
使用變量
使用一個定義過的變量,只需在變量名前面加美圓符號$ 便可
name="LXP" echo $name echo ${name}
變量名外面的花括號是可選的,加不加都行,若是加了花括號更加方便的識別變量的邊界。推薦給全部的變臉加上花括號,這是一個好的編程習慣。
只讀變量 readonly name,只讀變量的值不能被改變,不能被unset刪除
刪除變量 unset name
Shell字符串,字符串能夠用單引號,也能夠用雙引號,也能夠不用。可是使用雙引號能夠用$符號使用變量,還可使用轉義字符\
your_name="runoob" # 使用雙引號拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # hello, runoob ! hello, runoob ! # 使用單引號拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3 # hello, runoob ! hello, ${your_name} !
獲取字符串長度
string="abcd" echo ${#string} # 4 expr length "$string" # 4
提取子字符串
如下實例從字符串第2個字符開始截取4個字符,取不到開始索引。
var="http://www.aaa.com/123.htm" echo ${string:1:4} # ttp:
從左邊第幾個字符開始,一直到結束,取不到開始索引。
echo ${var:7} # is a great site
從右邊第幾個字符開始,的幾個字符
echo ${var:0-7:3} # 123
從右邊第幾個字符開始,一直到結束。
echo ${var:0-7} # 123.htm
Shell數組
從0開始索引
定義數組,用空格分割不一樣的數組元素
array_name=(value1 value2 value3 ...valuen)
讀取數組
讀取數組元素值得通常格式是:
${數組名[下標]}
valuen=${array_name[n]}
使用 @ 符號能夠獲取數組中的全部元素
echo ${array_name[@]}
獲取數組的長度
# 取得數組元素的個數 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得數組單個元素的長度 lengthn=${#array_name[n]}
截取
#和##號截取,刪除左邊的字符 ${var#*//} # 刪除var左邊的字符,直到遇到第一個//
%和%%號截取,刪除右邊的字符 ${var%//*} # 刪除var左邊的字符,直到遇到第一個//
var=http://www.aaa.com/123.htm echo ${var#*//} # www.aaa.com/123.htm echo ${var##*/} # 123.htm echo ${var%/*} # http://www.aaa.com echo ${var%%/*} # http:
關係運算符
關係運算符只支持數字,不支持字符串
a=10 b=20
運算符 | 說明 | 舉例 |
---|---|---|
-eq |
檢測兩個數是否相等,相等返回 true。 |
[ a−eqa−eq b ] 返回 false。 |
-ne |
檢測兩個數是否不相等,不相等返回 true。 |
[ a−nea−ne b ] 返回 true。 |
-gt |
檢測左邊的數是否大於右邊的,若是是,則返回 true。 |
[ a−gta−gt b ] 返回 false。 |
-lt |
檢測左邊的數是否小於右邊的,若是是,則返回 true。 |
[ a−lta−lt b ] 返回 true。 |
-ge |
檢測左邊的數是否大於等於右邊的,若是是,則返回 true。 |
[ a−gea−ge b ] 返回 false。 |
-le |
檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 |
[ a−lea−le b ] 返回 true。 |
文件測試運算符
文件測試運算符用於檢測 Unix 文件的各類屬性。
操做符 | 說明 | 舉例 |
---|---|---|
-d file | 檢測文件是不是目錄(在linux中目錄就是文件夾的意思),若是是,則返回 true。 | [ -d $file ] 返回 false。 |
-e file | 檢測文件(包括目錄)是否存在,若是是,則返回 true。 | [ -e $file ] 返回 true。 |
-f file | 檢測文件是不是普通文件(既不是目錄,也不是設備文件),若是是,則返回 true。 | [ -f $file ] 返回 true。 |
-c file | 檢測文件是不是字符設備文件,若是是,則返回 true。 | [ -c $file ] 返回 false。 |
-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。 |
-b file | 檢測文件是不是塊設備文件,若是是,則返回 true。 | [ -b $file ] 返回 false。 |
布爾運算符
運算符 | 說明 | 舉例 |
---|---|---|
! |
非運算 |
[ ! false ] 返回 true。 |
-o |
或運算 |
[ a−lt20−oa−lt20−o b -gt 100 ] 返回 true。 |
-a |
與運算 |
[ a−lt20−aa−lt20−a b -gt 100 ] 返回 false。 |
邏輯運算符
運算符 | 說明 | 舉例 |
---|---|---|
&& |
邏輯的 AND |
[[ a -lt 100 &&a -lt 100 && b -gt 100 ]] 返回 false |
|| |
邏輯的 OR |
[[ a−lt100||a−lt100|| b -gt 100 ]] 返回 true |
字符串運算符
運算符 | 說明 | 舉例 |
---|---|---|
= |
檢測兩個字符串是否相等,相等返回 true。 |
[ a=a= b ] 返回 false。 |
!= |
檢測兩個字符串是否相等,不相等返回 true。 |
[ a!=a!= b ] 返回 true。 |
-z |
檢測字符串長度是否爲0,爲0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
檢測字符串長度是否爲0,不爲0返回 true。 |
[ -n "$a" ] 返回 true。 |
str |
檢測字符串是否爲空,不爲空返回 true。 |
[ $a ] 返回 true。 |
Shell流程控制
if else
if condition1
then
command1
elif condition2
then
command2
else
command3
fi
for循環
for var in item1 item2 ... itemN
do
command1
done
while語句
while condition
do
command
done
case
Shell case語句爲多選擇語句,能夠用case語句匹配一個值與一個模式,若是匹配成功,執行相匹配的命令。
case num in
1) command1
;;
2) command2
;;
esac
跳出循環
break、continue
Shell函數
funname(){
echo "這是個人第一個Shell函數"
}
echo "調用函數"
funname
可使用return返回函數
函數參數
在函數內部經過使用 $n 的形式來獲取參數的值,例如,1表示第一個參數,1表示第一個參數, 2表示第二個參數...
funWithParam(){ echo "第一個參數爲 $1 !" echo "第十個參數爲 ${10} !" echo "參數總數有 $# 個!" echo "做爲一個字符串輸出全部參數 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
輸出結果:
第一個參數爲 1 ! 第十個參數爲 10 ! 參數總數有 11 個! 做爲一個字符串輸出全部參數 1 2 3 4 5 6 7 8 9 34 73 !
注意,10不能獲取第十個參數,獲取第十個參數需要10不能獲取第十個參數,獲取第十個參數須要 {10}。當n>=10時,須要使用${n}來獲取參數。
$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示全部向腳本傳遞的參數
shell文件導入
. filename # 注意點號(.)和文件名中間有一空格
如:
test1.sh文件內
url="做者的名字是:"
在test2.sh腳本文件內導入test1.sh腳本
. ./test1.sh echo "${url}不告訴你"
添加可執行權限並執行,而後執行test2.sh腳本,
$ chmod +x test2.sh $ ./test2.sh 做者的名字是:不告訴你
參考文獻
從鍵盤獲取輸入read
做者:凌逆戰
歡迎任何形式的轉載,但請務必註明出處。
限於本人水平,若是文章和代碼有表述不當之處,還請不吝賜教。
本文章不作任何商業用途,僅做爲自學所用,文章後面會有參考連接,我可能會複製原做者的話,若是介意,我會修改或者刪除。