一、腳本語言跟編譯型語言的區別
1、腳本語言
不需編譯,由解釋器解釋執行;
弱類型:變量類型;
變量通常不需要實現聲明;
2、編譯型語言
事先編譯(源程序-->目標代碼-->鏈接-->執行);運行時不再依賴於編譯器;
強類型;
變量需要事先聲明;
二、變量類型
1、本地變量
set VAR_NAME=value #定義變量 unset VAR_NAME #取消變量 ${VAR_NAME} #引用變量
作用範圍:當前shell進程
2、局部變量
local VAR_NAME=value #定義變量 unset VAR_NAME #取消變量 ${VAR_NAME} #引用變量
作用範圍:當前shell進程局部有效
3、環境變量
export VAR_NAME=value unset VAR_NAME ${VAR_NAME}
作用範圍:當前shell進程及其子shell進程
4、位置變量:$1,$2,$3...
5、特殊變量:$$,$?,$#,$@...
三、Bash Shell腳本
# bash /path/to/script_file.sh
1、 獨立執行:
要有執行權限;
定義好shebang, 即腳本的第一行:#!/path/to/explainer
例如:#!/bin/bash “#”只有腳本第一行的“#”有特殊意義外,其他行的都爲註釋行運行腳本時不執行。
2、bash的配置文件
profile類:/etc/profile, /etc/profile.d/*.sh, ~/.bash_profile
聲明環境變量
執行程序或腳本
bashrc類:/etc/bashrc, ~/.bashrc
定義本地變量
定義命令別名
3、變量命名規則
只能包含字母數字和下劃線
不能以數字開頭
嚴格區分大小寫
要做到見名知意
命名規範,風格統一
不能跟系統變量重名
4、控制語句
for
while
until
四、for循環
事先提供一個元素列表,而後,使用變量去遍歷此元元素列表;每訪問一個元素,就執行一次循環體;直到元素訪問完畢。
1、用法格式:
for VAR_NAME in 元素1 元素2 ...; do 語句1; 語句2; ... done
2、 腳本寫完在執行前測試有沒有語法錯誤,就以test.sh爲例
bash -n test.sh #測試腳本有沒語法錯誤 chmod +x test.sh #給腳本執行權限 ./test.sh #執行測試 bash -x test.sh #執行時顯示執行過程
3、添加user1,user2,user3三個用戶,並配置與用戶名相同的祕密
#!/bin/bash # for UserName in user1 user2 user3; do useradd $UserName echo $UserName | passwd --stdin $UserName done
4、 寫一個腳本,顯示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三個文件各有多少行
for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do wc -l $FileName done
5、使用for循環統計/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#開頭的行的行數和空白行數
#!/bin/bash for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do echo "$File:" echo -e "\t#lines: `grep "^#" $File | wc -l`" echo -e "\tspace lines: `grep "^$" $File | wc -l`" done
6、使用for循環,複製/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目錄中,並重命名爲原有的名稱之後加當前日期,如第一個文件爲/tmp/fstab-2013-07-15
#!/bin/bash for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do cp $File /tmp/$File-`date +%F` done
7、生成數字序列
{}:{起始數字..結束數據},例如{1..100}表示從1到100之間的所有正整數;
`seq [起始數字] [步長] 結束數字`
8、使用for循環取出每個用戶用戶名和Shell
#!/bin/bash LINES=`wc -l /etc/passwd | cut -d' ' -f1` #看清楚這裏用的是反引號! for I in `seq 1 $LINES`; do head -$I /etc/passwd | tail -1 | cut -d: -f1,7 done
9、寫一個腳本,計算100以內所有整數的和
#!/bin/bash # Sum=0 for I in {1..100}; do #這裏使用的就是數字序列 Sum=$[$Sum+$I] done echo "The sum is: $Sum."
10、寫一個腳本,計算100以內,所有偶數的和,以及所有奇數的和
#!/bin/bash EvenSum=0 OddSum=0 for I in `seq 1 2 100`; do OddSum=$[$OddSum+$I] done for I in `seq 2 2 100`; do EvenSum=$[$EvenSum+$I] done echo "Even Sum: $EvenSum; Odd Sum: $OddSum."