Shell編程總結
一、Hello World
新建文件test.sh
然后編輯代碼:
#!bin/bash/ echo “hello world !”
cd 到目標目錄下:
chmod +x ./test.sh #使腳本有執行權限 ./test.sh #運行腳本
另一種運行方式:
sh test.sh
二、變量
- 變量名要求:
a) 只能是數字,字符,下划線,並且首字母不能是數字
b) 中間不能有空格,但是可以有下划線
c) 不能用關鍵詞
- 使用變量:
myshell=”12345” echo ${myshell}
花括號加不加都行,加花括號只是方便解釋器識別變量邊界。
另外變量和運算符之間不能有空格。
- 只讀變量
myshell=“1234”
readonly myshell
只讀變量意味着不能更改
- 刪除變量
myshell=”1234”
unset myshell
echo myshell #可以看到什么也沒輸出
- 變量類型
a) 局部變量:只在shell中起作用,shell運行的時候其他命令不能調用它
b) 環境變量:shell運行的時候,其他命令可以調用的
c) shell變量:是由shell程序設置的特殊變量,有局部變量也有環境變量,這些變量是保證shell的正常運行
- shell字符串
a) 單引號:
i. 任何字符都會原樣輸出,單引號里面的變量無效
ii. 單引號里面不能出現單引號(轉義的也不行)
b) 雙引號
i. 雙引號里可以有變量
ii. 雙引號里可以出現轉義字符
eg:
#!/bin/bash yourname='lihua' myshell="Hello, I know you are \"${yourname}\"!" echo ${myshell}
- 拼接字符:
#!/bin/bash yourname="lihua" chat="Hello, "$yourname" !" chat1="Hello, ${yourname} !" echo ${chat} ${chat1}
- 獲取字符串長度
#!/bin/bash myshell="123" echo ${#myshell}
- 提取子串
#!/bin/bash string="I'm AI" echo ${string:1:2}
這個地方運行的時候用sh test.sh可能會不兼容,可以用 chmod +x ./test.sh運行
- 查找子串
#!/bin/bash string="hello, AI" echo `expr index "$string" h` #兩邊的不是單引號是Esc鍵下邊的那個符號,句式是固定的的
- shell數組
shell只支持一維數組
a) 格式:
數組名=(val1 val2…) #用空格分離
value=(1 2 3 4)
b) 隨機訪問下標:
value[1]=1
c) 讀取數組:
i. ${數組名[下標]}
ii. 讀取全部元素${數組名[@]}
d) 獲取長度
# 取得數組元素的個數
length=${#數組名[@]}
# 或者
length=${#數組名[*]}
# 取得數組單個元素的長度
lengthn=${#數組名[n]}
- shell注釋
前面加#
三、shell傳遞參數
傳遞參數的格式,$n,$0表示執行文件名,$1表示第一個參數,之后以此類推:
A+B的小例子:
#!/bin/bash echo "name:$0" a=$1 b=$2 c=`expr ${a} + ${b}` echo ${c}
幾個特殊符號:
參數處理 |
說明 |
$# |
傳遞到腳本的參數個數 |
$* |
一第一個單字符顯示所有腳本傳遞的參數。 |
$$ |
腳本運行的當前進程ID號 |
$! |
后台運行的最后一個進程的ID號 |
$@ |
與$*相同,使用時加引號,是返回每個參數 |
$- |
顯示shell使用的當前選項,與set命令功能相同 |
$? |
顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值都表示有錯誤。 |
四、shell基本運算符
a) 基本包括:算數運算符、關系運算符、布爾運算符、字符串運算符、文件測試運算符。
bash不支持原生的數學運算,可以通過其他命令來實現,awk和expr
b) 算數運算符
運算符 |
說明 |
舉例 |
+ |
加法 |
`expr $a + $b` |
- |
減法 |
`expr $a - $b` |
* |
乘法 |
`expr $a * $b` |
/ |
除法 |
`expr $a / $b` |
% |
取余 |
`expr $a % $b` |
= |
賦值 |
a=$b |
== |
相等,返回true |
[$a == $b] |
!= |
不相等,返回true |
[$a != $b] |
#!/bin/bash a=1 b=2 if [ $a == $b ] then echo "equal" fi if [ $a != $b ] then echo "not equal" fi
c) 關系運算符
運算符 |
說明 |
舉例 |
-eq |
兩個數是否相等 |
[ $a –eq $b ] |
-ne |
兩個數是否不相等 |
[ $a –ne $b ] |
-gt |
左邊是否大於右邊 |
[ $a –gt $b ] |
-lt |
左邊是否小於右邊 |
[ $a –lt $b ] |
-ge |
左邊是否大於等於右邊 |
[ $a –ge $b ] |
-le |
左邊是否小於等於右邊 |
[ $a –le $b ] |
d) 布爾運算符
運算符 |
說明 |
舉例 |
! |
非運算 |
[ ! false ] |
-o |
或運算 |
[ $a –lt 20 –o $b –gt 100 ] |
-a |
與運算 |
[ $a –lt 20 –a $b –gt 100 ] |
e) 邏輯運算符
運算符 |
說明 |
舉例 |
&& |
邏輯的AND |
[[ $a -lt 100 && $b -gt 100 ]] |
|| |
邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] |
f) 字符串運算符
運算符 |
說明 |
舉例 |
= |
檢測兩個字符串是否相等 |
[ $a = $b ] |
!= |
檢測兩個字符串是否不等 |
[ $a != $b ] |
-z |
檢測字符串長度是否為零 |
[ -z $a ] |
-n |
檢測字符串長度是否不0 |
[ -z $a ] |
str |
檢測字符串是否為空 |
[ $a ] |
g) 文件測試符
操作符 |
說明 |
舉例 |
-b file |
檢測文件是否是塊設備文件 |
[ -b $file ] |
-c file |
檢測文件是否是字符設備文件 |
[ -c $file ] |
-d file |
檢測文件是否是目錄 |
[ -d $file ] |
-f file |
檢測文件是否是普通文件 |
[ -f $file ] |
-g file |
檢測文件是否設置了SGID位 |
[ -f $file ] |
-k file |
檢測文件是否設置了黏着位 |
[ -k $file ] |
-p file |
檢測文件是否有名管道 |
[ -p $file ] |
-u file |
檢測文件是否設置了SUID位 |
[ -u $file ] |
-r file |
檢測文件是否可讀 |
[ -r $file ] |
-w file |
檢測文件是否可寫 |
[ -w $file ] |
-x file |
檢測文件是否可執行 |
[ -x $file ] |
-s file |
檢測文件是否為空 |
[ -s $file ] |
-e file |
檢測文件是否存在 |
[ -e $file ] |
五、echo命令
a) 顯示字符串
i. echo “It is a test”
ii. 雙引號可以省略:echo It is a test
b) 顯示轉義字符
i. echo “\”It is a test \””
c) 顯示變量
#!/bin/bash read name echo "$name from read"
d) 顯示換行
i. echo –e “ok! \n” # -e 開啟轉義
echo “It is a test”
e) 顯示不換行
i. echo –e “ok! \c” # -e 開啟轉義
echo “It is a test”
f) 將結果重定向至文件
i. echo “It is a test” > myfile
g) 原樣輸出到字符串,不進行轉移或取變量
i. echo ‘$name\”’s
h) 顯示執行命令結果
i. echo `date` #這里用的是反引號
六、Shell流程控制、
a) if
語法格式:
if condition then command1 command2 … fi
b) if else
if condition then command1 … else command1 … fi
c) if else-if else
if condition1 then command1 elif condition2 then command1 else commandm fi
d) for 循環
格式:
for var in item1 item2 … itemN do command1 command2 … Done
例子:
#!/bin/bash value=(A B C D) for var in ${value[@]} do echo "The value is: $var" done for loop in A B C D do echo "The value is: $loop" done
e) while循環
while condition do command done
例子:
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
f) until循環
就像do-while和while循環的區別一樣
g) case
就像switch。
格式:
case 值 in 模式1) command1 … ;; 模式2) command2 … ;; esac #就像C語言中的default
h) break、continue、esac
七、shell函數
格式:
[ function ] funname [()] { action; [return int;] }
例子:
#!/bin/bash demoFun() { echo "$1" echo "$2" } demoFun 100 110
八、輸入輸出重定向
命令 |
說明 |
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之間的內容作為輸入 |
九、Shell文件包含
格式:
. filename #注意點號和文件名中間有一空格
或
source filename
實例:
test1.sh
#!/bin/bash url=http://www.runoob.com
test2.sh
#!/bin/bash #通過.號來引用test1.sh文件,這樣test1.sh中的東西test2.sh就能用了 . ./test1.sh echo "$url"