shell程式設計入門指南
shell程式設計入門指南
---大頭針
一、變數
變數:C也是 從變數開始學起。shell程式設計也從變數學起。
變數三個方面:1、資料型別 2、生存期 3、作用域
1.1 資料型別:變數依據你賦值的型別
C與Shell對比:
C:
int a="abcd";(錯誤)
Shell:
a="abcdef"
a就是字串型別
b=3
b就是整型
1.2 變數
從變數的生存期和作用域角度劃分一般使用到得變數有三種。
1.本地變數
在使用者現在的shell生命期的指令碼中使用,如果shell啟動另一個程式或退出,此值失效。
有5種常用的使用方法:
1.變數賦值
a="abcd"
2.顯示變數
echo $a
3.清除變數
unset a
4.顯示所有本地shell
set
5.只讀變數
name="abc"; readonly name
2.環境變數
登入程式為父程式,shell中執行的使用者程式為子程式。環境變數可用於所有子程式。環境變數最好在profile檔案中定義。習慣上,所有環境變數均應該大寫。
有5種常用的使用方法:
1.變數賦值
abc="abc";export abc
2.顯示環境變數
echo $abc
3.顯示所有環境變數
env
4.清除環境變數
unset abc
5.常用環境變數
HOME PATH PWD USER
3.位置變數
這個特別適合於執行命令時,傳遞引數。
1.位置變數一般用$0--$9
例如:
service httpd start
$0表示:service
$1表示:httpd
$2表示:start
2.$#表示引數的總個數
使用變數時注意事項:
在使用C程式設計的時候,在使用變數時,如果變數沒有被賦值就使用則會出現問題。Shell有專門的檢測變數是否被設定的方法:
測試變數是否已經設定
1.${var:-value}:
如果變數var未定義,返回一個預設值如果var存在且非空,則表示式${var:-value}的值為$var,如果var未定義,則表示式值${var:-value}為value.
name1="dong";name2=${name1:-no name};echo $name1 $name2
unset name1; name2=${name1:-no name};echo $name1 $name2
2.${var:=value}:
如果var未定義,設定var的預設值為value
如果var存在且非空,則${var:=value}的值為$var;如果var為空或未定義,則var被賦值value且表示式值為value。
3.${var:?mesg}
捕獲未定義變數導致的錯誤。
如果var存在且非空,則${var:?value}的值為$var;如果var為空或未定義,則列印mesg並終止指令碼。
4.${var:+mesg}:
測試一個變數的存在性
如果var存在且非空,則${var:+mesg}的返回值為mesg;如果var為空或未定義,則返回null
二、條件:
對於我們寫程式來說,無論選擇結構和迴圈結構都離不開條件。C語言的條件主要由運算子組成的各類表示式組成,條件的組成非常靈活。而shell的條件一般分為三類。其中的檔案狀態條件都是系統設定好的,只有記住才能夠利用好。
2.1.檔案狀態的條件
1. file1 -ef file2 file1和file2有相同的裝置和相同節點號。
2. file1 -nt file2 file1比file2修改時間更晚。
3.file1 -ot file2 file1比file2修改時間更早
4. -b file1 file1存在並且是塊裝置
5. -c file1 file1存在並且是字元裝置
6. -d file1 file1存在並且是目錄
7. -e file1 file1存在
8. -f file1 file1存在並且是普通檔案
9. -g file1 file1存在並且有組ID
10. -h file1 file1存在並且是軟連結檔案
-L file1
11. -G file1 file1存在並且擁有者所在的組也存在
12. -k file1 file1存在並且粘滯位已設定
13. -O file1 file1存在並且擁有者也存在
14. -p file1 file1存在並且是管道檔案
15. -s file1 file1存在並且是非空檔案
16. -S file1 file1存在並且是程式
17. -t file1
18. -u file1 file1存在並擁有者的ID位已設定。
19. -w file1 file1存在並可寫
20. -x file1 file1存在並可執行
2.2.字串的條件
C語言中字串的比較是通過strcmp(str1,str2) 用函式實現字串比較
而Shell則比較簡單:
1. -z string:字串為空串時返回真
2. -n string: 不為空串
3. str1 = str2 : 相等
4. str1 != str2: 不相等時返回真
5. str1<str2:
6. str1>str2:
2.3.有關數值的條件
C語言中數值比較,是通過算術運算子(> < =等)實現,而shell利用了一些單詞縮寫實現。
int1 -eq int2 等於
-ne 不等於
-lt 小於
-le 小於等於
-gt 大於
-ge 大於等於
三、控制結構:
C的程式結構與Shell的程式結構大同小異。
3.1選擇結構:
1.If結構
if [ conditon1 ]
then
statments1
elif [ condition2 ]
then
statments2
else
statments3
fi
2.case結構
case variable in
value) command1
exit 0
;;
value) command 2
exit 0
;;
esac
3.2.迴圈結構:
1.for結構
for name [in list]
do
statements using $name
done
1.list應該是一系列由空格分隔的字元序列(單詞),省略in list 時預設為
$@(命令列的引數列表)
2.for迴圈執行的次數取決於列表list中單詞的個數
3.在for迴圈體中一般要出現變數$name,但也可以不出現。
2.迴圈結構:until
until [ condition ]
do
statments
done
condition 條件成立退出迴圈
3.迴圈結構:while迴圈
while [ condition ]
do
statments
done
條件不成立退出迴圈
備註:
還有一些經常與迴圈結合的命令:比如break [n]、continue [n]。和C中break Continue功能基本一致。只不過break可以選擇跳出幾層迴圈、continue可以選擇跳過幾個回合。
四、命令
熟悉了上面三部分內容對於我們寫shell程式奠定了基礎。但巧婦難為無米之炊
。shell程式的主體內容是shell所提供的命令:例如 cp ls useradd。
如果你沒有系統學習過shell的命令,你是寫不出來shell程式的。
最後得出結論:
變數+條件+程式結構+shell命令==shell程式。
五、例項:
1. 編寫shell程式,實現自動增加50個賬號的功能。賬號名為stud1至stud50。
#! /bin/bash
#useradd.sh
#i這屬於 變數
i=1
#while 這屬於 程式結構
while [ $i -le 50 ]
do
#cat ...命令的含義是使用管道以及正規表示式檢視passwd檔案中是否存在類似#stud1-stud50之間的使用者. 這屬於 shell 命令
# -z 測試字串是否為空.這屬於 條件
if [ -z "`cat /etc/passwd|grep "stud$i/>"`" ]
then
useradd stud$i
echo "useradd success!"
else
"user stud$i exist!"
fi
done
最終驗證了我的結論:
shell程式=變數+條件+程式結構+shell命令。
一開始接觸linux shell,大多都認為比較難學。但按照上面的學習思路,很快你就會學會shell程式設計。
六、補充知識:
函式:
Shell也提供了函式機制。格式如下:[function] NAME() {command-list;}
返回值:return [n]
將函式的返回值設定為n .若不指定n值,則使用return 之前所執行的最後一個命令的狀態值。
$?
執行後命令後的狀態
例項:
#!/bin/bash
function psgrep
{
ps –aux|grep $1
}
相關文章
- Shell 程式設計入門程式設計
- shell程式設計入門程式設計
- csh shell程式設計入門程式設計
- Shell程式設計入門例項程式設計
- 遊戲程式設計入門指南遊戲程式設計
- Linux入門---(三)Shell程式設計Linux程式設計
- 程式設計“初學者”入門指南 (轉)程式設計
- 10分鐘入門Shell指令碼程式設計指令碼程式設計
- Shell指令碼程式設計30分鐘入門指令碼程式設計
- Linux下的shell程式設計入門(轉)Linux程式設計
- Linux-shell程式設計入門基礎Linux程式設計
- Shell程式設計基礎學習之六:sed 入門程式設計
- Shell程式設計入門:Linux直譯器原理(轉)程式設計Linux
- Google自動程式設計框架AutoML入門指南Go程式設計框架TOML
- [譯]函式式響應程式設計入門指南函式程式設計
- Let’s do this!新手程式設計師的入門指南程式設計師
- 高階bash/shell指令碼程式設計指南指令碼程式設計
- Shell程式設計-01-Shell指令碼初步入門程式設計指令碼
- 入門程式碼程式設計程式設計
- Linux命令列與shell指令碼程式設計入門經驗Linux命令列指令碼程式設計
- shell程式設計(三)輸入輸出程式設計
- 程式設計和網路程式設計入門程式設計
- shell程式設計程式設計
- 程式設計師健康防猝指南5:運動基礎入門程式設計師
- Python 程式設計師的 Golang 學習指南(III): 入門篇Python程式設計師Golang
- Number 1 — 程式設計入門程式設計
- Python程式設計入門Python程式設計
- TCSHshell程式設計入門(轉)程式設計
- 程式設計入門——壘積木學程式設計程式設計
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- Shell程式設計 --- Shell介紹程式設計
- shell入門
- 設計小科普!給設計師的模組化設計新手完全入門指南
- JAVA NIO程式設計入門(二)Java程式設計
- Flink DataStream 程式設計入門AST程式設計
- 程式設計入門學什麼?程式設計
- JAVA NIO程式設計入門(一)Java程式設計
- JAVA NIO 程式設計入門(三)Java程式設計