shell指令碼練習

來源:互聯網
上載者:User

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 資料庫了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.