1. 程式人生 > >Shell腳本學習指南摘錄---1

Shell腳本學習指南摘錄---1

shell

1、數字與數值表達式

awk並沒有提供字符串轉數字的函數,不過awk的做法很簡單:只要加個零到字符串裏邊,例如s = “123”,接著n = 0 + s,便將數字123賦給n了。


2、打印前幾行的方式

head -n n filename

# head -n 3 passwd

head -n filename

# head -3 passwd

awk 'FNR <= n' filename

# awk 'FNR <= 3' passwd

sed -e nq filename

# sed -e 3q passwd

sed nq

# sed 3q passwd

3、限制臨時性文件只能我們可以訪問

umask 077 filename


mask: 新建文件、目錄的默認權限是由mask決定的

umask: 會影響到mask,umask表示要減掉的權限


代表rwx------,表示owner擁有任何權限,group和other沒有完全的操作權限

4、正則

# echo "jones:Adrian W. Jones/OSD211/555-0123" | sed -e 's=^\([^:]*\):[^/]*/\([^/]*\)/.*$=\1:\2='

jones:OSD211


^\([^:]*\)匹配用戶名jones

[^/]*/匹配Adrian W. Jones

\([^/]*\)匹配OSD211

.*匹配$555-0123

\1:\2匹配前面()括起來的兩組


# echo "jones:Adrian W. Jones/OSD211/555-0123" | sed -e 's=^\([^:]*\):[^/]*/[^/]*/\([^/]*\)=\1:\2='

jones:555-0123


5、變量賦值與環境

5.1、readonly和export


兩個相似的命令提供變臉的管理,一個是readonly,它可以使變量成為只讀模式;而賦值給它們是被禁止的。在Shell程序中,這是創建符號常量的一個好方法。


hour_per_day=24 賦值

readonly hour_per_day

設為只讀模式


export,readonly

用途:

export用於修改或打印環境變量,readonly則使得變量不得修改。


較為常見的是export,其用法是將變量放進環境(environment)裏。環境是一個名稱與值的簡單列表。可供所有執行中的程序使用。新的進程會從其父進程繼承環境,也可以再建立新的子進程之前修改它。export命令可以將新變量添加到環境中:

PATH=$PATH:/usr/local/bin 更新PATH

export PATH 導出它


簡單化也可以寫成這樣的:

export PATH=$PATH:/usr/local/bin


export -p 顯示當前的環境


export命令僅將變量加到環境中,如果你要從程序的環境變量中刪除變量,則要用env命令,env命令也可以臨時的改變換進變量值:

env -i PATH=$PATH HOME=$HOME LC_ALL=C awk '...' file1 file2


-i 選項是用來初始化環境變量的;也就是丟棄任何的繼承值,僅傳遞命令行上指定的變量給程序使用。


5.2、unset

unset命令從執行中的Shell中刪除變量和函數。默認情況下,它會解除變量設置,也可以加上-v來完成:

unset full_name 刪除變量full_name

unset -v first middle last 刪除其他變量


使用-f刪除函數

who_is_on () { 定義函數

who | awk '{print $1}' | sort -u 產生排序後的用戶列表

}

...

unset -f who_is_on 刪除函數


5.3、賦值為null和刪除變量

myvar=賦值並不會將myvar刪除,只不過是將其設為null字符串。相對的:unset myvar則會完全的刪除它。


5.4、參數展開

參數展開(parameter expansion)是shell提供變量值在程序中使用的過程。


在shell下,更復雜的形式可用於更特殊的情況。這些形式都是將變量名稱括號在花括號裏(${variable}),然後再增加額外的語法以告訴shell該做些什麽。當你需要在變量名稱之後馬上跟一個可能會解釋為名稱的一部分的字符時,就會用到花括號了:


reminder="Time to go to the dentist!" 將值存儲在reminder中

sleep 120 等待兩分鐘

echo _${reminder}_ 加上下劃線符號強調現實的信息


警告:

默認情況下,未定義的變量會展開為null(空的)字符串。程序隨便亂寫,就可能會導致災難發生:

rm -rf /$MYPROGRAM 如果未設置MTPROGRAM,就會導致大災難!


所以寫程序一定要很小心!


6、算數運算

i++與++i

# i=5

# echo $((i++)) $i

5 6

# echo $((++i)) $i

7 7


怎麽會出現結果不同的情況呢?都是i的值加1,但是運算符返回的值會根據它與變量的相對位置而定。後綴式(postfix)的運算符(運算符出現在變量之後),在結果產生後,將舊值返回給變量,再執行變量加1的操作。相對的,前綴式(prefix)中,運算數則是放在變量的前面,先將變量加1,再返回新值給變量,--的工作方式和++類似,只不過它的操作是將變量減1。



7、退出狀態

每一臺命令退出都會返回一個小的整數值給引用它的程序,這就是大家熟知的退出狀態(exit statu)。


7.1、退出狀態值

退出狀態為0表示“成功”,其他任何的退出狀態都為失敗。


內置變量?(以$?訪問它)包括了Shell最近一次所執行的一個程序的退出狀態。


7.2、POSIX的結束狀態

意義

0 命令成功的退出

>0 在重定向或單詞展開期間(~、變量、命令、算數展開,以及單詞切割)失敗

1-125 命令不成功的退出。特定的退出值得含義,是由各個單獨的命令定義的。

126 命令找不到了,但文件無法執行。

127 命令找不到

>128 命令因受到信號而死亡


Shell腳本學習指南摘錄---1