Bash Shell結構
Korn和Bash shells非常相似,但是還是有一些不同之處。Bash的結構如下所示。
Bash Shell語法結構
Shbang行
|
"shbang" 是腳本起始行,告訴kernel那個shell解析. #!位于行頭。例如#!/bin/bash
|
注釋
|
行注釋用#符號.例如:# This is a comment
|
通配符
|
例如*, ?, 和 [ ] 用于文件名擴展。<, >, 2>, >>, 和 | 符號用于IO和重定向和管道。為了保證這些符號不被解析,這個字符要被引起來。 例如:
rm *; ls ??; cat file[1-3];
echo "How are you?"
|
輸出顯示
|
使用echo命令。使用`或者一對“”通配符。例如:
echo "How are you?"
|
局部變量
|
局部變量作用于當前shell,shell結束時局部變量失效.例如
variable_name=value
declare variable_name=value
name="John Doe"
x=5
|
全局變量
|
全局變量也稱為環境變量. 例如:內建的帶-x選項的聲明函數也可以設置為環境變量。可以用export使用。例如:
export VARIABLE_NAME=value
declare -x VARIABLE_NAME=value
export PATH=/bin:/usr/bin:.
|
從變量中提取值
|
使用$.例如:
echo $variable_name
echo $name
echo $PATH
|
讀取用戶輸入
|
使用read讀入一行。例如:
EXAMPLE
echo "What is your name?"
read name
read name1 name2 ...
|
參數
|
可以從命令行傳入參數。位置參數用于從腳本中接收值。例如:
At the command line:
$ scriptname arg1 arg2 arg3 ...
在腳本中:
|
echo $1 $2 $3
|
位置參數
|
echo $*
|
所有位置參數
|
echo $#
|
位置參數號
|
數組
|
Bourne shell使用位置參數創建單詞列表。除了位置參數外, Bash shell支持數組語法,起始索引是0。 Bash shell數組使用declare -a 命令創建。例如:
set apples pears peaches (positional parameters)
echo $1 $2 $3
declare -a array_name=(word1 word2 word3 ...)
declare -a fruit=( apples pears plums )
echo ${fruit[0]}
|
算術
|
像C/TC shells和Bourne shell, UNIX/Linux 命令的輸出可以指定到一個變量。Bash shell提供新的語法. 使用前端加$,例如:
variable_name=`command`
variable_name=$( command )
echo $variable_name
echo "Today is `date`"
echo "Today is $(date)"
|
算術
|
Bash shells支持整數算術。declare -i 命名用于聲明一個整型變量。Korn shell的typeset命令也可以用于向后兼容。
|
例如
|
declare -i variable_name
|
used for bash
|
typeset -i variable_name
|
can be used to be compatible with ksh
|
(( n=5 + 5 ))
echo $n
|
操作符
|
Bash shell 使用內建命令,類似于C語言。
|
例如
|
相等性:
|
邏輯性:
|
==
|
equal to
|
&&
|
and
|
!=
|
not equal to
|
||
|
or
|
|
|
!
|
not
|
關系型:
|
>
|
greater than
|
>=
|
greater than, equal to
|
<
|
less than
|
<=
|
less than, equal to
|
條件語句
|
If類似于C語言。if 用endif結束。 [[ ]] 用于模式匹配條件表達式。 [ ] 用于向后兼容Bourne shell。例如:
|
The if construct is:
if command
then
block of statements
fi
if [[ expression ]]
then
block of statements
fi
if (( numeric expression ))
then
block of statements
else
block of statements
fi
The if/else construct is:
if command
then
block of statements
else
block of statements
fi
if [[ expression ]]
then
block of statements
else
block of statements
fi
if (( numeric expression ))
then
block of statements
else
block of statements
fi
The case construct is:
case variable_name in
pattern1)
statements
;;
pattern2)
statements
;;
pattern3)
;;
esac
case "$color" in
blue)
echo $color is blue
;;
green)
echo $color is green
;;
red|orange)
echo $color is red or orange
;;
*) echo "Not a matach"
;;
esac
|
The if/else/else if construct is:
if command
then
block of statements
elif command
then
block of statements
else if command
then
block of statements
else
block of statements
fi
-------------------------
if [[ expression ]]
then
block of statements
elif [[ expression ]]
then
block of statements
else if [[ expression ]]
then
block of statements
else
block of statements
fi
--------------------------
if (( numeric expression ))
then
block of statements
elif (( numeric expression ))
then
block of statements
else if ((numeric expression))
then
block of statements
else
block of statements
fi
|
循環
|
四種循環while, until, for, 和select.
while循環后跟隨[],do關鍵字,代碼段,結束于done關鍵字。[[ ]]是新的測試操作符,老的[ ]仍舊向后兼容Bourne shell.
until循環類似于while循環。
for循環用于遍歷一個字列表。For循環后跟隨變量名,in關鍵字,字列表,代碼塊,結束于done關鍵字。
select循環用于提示菜單選擇。
循環控制命令是break和continue。
|
例如
while command until
command
do do
block of statements
block of statements
done done
-------------------------
---------------------------
while [[ string expression ]] until
[[ string expression ]]
do do
block of statements block
of statements
done done
------------------------- ----------------------------
while (( numeric expression )) until
(( numeric expression ))
do do
block of statements
block of statements
done done
for variable in word_list
select variable in word_list
do do
block of statements block
of statements
done done
--------------------------
----------------------------
for color in red green b
PS3="Select an item from the menu"
do do
item in blue red green
echo $color echo
$item
done done
|
|
Shows menu:
- blue
- red
- green
|
函數
|
函數有兩種格式.一種格式來自于Bourne shell, Bash版本使用function關鍵字:例如
function_name() {
block of code
}
function function_name {
block of code
}
------------------------
function lister {
echo Your present working directory is `pwd`
echo Your files are:
ls
}
|
|
|
|
|
|
|
Bash Shell腳本例子:
1 #!/bin/bash
# GNU bash versions 2.x
2 # The Party Program––Invitations to friends from the "guest" file
3 guestfile=~/shell/guests
4 if [[ ! –e "$guestfile" ]]
then
5 printf "${guestfile##*/} non–existent"
exit 1
fi
6 export PLACE="Sarotini's"
7 (( Time=$(date +%H) + 1 ))
8 declare -a foods=(cheese crackers shrimp drinks `"hot dogs"` sandwiches)
9 declare -i n=0
10 for person in $(cat $guestfile)
do
11 if [[ $person == root ]]
then
continue
else
# Start of here document
12 mail –v –s "Party" $person <<- FINIS
Hi $person! Please join me at $PLACE for a party!
Meet me at $Time o'clock.
I'll bring the ice cream. Would you please bring
${foods[$n] and anything else you would like to eat?
Let me know if you can make it.
Hope to see you soon.
Your pal,
ellie@$(hostname)
FINIS
13 n=n+1
14 if (( ${#foods[*]} == $n ))
then
15 declare -a foods=(cheese crackers shrimp drinks `"hot dogs"`
sandwiches)
16 n=0
fi
fi
17 done
printf "Bye..."
解釋
- 讓kernel知道在運行Bash shell腳本.
- 注釋行
- 變量guestfile被設置為文件的全路徑名,叫做guests.
- 行讀入
- 內建函數printf顯示文件名
- 全局環境變量
- 數字表達式
- Bash數組foods定義
- 整數n定于初始值為0
- For循環
- If語句
- 發送mail消息
- 整數n加1
- If語句
- 數組foods重新分配值
- 變量n重新設置回0
- 循環結束
posted on 2008-07-08 09:38
一葉笑天 閱讀(350)
評論(0) 編輯 收藏 所屬分類:
Shell技術