11.參數傳遞

Bash shell 提供位置參數來擔任參數的傳遞工作。

例:./pa.sh A B C D E F G H I

其中 A B C D E F G H I 為欲傳入 pa.sh 這支 script 的 9 個參數,此時,用 $0 來代表 script 本身的檔案名稱,$1 代表第一個參數,也就是 A,$2 代表第一個參數,也就是 B,其它依此類推。

$# 代表參數的總數,也就是 9。

$* 代表所有的參數,也就是 A B C D E F G H I

$@ 代表所有的參數,也就是 A B C D E F G H I

$* 和 $@ 稍有不同:"$*" 代表 "A B C D E F G H I","$@" 代表 "A" "B" "C" "D" "E" "F" "G" "H" "I"

shift 用來移動參數的位置,每執行一次,則所有的參數往左移一位,此時 $1 為 B,$2 為 C,......

set 用來重新設定位置參數,比如:set a b c d,表示重新設定 $1 為 a, $2 為 b, $3 為 c, $4 為 d

pa.sh

#! /bin/sh
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
echo "\$5 = $5"
echo "\$6 = $6"
echo "\$7 = $7"
echo "\$8 = $8"
echo "\$9 = $9"

要特別注意的是:位置參數只有 $1 ~ $9 等九個,沒有 $10。$10是代表 $1 和 0 的組合,也就是說:若 $1 為 A,則 $10 為 A0 之意,例如以下 script 所示:

pa2.sh

#! /bin/sh
echo "\$10 = $10"


./pa2.sh A
結果:
$10 = A0

第五章曾提過自動安裝 script,現在我們再加以改良:

#! /bin/sh
# 使用法: ./install-app.sh Apache版本 PHP版本 MySQL安裝路徑

if [ $# -ne 0 -a $# -ne 3 ]; then
   echo "使用法: ./install-app.sh Apache版本 PHP版本 MySQL安裝路徑"
   echo "或"
   echo "./install-app.sh"
   exit
fi

# 設定版本編號及 MySQL 安裝路徑

if [ -n $1 ]; then
     ApacheVersion="$1"
else
     ApacheVersion="1.3.26"
fi

if [ -n $2 ]; then
     PHPVersion="$2"
else
     PHPVersion="4.1.2"
fi

if [ -n $3 ]; then
     MYSQLHOME="$3"
else
     MYSQLHOME="/home/mysql"
fi

# 解壓
tar xvzf apache_$ApacheVersion.tar.gz &&
tar xvzf php-$PHPVersion.tar.gz &&

# 設定 Apache
echo "Configure apache ...." &&
cd apache_$ApacheVersion &&
./configure --prefix=/usr/local/apache &&

# 設定/編譯/安裝 PHP
cd .. &&
cd php-$PHPVersion &&
./configure \
          --with-apache=../apache_$ApacheVersion \
          --with-mysql=$MYSQLHOME &&
make &&
make install &&
cd .. &&

# 設定/編譯/安裝 Apache
cd apache_$ApacheVersion &&
./configure \
          --prefix=/usr/local/apache \
          --activate-module=src/modules/php4/libphp4.a &&
make &&
make install &&

# 拷貝 php.ini 到 /usr/local/lib
cd ../php-$PHPVersion &&
cp -f php.ini-dist /usr/local/lib/php.ini

echo
echo "Done!"
echo