一個最簡單的腳本

一個最簡單的腳本
這篇指南將通過一些例子來幫助大家學習功能強大的shell腳本編程.
在這一節中我將學習一些簡單的腳本,它將有利於你深入學習一些知識。
一個最經典的Hello World程序
#!/bin/bash
echo Hello World

這個腳本只有二行,它的第一行這個腳本程序由那個程序來解釋.第二行只有一個簡單的動作,它的功能是在終端上打印出一行”Hello World” 。如果你測試着執行這個命令時(./hello.sh),你將會得到一個command not found的信息,這種情況大部分可能是你的第一行#!/bin/bash這個程序有問題,你一定要確保bash可以找到並且可用。(一般情況下你還要對這個腳本附一個可執行權限)
#chmod u+x hello.sh
一個非常簡單的備份腳本
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

在這個腳本中,它替換了上一個例子的將一行信息打印在終端上的功能,取爾代之的是一個備份/home目錄的tar備份命令。
關於重定向的一些信息
最基本的理論基礎
這裏有對於三個文件的重定向定義: stdin(標準輸入), stdout(標準輸出) and stderr(標準錯誤輸出) (std=standard).
基本上你可以
1. 重定向 stdout 到一個文件
2. 重定向 stderr 到一個文件
3. 重定向 stdout 到stderr
4. 重定向 stderr 到 stdout
5. 重定向 stderr 到 stdout 中並且成爲一個文件
6. 重定向 stderr and stdout to stdout
7. 重定向 stderr and stdout to stderr
在Linux中 1代表 '標準輸出', 2代表’標準錯誤’
標準輸出
這個例子將會使ls的顯示結果重定向到一個文件中.
ls -l > ls-l.txt

標準錯誤
這個例子將會使grep命令在運行過程中出現的錯誤輸出到一個文件中
grep da * 2> grep-errors.txt

管道
這一節我們將解釋一個非常簡單的並且你以後一定會用到的功能,它就是管道。
爲什麼大家都會用到管道?
管道可以使你非常方便的將一個程序的結果轉向到另外一個程序中。
一個sed的例子
這個例子使用了非常簡單的管道功能:
ls -l | sed -e "s/[aeio]/u/g"

當我們執行以下命令後:首先ls –l會先執行並且它會輸出結果信息但是如果它的後面跟是一個管道符的話,那麼它就會將結果重新定向到sed這個程序中,sed使用了替換功能,所以這個例子執行完會,會將ls –l結果中所有含有aeio的英文單詞替換成單詞u.


通過另外的方法實現ls –l *.txt
也許這種方法不同於ls –l *.txt,但是它避免了出現一條 No Such file Or Directory這種信息
ls -l | grep ".txt"
當ls –l 執行後,它會將程序結果輸出到grep這個程序中,並且去匹配.txt這條信息。


變量

你可在任何編程語言中使用變量,但是在腳本編程中它們是沒有類型的,簡稱弱類型編程語言,在這個變量中可以保含一個數字,一個字符串,一個單詞等。你並不需要聲明這個變量,它會在引用這個變量時創建它。
使用變量來實現一個簡單的Hello World
#!/bin/bash
STR="Hello World!"
echo $STR
第二行建立一個STR的變量並且爲其附了一個“Hello World”的字符串變量值。當在這個變量前面加上一個$符號時,我們就將會得到這個變量的值
例子(一個使用變量的備份腳本)
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/me/

局部變量
局部變量的生命是有限的,請看下面的例子
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO

條件語句
條件語句可以使你決定是完成一個運作或是不去完成一個動作時,通過一些判斷來實現,一般情況都是通過一些操作符來實現判斷。
條件語句可以有許多實現方法,最多的情況是基於if expression then 這種情況,也就是大家常常說的if判斷語句。它的語法基本結構如下:
if [expression];
then
code if 'expression' is true.
fi
一個最基本的使用if ...then的例子
#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
fi

這段代碼執行if判斷,如果foo等於foo的話,那麼你就會執行then語句下的輸出語句,最後通過fi來結束,這裏我要強調一點,就是很多新手在輸入源碼時特別是在if 語句後面沒有空格,在大括號後面沒有空格,在等號兩邊沒有空格,這些都會製造出一些麻煩的。
一個簡單的控制if .. then ...else
#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi

6.4 通過變量進行判斷控制
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi

7. 循環結構
在這一節中,你將會學習for、while、until loops循環
對於for 循環它有一點不同於其他的編程語言,它有一點像VB中的for each語句,就是所謂的遞歸的循環。
對於while循環,它其實是一個加強的if語句,如果它的條件爲真,那麼它就一直執行while循環中的語句中的內容。
7.1 For sample
#!/bin/bash
for i in $( ls ); do
echo item: $i
done

在第二行上,我們聲明瞭一個i的變量,它將一直將ls命令的結果全部循環出來。其中do 和done之間是所要執行的代碼。
While循環例子
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
這裏面大家可能看到一個-lt的命令選項,這裏它代表小於等於
-eq 等於
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於
Until的例子
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done

函數
對於大多數編程語言,你都可以調用函數來執行一段代碼,這樣可以使用減少重複的書寫代碼。
函數的例子
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello 《==這個就是調用了
quit
echo foo

在2-4行包含了一個quit函數,在5-7行包含了 hello函數,如果你不是很確定這個腳本是是什麼意思,那麼我建議試試它。Notice that a functions don't need to be declared in any specific order.
當你運行這個腳本時你的程序將會最先調用hello函數,以後再調用quit函數最後才執行echo 輸出命令。
在函數中使用參數
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo


這個腳本幾乎和前一個腳本沒有什麼不能,但最主要的不同是e這個函數可以使用參數了。
用戶接口
使用select命令製作簡單的菜單
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done

如果你運行這個腳本你將會看到一個非常簡單的菜單
使用read讀入用戶輸入
在多數情況下你可能會用到提示請進行輸入這種狀態並且有幾種方法可以用。這是其中的一種方法:
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"

對於變量來說,你可以通過多個值來讀入。
#!/bin/bash
echo Please, enter your firstname and lastname
read FN LN
echo "Hi! $LN, $FN !"

算術操作
使用以下的命令:
echo 1 + 1
如果你希望看到2,那麼你會很失望,那麼我們應該如何進行操作哪? echo $((1+1))
我們可以使用以下方法:
echo $[1+1]

算術操作
+
-
*
/
% (remainder)
關係操作
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)


發佈了21 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章