返回首頁
當前位置: 主頁 > 操作系統 > Linux教程 >

Linux Shell 手記

時間:2018-08-26 01:15來源:電腦教程學習網 www.aedwey.tw 編輯:admin

下面的例子展示了如何向腳本傳遞參數、腳本如何獲取參數、if else判斷、變量的使用等基本內容。
#!/bin/bash

# 如果參數個數大于1
if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh [args...]"
exit
fi

# 獲取傳遞的參數并賦值給arg
arg=$1

if [[ $arg -gt 10 ]]; then
echo "$arg > 10"
else
echo "$arg < 10"
fi

 

 

 


這個腳本的調用方式如下:
bash +x example01.sh 5

 

 

 


下面的例子展示了數組、函數、循環等基本使用。
#!/bin/bash

if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh [args...]"
exit
fi

# 當前命令行所有參數。置于雙引號中,表示個別參數
[email protected]

for arg in $args; do
echo $arg
done

function fun() {
echo $1
}

fun "hello shell"

fun2() {
echo "Linux"
}

fun2

 

 

 


注意,函數fun中的$1,獲取的是函數參數,不是腳本調用時傳入的參數。[email protected] 是獲取腳本調用時傳入的參數列表。

while 循環以及其他幾種循環、case、表達式expr的使用
#!/bin/bash

if [[ $# -lt 1 ]]; then
echo "args count must > 1"
echo "Uage: bash +x example01.sh [args...]"
exit
fi

case $1 in
"install" )
echo "operation type is install"
;;
"uninstall" )
echo "operation type is uninstall"
;;
* )
echo "operation type is not support"
;;
esac

for ((i=0;i<3;i++))
do
if ((i==1))
then
continue
fi
echo $i
done

for i in `seq 5`
do
echo "loop $i"
done

 

 

 


注意這里的case * 并不是所有,而是輸入值不在case中,相當于default. 在循環中可以使用continue/break等關鍵字,非常類似java等其他語言的循環。


腳本之間互相引用

通過source 或者 . 的方式可以引用另一個腳本中的函數或者變量
# first.sh
function fun(){
echo "i am from first."
}

file=first

# second.sh
. first.sh # source first.sh
fun

echo $file

 

 

 

•使用bash +x second.sh執行,在second.sh 中可以調用fun函數和使用file變量。
•這里的.和source都可以實現引用first文件中的變量。注意: 如果同時引用了多個腳本的同一個變量名的變量,后面的值會覆蓋前面的變量而不會報錯。

關于錯誤處理
1.在shell中有一個變量 $? ,這個變量記錄的是上次腳本執行的結果,如果正常結束則是0,否則是非0值;
2.如果在shell腳本中通過set -o errexit來實現遇到錯誤就退出,這樣能夠避免產生更多的錯誤;
3.在shell執行過程中如果出錯,可以通過重定向的方式,輸出到文件中,比如Command >> filename2>&1

shell中的字典是非常好的數據結構,能夠很方便地處理配置
#!/bin/bash

set -o errexit

hput(){
eval "hkey_$1"="$2"
}

hget(){
eval echo '${'"hkey_$1"'}'
}

hput k1 v1
hget k1

declare -A dic

dic=([key1]="value1" [key2]="value2" [key3]="value3")

echo ${dic["key1"]}

# output all key
echo ${!dic[*]}

#outpull all value
echo ${dic[*]}

# access all
for key in $(echo ${!dic[*]})
do
echo "$key : ${dic[$key]}"
done

 

 

 


執行之后,輸出如下:
v1
value1
key3 key2 key1
value3 value2 value1
key3 : value3
key2 : value2
key1 : value1


文本處理

sed 命令能夠對對文本進行操作。

比如有一個文件sedfile,內容如下:
1
2
3
4
5

執行 "sed '1,3d' sedfile,則會輸出4,5 兩行,即對1,2,3行做了刪除處理,注意這時文件里面并沒有刪掉這兩行。

除了刪除之外,還可以做替換操作。
[email protected]:~/codelab# sed 's/1/0/g' sedfile
0
2
3
4
5
[email protected]:~/codelab# cat sedfile
1
2
3
4
5

 

 

 


我們發現,在輸出時,將1替換成了0;

文本處理還有一個非常強大的工具-awk

我們首先看看awk的基本處理-按照逗號(,)分割獲取想要的文本;
[email protected]:~/codelab# cat awkfile
this,is,a,awk,file
this,is,a,awk,file
[email protected]:~/codelab# cat awkfile | awk -F ',' '{print $0}'
this,is,a,awk,file
this,is,a,awk,file
[email protected]:~/codelab# cat awkfile | awk -F ',' '{print $1}'
this
this
[email protected]:~/codelab#

 

 

 


這里我們可以看到awk可以按照任意形式分割文本,然后輸出;

特殊變量和值

下列變量通常具有固定意義
$# 表示變量的個數,常用于循環
[email protected] 當前命令行所有參數。置于雙引號中,表示個別參數
$* 當前命令行所有參數。置于雙引號中,表示將命令行所有參數當初一個單獨參數
$-(連字號) 在引用數給予Shell的選項
$? 表示上一個命令退出的狀態
$$ 表示當前進程編號
$0 表示當前程序名稱
$! 表示最近一個后臺命令的進程編號
$HOME 表示當前用戶根目錄
$IFS 表示內部的字段分隔符
$LANG 當前locale默認名稱
$PATH 環境變量
$PPID 父進程編號
$PWD 當前工作目錄

下列特殊值可以幫助排查問題
0 成功退出
>0 退出失敗
1-125 命令退出失敗,失敗返回的相關值由程序定義(譬如,程序內退出只執行 exit 2,則返回為2)
126 命令找到了,但無法執行
127 命令找不到
>128 命令因受到信號而死亡

------分隔線----------------------------
標簽(Tag):Linux Shell 手記
------分隔線----------------------------
推薦內容
猜你感興趣
26选5中奖通告