標籤:linux redhat server 6.2 shell 指令碼 bash
shell指令碼學習
shell就是命令解析器,將使用者輸入的指令轉換為相應的機器能夠啟動並執行程式。
Shell是一個作為使用者與linux系統間介面的程式,它允許使用者向作業系統輸入需要執行的命令,在linux中可有多種shell。
一:Shell的種類:
ash:是貝爾實驗室開發的shell,bsh是對ash的符號連結。
bash:是GNU的Bourne Again shell,是GNU作業系統上預設的shell。sh以及bash2都是對它的符號連結。
tcsh:是Berkeley UNIX C shell。csh是對它的符號連結
二:shell命令
shell命令的基本格式是:
命令名 [選項] <參數1> <參數2> ……
shell提示符 :# $
GNU工具中的bash,作為/bin/sh被預設安裝
大多數linux發行版中,shell程式/bin/sh實際上是對程式/bin/bash的一個連結
命令/bin/sh -version可用於查看bash的版本。
三:shell指令碼
Shell指令碼是一個包含一系列命令序列的文字檔。當運行這個指令檔時,檔案中包含的命令序列將得到執行。
Shell指令碼的第一行必須是如下格式:
#!/bin/sh
符號#!用來指定該指令檔的解析程式。在上面 例子中使用/bin/sh來解析該指令碼。當編輯好指令碼後,如果要執行該指令碼,還必須使其具有可執行屬性:chmod +x filename。
在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。如果使用了注釋,即使相當長的時間內沒有使用該指令碼,也能在很短的時間內明白該指令碼的作用及工作原理。
Shell指令碼的執行:sh hello.sh(假設有一個hello.sh的指令碼)。
變數:在shell編程中,所有的變數都由字串組成,並且不需要預先對變數進行聲明,
#!/bin/sh
#set variable a
a=8
#print a
echo "a is:"
echo $a
注意思考:
例子1:
A=8
echo $ABC 輸出啥?為什嗎?
A=8
echo ${A}BC 輸出啥?為什嗎?
例子2:
A=8
echo “$A” 輸出啥?為什嗎?
A=8
echo ‘$A’ 輸出啥?為什嗎?
“$A”會被解析為變數,輸出8,‘$A’輸出$A;
預設變數:
$# :傳入指令碼的命令列參數個數
$* :所有命令列參數值,在各個參數值之間留有空格
$0 :命令本身(shell檔案名稱)
$1 :第一個命令列參數
$2 :第二個命令列參數
局部變數:
在變數首次被賦值時加上 local 關鍵字
1.變數賦值時,“=”左右兩邊都不能有空格
2.BASH 中的語句結尾不需要分號
IF語句
if [expression ]
then
#code block
fi
if [expression ]
then
#code block
else
#code block
fi
if [ expression ]
then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
if [ expression ]; then
#code block
elif [ expression]; then
#code block
else
#code block
fi
比較:
比較操作整數操作 字串操作
相同-eq=
不同-ne !=
大於-gt>
小於-lt<
大於或等於 -ge
小於或等於 -le
為空白-z
不為空白-n
比較整數a和b是否相等:if [ $a = $b ] (也可用eq)
判斷整數a是否大於整數b:if [ $a -gt $b ]
比較字串a和b是否相等:if [ $a = $b ]
判斷字串a是否為空白: if [ -z $a ]
判斷整數變數a是否大於b:if [ $a -gt $b ]
1. 在“[”和“]”符號的左右都留有空格
2. “=”左右都有空格
-e檔案已經存在
-f檔案是普通檔案
-s檔案大小不為零
-d檔案是一個目錄
-r檔案對目前使用者可以讀取
-w檔案對目前使用者可以寫入
-x檔案對目前使用者可以執行
例S5:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo “can read $folder"
[ -f "$folder" ] || echo "this is not file"
FOR迴圈
for 迴圈結構與 C 語言中有所不同,在 BASH 中for迴圈的基本結構是:
for var in [list]
do
#code block
done
其 中 $var 是迴圈控制變數,[list] 是 var 需要遍曆的一 個集合,do/done 對包含了迴圈體,相當於C語言中的一對大括弧。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 “;”。如:
for $var in [list]; do...done
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
如果列表被包含在一對雙引號中,則被認為是一個元素,如:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat "
do echo $day done
上面的例子中,在 for所在那行,變數 day 是沒有加 "$"符號的,而在迴圈體內,echo 所在行變數$day是必須加上"$"符號的。
WHILE迴圈
while 迴圈的基本結構是:
while [ condition ]
do
#code block
Done
UNTILL迴圈
until 迴圈的基本結構是:
until [ condition ]
do
#code block
done
while 和 until的區別在於while是為真時執行,until是為假時執行
CASE語句
BASH 中的 case 結構與 C 語言中的 switch 語句的功能比較類似,可以用於進行多項分支控制。
case "$var" in
condition1 )
;;
condition2 )
;;
* )
default statments;;
esac
例子:
#!/bin/bash
echo "Hit a key, then hit return.“
read Keypress
case "$Keypress" in
[[:upper:]] )echo" Uppercase letter";;
[[:lower:]] )echo" Lowercase letter";;
[0-9] )echo"Digit";;
* ) echo "Punctuation, whitespace, or other";;
Esac
Bash shell的功能
1.命令記憶能力
2.使用Tab鍵進行命令與檔案的補全功能
3.設定命令的別名(eg:alias lm=’ls -l’)
4.作業控制、前台、後台控制
5.程式指令碼(shell script)
6.支援萬用字元
Shell指令碼學習