本文摘要
本文主要介紹
Linux Shell
程式設計的基礎知識,包含下面
8 個方面
:
Shell 程式設計概述
Shell 關鍵字
Shell 變數
Shell 運算
Shell 語句
Shell 函式
Shell 除錯
Shell 易錯點
下面一一介紹。
Shell 程式設計概述
在 Linux 下有一門指令碼語言叫做:
Shell 指令碼
,這個指令碼語言可以幫助我們簡化很多工作,例如編寫自定義命令等,所以還是很有必要學習它的基本用法的,一個簡單的
hello。sh
指令碼像下面這樣,
第一行
#!/bin/bash
標識該 Shell 指令碼由哪個 Shell 解釋
:
#!/bin/bash
echo “Hello World!”
賦予許可權才可以執行
:
# 賦予可執行許可權
chmod a+x hello。sh
# 執行
。/hello。sh
# 結果
Hello World!
Shell 的編寫流程:
1。 編寫 Shell 指令碼
2。 賦予可執行許可權
3。 執行,除錯
下面來介紹具體的語法。
Shell 關鍵字
常用的關鍵字如下:
1。 echo:列印文字到螢幕
2。 exec:執行另一個 Shell 指令碼
3。 read:讀標準輸入
4。 expr:對整數型變數進行算術運算
5。 test:用於測試變數是否相等、 是否為空、檔案型別等
6。 exit:退出
看個例子:
#!/bin/bash
echo “Hello Shell”
# 讀入變數
read VAR
echo “VAR is $VAR”
# 計算變數
expr $VAR - 5
# 測試字串
test “Hello”=“HelloWorld”
# 測試整數
test $VAR -eq 10
# 測試目錄
test -d 。/Android
# 執行其他 Shell 指令碼
exec 。/othershell。sh
# 退出
exit
執行前,你需要新建一個
othershell。sh
的檔案,讓它輸出
I‘m othershell
,並且中途需要一次輸入,我這裡輸入的是 10:
Hello Shell
10
VAR is 10
5
I’m othershell
學習任何一門語言都要了解它的變數定義方法,Shell 也不例外。
Shell 變數
Shell 變數分為 3 種:
1。 使用者自定義變數
2。 預定義變數
3。 環境變數
定義變數需要注意下面 2 點:
1。 等號前後不要有空格:
NUM=10
2。 一般變數名用大寫:
M=1
使用
$VAR
呼叫變數:
echo $VAR
1。 使用者自定義變數
這種變數
只支援字串型別
,不支援其他字元,浮點等型別,常見有這 3 個字首:
1。
unset
:刪除變數
2。
readonly
:標記只讀變數
3。
export
:指定全域性變數
一個例子:
#!/bin/bash
# 定義普通變數
CITY=SHENZHEN
# 定義全域性變數
export NAME=cdeveloper
# 定義只讀變數
readonly AGE=21
# 列印變數的值
echo $CITY
echo $NAME
echo $AGE
# 刪除 CITY 變數
unset CITY
# 不會輸出 SHENZHEN
echo $CITY
執行結果:
SHENZHEN
cdeveloper
21
2。 預定義變數
預定義變數常用來獲取命令列的輸入
,有下面這些:
$0 :指令碼檔名
$1-9 :第 1-9 個命令列引數名
$# :命令列引數個數
$@ :所有命令列引數
$* :所有命令列引數
$? :前一個命令的退出狀態,
可用於獲取函式返回值
$$ :執行的程序 ID
一個例子:
#!/bin/bash
echo “print $”
echo “\$0 = $0”
echo “\$1 = $1”
echo “\$2 = $2”
echo “\$# = $#”
echo “\$@ = $@”
echo “\$* = $*”
echo “\$$ = $$”
echo “\$? = $?”
執行
。/hello。sh 1 2 3 4 5
的結果:
print $
# 程式名
$0 = 。/hello。sh
# 第一個引數
$1 = 1
# 第二個引數
$2 = 2
# 一共有 5 個引數
$# = 5
# 打印出所有引數
$@ = 1 2 3 4 5
# 打印出所有引數
$* = 1 2 3 4 5
# 程序 ID
$$ = 9450
# 之前沒有執行其他命令或者函式
$? = 0
3。 環境變數
環境變數預設就存在,常用的有下面這幾個:
1。 HOME:使用者主目錄
2。 PATH:系統環境變數 PATH
3。 TERM:當前終端
4。 UID:當前使用者 ID
5。 PWD:當前工作目錄,絕對路徑
還是看例子:
#!/bin/bash
echo “print env”
echo $HOME
echo $PATH
echo $TERM
echo $PWD
echo $UID
執行結果:
print env
# 當前主目錄
/home/orange
# PATH 環境變數
/home/orange/anaconda2/bin:後面還有很多
# 當前終端
xterm-256color
# 當前目錄
/home/orange
# 使用者 ID
1000
Shell 變數就介紹到這裡,下面來介紹 Shell 的變數運算。
Shell 運算
我們經常需要在 Shell 指令碼中計算,掌握基本的運算方法很有必要,下面就是 4 種比較常見的運算方法,功能都是將 m + 1:
1。 m=$[ m + 1 ]
2。 m=
expr $m + 1
# 用 “ 字元包起來
3。 let m=m+1
4。 m=$(( m + 1 ))
來看一個實際的例子:
#!/bin/bash
m=1
m=$[ m + 1 ]
echo $m
m=`expr $m + 1`
echo $m
# 注意:+ 號左右不要加空格
let m=m+1
echo $m
m=$(( m + 1 ))
echo $m
執行結果:
2
3
4
5
瞭解了基本的運算方法,下面進一步來學習 Shell 的語句。
Shell 語句
Shell 語句跟高階語言有些類似,也包括分支,跳轉,迴圈,下面就帶著大家一個一個突破。
1。 if 語句
這個跟高階語言的
if - else - if
類似,只是格式有些不同而已,也來看個例子吧:
#!/bin/bash
read VAR
# 下面這兩種判斷方法都可以,使用 [] 注意左右加空格
#if test $VAR -eq 10
if [ $VART -eq 10 ]
then
echo “true”
else
echo “false”
fi
2。 case 語句
case 語句有些複雜,要注意格式:
#!/bin/bash
read NAME
# 格式有點複雜,一定要注意
case $NAME in
“Linux”)
echo “Linux”
;;
“cdeveloper”)
echo “cdeveloper”
;;
*)
echo “other”
;;
esac
執行結果:
# 輸入 Linux
Linux
Linux
# 輸入 cdeveloper
cdeveloper
cdeveloper
# 輸入其他的字串
hello
other
3。 for 迴圈
這是一個 for 迴圈基本使用例子,挺簡單的,有點類似 Python:
#!/bin/bash
# 普通 for 迴圈
for ((i = 1; i <= 3; i++))
do
echo $i
done
# VAR 依次代表每個元素
for VAR in 1 2 3
do
echo $VAR
done
執行結果:
1
2
3
4。 while 迴圈
注意與 for 迴圈的區別:
#!/bin/bash
VAR=1
# 如果 VAR 小於 10,就打印出來
while [ $VAR -lt 10 ]
do
echo $VAR
# VAR 自增 1
VAR=$[ $VAR + 1 ]
done
執行結果:
1
2
3
4
5
6
7
8
9
5。 until 迴圈
until 語句與上面的迴圈的
不同點是它的結束條件為 1
:
#!/bin/bash
i=0
# i 大於 5 時,迴圈結束
until [[ “$i” -gt 5 ]]
do
echo $i
i=$[ $i + 1 ]
done
6。 break
Shell 中的
break
用法與高階語言相同,都是
跳出迴圈
,來看個例子:
#!/bin/bash
for VAR in 1 2 3
do
# 如何 VAR 等於 2 就跳出迴圈
if [ $VAR -eq 2 ]
then
break
fi
echo $VAR
done
執行結果:
1
7。 continue
continue
用來
跳過本次迴圈
,進入下一次迴圈,再來看看上面的例子:
#!/bin/bash
for VAR in 1 2 3
do
# 如果 VAR 等於 2,就跳過,直接進入下一次 VAR = 3 的迴圈
if [ $VAR -eq 2 ]
then
continue
fi
echo $VAR
done
執行結果:
1
3
下面介紹 Shell 程式設計中比較重要的函式,好像每種程式語言的函式都很重要。
Shell 函式
函式可以用一句話解釋:
帶有輸入輸出的具有一定功能的黑盒子
,相信有過程式設計經驗的同學不會陌生。那麼,我們先來看看 Shell 中函式定義的格式。
1。 定義函式
有 2 種常見格式:
function fun_name()
{
}
fun_name()
{
}
例如:
#!/bin/bash
function hello_world()
{
echo “hello world fun”
echo $1 $2
return 1
}
hello()
{
echo “hello fun”
}
2。 呼叫函式
如何呼叫上面的 2 個函式呢?
# 1。 直接用函式名呼叫 hello 函式
hello
# 2。 使用「函式名 函式引數」來傳遞引數
hello_world 1 2
# 3。 使用「FUN=`函式名 函式引數`」 來間接呼叫
FUN=`hello_world 1 2`
echo $FUN
3。 獲取返回值
如何獲取
hello_world
函式的返回值呢?還記得
$?
嗎?
hello_world 1 2
# $? 可用於獲取前一個函式的返回值,這裡結果是 1
echo $?
4。 定義本地變數
使用
local
來在函式中定義本地變數:
fun()
{
local x=1
echo $x
}
俗話說,
程式 3 分靠寫,7 分靠調
,下面我們就來看看如何除錯 Shell 程式。
Shell 除錯
使用下面的命令來
檢查是否有語法錯誤
:
sh -n script_name。sh
使用下面的命令來
執行並除錯 Shell 指令碼
:
sh -x script_name。sh
來看個實際的例子,我們來除錯下面這個
test。sh
程式:
#!/bin/bash
for VAR in 1 2 3
do
if [ $VAR -eq 2 ]
then
continue
fi
echo $VAR
done
首先檢查有無語法錯誤:
sh -n test。sh
沒有輸出,說明沒有錯誤,開始實際除錯:
sh -x test。sh
除錯結果如下:
+ [ 1 -eq 2 ]
+ echo 1
1
+ [ 2 -eq 2 ]
+ continue
+ [ 3 -eq 2 ]
+ echo 3
3
其中
帶有
+
表示的是
Shell
偵錯程式的輸出
,
不帶
+
表示我們程式的輸出
。
Shell 易錯點
這裡我總結了一些初學 Shell 程式設計容易犯的錯誤,大多都是語法錯誤:
1。
[]
內不能巢狀
()
,可以巢狀
[]
2。
$[ val + 1 ]
是變數加 1 的常用方法
3。
[]
在測試或者計算中裡面的內容最好
都加空格
4。 單引號和雙引號差不多,單引號更加嚴格,雙引號可以巢狀單引號
5。 一定要注意語句的格式,例如縮排
總結
這裡面的內容淺顯易懂,很適合剛剛入門的新手。我覺得很不錯,希望能幫到大家。
參考連結:
技術乾貨:Linux Shell 程式設計基礎,看這一篇就夠了!