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=8echo $abc 輸出啥?為什麼?
a=8echo $bc 輸出啥?為什麼?
例子2:
a=8echo 「$a」 輸出啥?為什麼?
a=8echo 『$a』 輸出啥?為什麼?
「$a」會被解析為變數,輸出8,『$a』輸出$a;
預設變數:
$# :傳入指令碼的命令列引數個數
$* :所有命令列引數值,在各個引數值之間留有空格
$0 :命令本身(shell檔名)
$1 :第乙個命令列引數
$2 :第二個命令列引數
區域性變數:
在變數首次被賦值時加上 local 關鍵字
1.變數賦值時,「=」左右兩邊都不能有空格
2.bash 中的語句結尾不需要分號
if語句
if [expression ]
then
#code block
fiif [expression ]
then
#code block
else
#code block
fiif [ expression ]
then
#code block
elif [ expression ]
then
#code block
else
#code block
fiif [ 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
doecho $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 指令碼學習
case var in pattern statement esac case 的指令碼語法是雙分號結尾的。sed e s i.86 i386 查詢替換。sed 流編輯器 將輸入流中的i.86替換成i386。是個萬用字元。輸入流的形式可能是 管道,檔案。shell d mkdir p 指令碼的條件執...
shell指令碼學習
shell 學習 1.shell 解釋型語言,有很多種直譯器。預設是 bin bash。shell指令碼第一行要寫 bin bash 2.shell指令碼執行的方法 1 sh sh 2 chmod a x sh sh 注意,一定要寫成.sh,而不是 sh。執行其它二進位制的程式也一樣,直接寫 sh,...
shell指令碼學習
反引號 反引號是命令替換,命令替換是指shell可以先執行中的命令,將輸出結果暫時儲存,在適當的地方輸出。語法 command 反引號是tab鍵的上乙個按鍵 重定向 如果檔案不存在,將建立新的檔案,並將資料送至此檔案 如果檔案存在,則將資料新增在檔案後面 如果檔案不存在,同上,如果檔案存在,先將檔案...