1.
環(huán)境變量,相當(dāng)于全局變量。
定義變量;打印變量; 將自定義變量轉(zhuǎn)成環(huán)境變量;顯示所有環(huán)境變量;取消某個or多個環(huán)境變量or 本地變量;一個命令把自定義變量轉(zhuǎn)成環(huán)境變量;顯式所有本地變量;本地變量設(shè)成只讀,即不可寫; env 結(jié)合grep的管道命令用來顯示希望查看的某個環(huán)境變量。
$ name=“kiki”
$ echo $(name) or $
echo ${age} or $echo $name
$ export name
$ env
$ unset name age
$ export name="kiki"
$ set
$ readonly
age="83"
$ env | grep HOME
2.
環(huán)境變量配置文件,包含/etc/profile和~/.bashrc文件。
1)/etc/profile:在登錄時,操作系統(tǒng)定制用戶環(huán)境時使用的第一個文件,此文件為系統(tǒng)的每個用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時,該文件被執(zhí)行。
2)~/.bashrc:該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r以及每次打開新的shell時,該該文件被讀取。
3)最常用的環(huán)境變量PATH,
比如:修改環(huán)境變量,把交叉編譯器的路徑加入到PATH。在linux系統(tǒng)下,如果你下載并安裝了應(yīng)用程序,很有可能在鍵入它的名稱的時候出現(xiàn)“command
not found”的提示內(nèi)容。如果每次都到安裝目標(biāo)文件夾內(nèi)找到可執(zhí)行文件來進行操作就太繁瑣了,這就涉及到環(huán)境變量PATH的設(shè)置問題,而PATH的設(shè)置也是LINUX下定制環(huán)境變量的一個組成部分。
$ echo $PATH
/opt/fp_le/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/wangzhonghua/bin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
3.
/etc/profile文件的shell思想
1)
特殊變量:$0 腳本名;$n 給腳本傳遞的參數(shù);$? 命令的執(zhí)行結(jié)果;
2)
比較控制符:真假[-eq
] : –eq,-neq,
-ge,-gt,-le,-lt; 可以比較某個變量和某個值[ != ][ = ];也可以比較是否是目錄,還可以比較文件:空串[ -z ],and[ -a ],執(zhí)行[ -x ]某個文件可執(zhí)行-x, 是否link [ -l ];是否只讀[ -r ];(1. w是否是空串,w是否可執(zhí)行。2.)-f 表示正規(guī)文件,-w表示可寫。
3)
當(dāng)前用戶的識別號:id –ru (real user);當(dāng)前用戶的姓名 id –un; 當(dāng)前用戶的名字:hostname;當(dāng)前用戶是誰及何時登陸的:who am i
If條件表達式與
[ ]&& 有相同的功能,但是&&只能達到一半的條件。
If [ ]; then
else
fi
4)
shell的函數(shù): 函數(shù)名(){},不需要提供參數(shù),在執(zhí)行函數(shù)的時候提供參數(shù)即可。
5)
管道| 與重定向 有追加和覆蓋兩種
>,>> :把一個命令的輸出作為另一個命令的輸入。重定向有標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出兩種。
wiki@wiki-desktop:/home/xufuli/backup/svnsync$
ll >kiki
-bash: ll:找不到命令
$ ll >kiki 2>&1
6)
轉(zhuǎn)義序列: \n換行;\t調(diào)一個tab鍵。(),[]需要轉(zhuǎn)義的。
~$ last | awk '{print $1
"\n" $3}'
7)定制shell環(huán)境
$ shopt -s cdspell;,自動糾正cd 拼寫錯誤。
Checkwinsize; bash在每個命令后檢查窗口大小,如果有必要,就更新LINES和COLUMNS的值;
Histappend;當(dāng)shell退出時,歷史清單將添加到以HISTFILE變量的值命名的文件中,而不是覆蓋文件
8)eval 替換命令:然而當(dāng)在它前面放上eval時,其結(jié)果是shell在執(zhí)行命令行之前掃描它兩次。
9)
alias :命令別名,
$
alias ll='ls -al'
8)linux特殊文件:/dev/null, linux下還有一個特殊的文件/dev/null,它就像一個無底洞,所有重定向到它的信息都會消失得無影無蹤。這一點非常有用,當(dāng)我們不需要回顯程序的
所有信息時,就可以將輸出重定向到/dev/null。用來使終端不顯示任何信息。
9)case 條件語句的用法 以及腳本執(zhí)行的追蹤 –n檢查語法問題;-v先show出腳本再執(zhí)行;-x 跟蹤執(zhí)行每一步:
#!/bin/bash
2
3 case
$
4 "spring") echo "in
spring";;
5 "summer") echo "in
summer";;
6 "winter") echo "in
winter";;
7 esac
7)
awk編程的了解,awk是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進行處理。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數(shù)和動態(tài)正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在
這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標(biāo)準(zhǔn)輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。awk分別 代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。
$ awk '{print $2;}' testfile 表示打印每一行的第二列,自動變量$1
、$2
分別表示第 一列、第二列等,類似于Shell腳本的位置參數(shù),而$0
表示整個當(dāng)前行。
4.
變量整數(shù)聲明
$ declare -i sum=100+50
$ echo $sum
5.
過濾器
1)
管道過濾器:管道負(fù)責(zé)數(shù)據(jù)的傳遞,它把原始數(shù)據(jù)傳遞給第一個過濾器,把一個過濾器的輸出傳遞給下一
個過濾器,作為下一個過濾器的輸入,重復(fù)這個過程直到處理結(jié)束。要注意的是,管道只是對數(shù)據(jù)傳輸?shù)某橄螅赡苁枪艿溃部赡苁瞧渌ㄐ欧绞剑踔潦裁炊?沒有(所有過濾器都在原始數(shù)據(jù)基礎(chǔ)上進行處理)。編譯器就是基于管道過濾器模式設(shè)計的:
輸入:源程序
預(yù)處理:負(fù)責(zé)宏展開和去掉注釋等工作。
編譯:進行詞法分析、語法分析、語義分析、代碼優(yōu)化和代碼產(chǎn)生。
匯編:負(fù)責(zé)把匯編代碼轉(zhuǎn)換成機器指令,生成目標(biāo)文件。
鏈接:負(fù)責(zé)把多個目標(biāo)文件、靜態(tài)庫和共享庫鏈接成可執(zhí)行文件/共享庫。
輸出:可執(zhí)行文件/共享庫。
2)
復(fù)合過濾器
過濾器可以由多個其它過濾器組合起來的,比如上面的“編譯”過程可以認(rèn)為是一個復(fù)合過 濾器,
輸入:預(yù)處理之后的源代碼。
詞法分析:負(fù)責(zé)將源程序分解成一個一個的token,這些token是組成源程序的基本單元。
語法分析:把詞法分析得到的token解析成語法樹。
語義分析:對語法樹進行類型檢查等語義分析。
代碼優(yōu)化:對語法樹進行重組和修改,以優(yōu)化代碼的速度和大小。
代碼產(chǎn)生:根據(jù)語法樹產(chǎn)生匯編代碼。
輸出:匯編代碼。
3)grep stack /proc/2976/maps | sed -e “s/-/ /” | awk
‘{print strtonum(“0x”$2)-strtonum(“0x”$1)}’
grep是過濾器:它從文件/proc/2976/maps里找到下面這行數(shù)據(jù)。
sed是過濾器:sed 是一種在線編輯器,它一次處理一行內(nèi)容。處理時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒有
改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復(fù)操作;編寫轉(zhuǎn)換程序等。它把‘-’替換成‘ ’,數(shù)據(jù)變成下面的內(nèi)容。
sed -e '62,66d' $DestPrjDir/hooks/pre-revprop-change
> $DestPrjDir/hooks/temp.c 刪除文件中某些行
cp $DestPrjDir/hooks/temp.c $DestPrjDir/hooks/pre-revprop-change
$ sed '2,$d' example 刪除example文件的第二行到末尾所有行
$ sed 's/test/mytest/g'
example 文件中所有都替換在整行范圍內(nèi)把test替換為mytest。如果沒有g標(biāo)記,則只有每行第一個匹配的test被替換成mytest。
$ sed -e '1,5d' -e
's/test/check/' example (-e)選項允許在同一行里執(zhí)行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執(zhí) 行順序?qū)Y(jié)果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結(jié)果。
@sed -i 's/\[SVN_VER\]/$(SVN_REVISION)/g' $(ONU_INSTALL)/version 在指定文件中當(dāng)前行前插入一行,此行的內(nèi)容用某某替換某某。
awk是過濾器:它計算0xbfe73000和0x bfe5e000差值,并打印出來。
6.
數(shù)組,set顯示的所有變量中是這樣的,season=([1]="spring"
[2]="summer") ;打印數(shù)組變量值
$ season[1]=spring
$ season[2]=summer
$ echo ${season[1]}
7.
history 歷史命令,顯示最近100條命令;清除所有歷史命令;
$ history 100
$ history –c
8.
打印輸出。轉(zhuǎn)義字符使能輸出-e,推薦用雙引號保持變量特性;
$ echo -e " kiki \n mina"
9.
打包(音譯) tar文件 tarball。
@tar -jcvf $(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.tar.bz2
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.upf
j參數(shù)代表是以.tar.bz2作為擴展名
@tar -cf $(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.tar
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.upf Lib/images/App4315.tkf
Lib/images/Pers4315.tkf 不用j,z,參數(shù)的代表是以.tar作為擴展名
10. shell 查找技巧:find 與xargs(參數(shù)替換) 用來刪除所有某種特點的文件。
$ find -name
"xufuli" | xargs rm –rf 通過管道將find的結(jié)果作為輸入,通過xargs作為rm命令的參數(shù)
11. 更改權(quán)限;
$chmod a+x kiki.sh
12. Makefile中sed的使用
@sed -i
's/\[SVN_VER\]/$(SVN_REVISION)/g'
$(ONU_INSTALL)/version 在指定文件中當(dāng)前行前插入一行,此行的內(nèi)容用某某替換某某。
13. 文件測試功能file:
$ file nullLog.sh用來測試文件是否是可執(zhí)行文件。可執(zhí)行文件是指二進制文件。
14.
15. Makefile中一些極好的shell命令
$ sudo rm -rf country/ 刪除父子所有文件夾目錄
$ sudo cp -rf xufuli/ kiki/ 完整拷貝目錄結(jié)構(gòu)到另一個文件夾
$ find -name
"xufuli" | xargs rm –rf 在當(dāng)前目錄查找名為xufuli的目錄和文件,通過管道將find的結(jié)果作為輸入,通過xargs作為rm命令的參數(shù)
$chmod a+x kiki.sh 更改權(quán)限
$chmod 755
$(ROOTFS_PATH)/home/www/html_asb/cgi-bin/*
@sed -i
's/\[SVN_VER\]/$(SVN_REVISION)/g'
$(ONU_INSTALL)/version 在指定文件中當(dāng)前行前插入一行,此行的內(nèi)容用某某替換某某。