shell指令碼執行個體
備忘:一些與傳遞給shell的參數相關的變數:
$# 命令列參數的個數
$? 調用命令的傳回值
$$ 當前進程的進程號
$! 最後一個後台命令的進程號
$0 命令列的第一個參數,也就是命令名
$n 命令列的第n個參數,如果要取超過9個參數${n}
$* 所有的命令列參數,等於("$1 $2..."
"$@" 所有的命令列參數,等於("$1" "$2"...)
$_ 前一個命令的最後一個命令列參數
1. 寫一個指令碼,利用迴圈計算10的階乘
#!/bin/bash
#factorialteset
factorial=1
#for a in `seq 1 10`
for a in 1 2 3 4 5 6 7 8 9 10
do
factorial=`expr $factorial \* $a`
done
echo “10! = $factorial”
上面的小程式能夠實現求10!,但是有以下幾點需要注意:
1) for迴圈的實現方式,以上兩種都可以,一種是直接寫for a in 1 2 34 5 6 7 8 9 10,並且這幾個數字不需要加任何引號。另一種for a in `seq 1 10`,這裡用反單引號引起來,反單引號表示執行裡面的這句話,注意不能用單引號,更不能用雙引號。
2) factorial=1在初始化的時候,這個等號左右不能有任何空格。一定要注意。
3) factorial=`expr $factorial \* $a`,這句話要注意,也要用反單引號引起來。並且,乘號*前要用反斜線進行轉義。其中expr命令的用法是expr Expression,是求運算式變數的值。
2、寫一個指令碼,執行後,列印一行提示“Please input a number:",要求使用者輸入數值,然後列印出該數值,然後再次要求使用者輸入數值。直到使用者輸入"end"停止。
#! /bin/bash
#inputtest
var=null
while [ var != “end” ]
do
echo –n “inputa integer:”
read var
if [ $var = “END”]
then
break
fi
echo “var is$var”
done
以上程式,需要注意的是:
1)if [ $var = “END”]這句話,必要的空格一定要有,另外,是=而不是==
2)var=null這句話,仍然注意,變數賦值,等號左右不能有空格
3)echo –n “inputa integer:”這句話中-n表示斷行符號不換行, 這樣寫是為了好看,輸入和提示在一行上,當然也可以不用-n這樣的話提示在第一行,第二行上是輸入的數。
3、寫一個指令碼,利用迴圈和continue關鍵字,計算100以內能被3整除的數之和。
#!/bin/bash
#sumtest
sum=0
fora in `seq 1 100`
do
if [ `expr $a % 3` -ne 0 ]
continue
fi
sum=`expr $sum + $a`
done
echo“the sum is $sum”
這個指令碼在寫的時候實在是調試了很多遍啊。
1)一不小心就錯了。特別是什麼時候加空格,什麼時候不加空格
給變數賦值的時候一定不能有空格,比如sum=0,這個地方,另外,這裡不要寫成sum=null
2)在進行兩個數的運算的時候,不能直接寫成sum=$sum+$a而要寫成sum=`expr $sum + $a`
3)也就是說,指派陳述式的等號左右不能有空格。算數運算子左右一定要有空格,並且用expr再賦值給一個變數。
4)整數比較的時候不能用=和!= 而要用 –eq 和-ne
4、一個函數,利用shift計算所有參數乘積,假設參數均為整數( 特殊變數$# 表示包含參數的個數)
#! /bin/bash
#shifttest
result=1
while [ $# -gt 0 ]
do
result=`expr $1\* $result`
shift
done
echo “the result is $result”
其中:$1代表的是第一個參數,$#代表的是參數的格式,$# -gt 0代表的是參數的個數大於0.
shift表示移位
5、寫一個指令碼,可以根據參數檔案名稱,以正確的參數調用tar來解壓縮tar.gz或tar.bz2檔案。
#!/bin/bash
#casetest
case${1##*.tar} in
gz)
tar jxvf $1
;;
bz2)
tar zxvf $1
;;
*)
echo “errorfile”
esac
備忘:
$1表示運行該指令碼的第一個命令列參數
${1##*.tar}代表去掉第一個參數命令列參數的*.tar後剩下的部分。
比如,運行指令碼時用./mytar.shbak.tar.gz,那麼$1就是指的bak.tar.gz,${1##*.tar.}就是gz
同理,${3##*.tar.}表示第三個命令列參數去掉*.tar.後剩下的部分。
6、寫一個指令碼以方便使用者查詢rpm的相關資訊。這個指令碼首先提示使用者選取查詢依據,比如檔案名稱,包名,全部等。然後提示使用者選取查詢資訊,比如包名,包裡所包含的所有檔案,包的資訊等。然後詢問是否繼續查詢,是則迴圈剛才的過程,否則退出。
7、MySQL:Linux下自動備份資料庫的shell指令碼 Linux 伺服器上的程式每天都在更新 MySQL 資料庫,於是就想起寫一個 shell 指令碼,結合 crontab,定時備份資料庫。其實非常簡單,主要就是使用 MySQL 內建的 mysqldump
命令。
指令碼內容如下:
#!/bin/sh
# File: /home/mysql/backup.sh
# Database info
DB_NAME="test"
DB_USER="username"
DB_PASS="password"
# Others vars
BIN_DIR="/usr/local/mysql/bin"
BCK_DIR="/home/mysql/backup"
DATE=`date +%F`
# TODO
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BCK_DIR/db_$DATE.gz
然後使用將此指令碼加到 /etc/crontab 定時任務中:
01 5 * * 0 mysql /home/mysql/backup.sh
好了,每周日淩晨 5:01 系統就會自動運行 backup.sh 檔案備份 MySQL 資料庫了。