Linux Shell程式設計(9)——特殊變數型別

尹成發表於2014-09-30
區域性變數
區域性變數只在程式碼塊或一個函式裡有效 (參考函式裡的區域性變數)


環境變數
這種變數會影響Shell的行為和使用者介面

在大多數情況下,每個程式都會有一個"環境表", 它由一組由程式使用的環境變數組成。這樣看來,Shell看起來和其他的程式一樣。


每次一個Shell啟動時,它都會建立新的合適的環境變數。如果它增加或是更新一個環境變數,都會使這個Shell的環境表得到更新(譯者注:換句話說,更改或增加的變數會立即生效),並且這個Shell所有的子程式(即它執行的命令)能繼承它的環境變數。

分配給環境變數的總空間是有限的,如果建立太多的環境變數或有些環境變數的值太長而佔用太多空間會出錯。
           

如果一個指令碼要設定一個環境變數,則需要將它匯出(”exported”),也就是說要通知到指令碼的環境表。這就是export命令的功能。
 
一個指令碼只能匯出(export)變數到子程式,也就是說只能匯出到由此指令碼生成的命令或程式中。在一個命令列中執行的指令碼不能匯出一個變數影響到命令列的環境。子程式不能匯出變數到生成它的父程式中。


---
位置引數
命令列傳遞給指令碼的引數是: $0, $1, $2, $3 . . .

$0是指令碼的名字,$1是第一個引數,$2是第二個引數,$3是第三個,以此類推。[1] After $9, 在位置引數$9之後的引數必須用括號括起來,例如:${10}, ${11}, ${12}.

特殊變數$*和$@ 表示所有的位置引數。

例子:位置引數


#!/bin/bash


# 至少以10個引數執行這個指令碼,例如:
# ./scriptname 1 2 3 4 5 6 7 8 9 10
MINPARAMS=10


echo


echo "The name of this script is \"$0\"."
# 用./表示當前目錄
echo "The name of this script is \"`basename $0`\"."
# 去掉路徑名(檢視'basename'命令)


echo


if [ -n "$1" ]              # 被測試的變數被雙引號引起
then
 echo "Parameter #1 is $1"  # 使用引號來使#被轉義
fi 


if [ -n "$2" ]
then
 echo "Parameter #2 is $2"
fi 


if [ -n "$3" ]
then
 echo "Parameter #3 is $3"
fi 


# ...




if [ -n "${10}" ]  # 大於 $9的引數必須用花括號括起來.
then
 echo "Parameter #10 is ${10}"
fi 


echo "-----------------------------------"
echo "All the command-line parameters are: "$*""


if [ $# -lt "$MINPARAMS" ]
then
  echo
  echo "This script needs at least $MINPARAMS command-line arguments!"
fi  


echo


exit 0




由不同的執行名字來呼叫指令碼,一些指令碼能夠以不同的操作來執行。如果要能辦到這一點,指令碼需要檢查變數$0來確定指令碼是如何被呼叫的。也有可能存在符號連結的路徑來呼叫指令碼的情況。

相關文章