Shell編程入門(第二版)(上)
簡單的樣本Shell程式
樣本1.
#!/bin/bash#This is to show what a shell script looks likeecho "Our first example"echo # This inserts an empty line in output.echo "We are currently in the following directory."/bin/pwdechoecho "This directory contains the following files"/bin/ls -l .
樣本2.
#!/bin/bash# Auto mail for system info/bin/date +%F >> /tmp/sysinfoecho >> /tmp/sysinfoecho "Disk info:" >> /tmp/sysinfo/bin/df -h >> /tmp/sysinfoecho >> /tmp/sysinfoecho "Online users:" >> /tmp/sysinfo/usr/bin/who | /bin/grep -v root >> /tmp/sysinfoecho >> /tmp/sysinfoecho "Memory info:" >> /tmp/sysinfo/usr/bin/free -m >> /tmp/sysinfoecho >> /tmp/sysinfo# Write to root /usr/bin/write root < /tmp/sysinfo && /bin/rm -f /tmp/sysinfo# crontab -e# 0 9 * * 1-5 ./sysinfo.sh
Shell結構
1、#!指定執行指令碼的Shell
2、#注釋行,描述該指令碼的作用,負責人等資訊
3、命令和控制結構
建立shell程式的步驟
第一步:建立一個包含命令和控制結構的檔案。
第二步:修改這個檔案的許可權使它可以執行: chmod u+x
第三步:執行 ./example 或 sh example 或 . sysinfo.sh
Shell變數
變數:是shell傳遞資料的一種方法,用來代表每個取值的符號名。
Shell有兩類變數:臨時變數和永久變數。
臨時變數是shell程式內部定義的,其使用範圍僅限於定義它的程式,對其它程式不可見。包括:使用者自訂變數、位置變數。
永久變數是環境變數,其值不隨shell指令碼的執行結束而消失。
1、使用者自訂變數
使用者定義的變數由字母或底線開頭,由字母、數字或底線序列組成,區分大小寫。變數名長度沒有限制。在使用變數值時,要在變數名前加上首碼“$”。
2、設定和使用變數
設定變數:習慣上用大寫字母來命名變數。變數名只能以字母表中的字元開頭,不能用數字。
變數賦值:“=”兩邊沒有空格。
定義時賦值,如NUM=1
將一個命令的執行結果賦給變數,如:TIME=`date`;TIME=$(date +%F)
將一個變數的值賦給另一個變數,如:B=120 ; A =$B
使用echo命令查看變數值。例如:echo $A
3、包含多個字的變數:
NAME=Mike Ron #運行時出錯,應改為:
NAME=“Mike Ron” 或 $NAME=‘Mike Ron’
4、單引號與雙引號的區別
比如:定義DATE=$(date +%F)
time=”time is $DATE”
echo $time
time='time is $DATE'
echo $time
單引號之間的內容原封不動地指定給了變數。
5、 set查看系統中定義的所有變數
unset刪除所定義的變數
6、位置變數
Shell解釋執行使用者命令時,將命令列的第一個部分作為命令名,其它部分作為參數。由出現在命令列上的位置確定的參數稱為位置參數。
例如:
ls -l file1 file2 file3
$0 這個程式的檔案名稱 ls -l
$n 這個程式的第n個參數值,n=1~9
7、特殊變數
$* 這個程式的所有參數
$# 這個程式的參數個數
$$ 這個程式的PID
$! 執行上一個後台命令的PID
$? 執行上一個命令的傳回值
樣本-autobak.sh
#!/bin/bash# backup files by dateDATE=$(/bin/date +%Y%m%d)/bin/tar -cf /backup/$1.$DATE.tar $1 > /dev/null 2>> /backup/$1.bak.log/bin/gzip /backup/$1.$DATE.tarif [ $? -eq 0 ] then echo "$1 $DATE backup successfully" >> /backup/$1.bak.logelse echo "ERROR: failure $1 $DATE backup" >> /bakup/$1.bak.logfi# crontable -e# 0 3 * * 2,5 script
樣本-special.sh
#!/bin/bash# A test script for special varecho '$# is' $#echo '$* is' $*echo '$0 is' $0echo '$? is' $?echo '$$ is' $$echo '$2 is' $2
Shell命令
1、read命令[互動方式]
read USERNAME
樣本-read.sh
#!/bin/bash# A test script for readread first second thirdecho "Your first parameter is $first"echo "Your second parameter is $second"echo "Your third parameter is $third"
#sh -x 命令:單步調試顯示執行
2、expr命令,對整型變數進行運算
如: expr 3 + 5 #”+”號之間須有空格
expr $var1 - 5
expr $var1 / $var2
expr $var3 \* 10 #”*”號需要轉義符”\”
複雜的運算:
expr `expr 5 + 7`/$var4
將運算結果賦予變數:
var4=` expr $var1 / $var2 `
樣本-expr.sh
#!/bin/bash# A test for expra=10b=20c=30val1=$(expr $a + $b + $c)echo "The value of val1 is $val1"val2=$(expr $c / $b)echo "The value of val2 is $val2"val3=`expr $a \* $b`echo "The value of val3 is $val3"val4=`expr $a + $c / $b`echo 'The value of $a + $c / $b is ' $val4