@set的嚴謹使用@
set -eux
-e 如果命令帶非零值返回,立即退出
-u 當執行參數括展時,把非設定變數作為錯誤處理(如果擴充企圖 出現在非設定變數中,shell顯示錯誤資訊.如果不是互動式,則帶非零值退出)
-x 在每個簡單命令被擴充之後,顯示PS4擴充值,之後是要執行的命令
@set -e可能引起的錯誤@
並不是所有命令的傳回值,非0就是表示失敗的
diff:0表示兩個檔案相同;1表示兩個檔案不同;2表示異常,例如兩個對比項目裡面有一個是目錄不是檔案
grep:0表示有匹配返回;1表示無匹配返回;2表示異常,例如grep目標是檔案夾,卻沒有添加遍曆等等
容易引發的問題
set -e 不是萬能的,如果不繞開diff、grep等等這類傳回值2為異常的情況,流程會在一些莫名其妙的情況下被終止
過於定式的習慣會引起不必要的麻煩
if [ $? -eq 0 ]; then
set -e 中如何解決
將這個特殊命令,用 set +e 和 set -e 包起來,即暫時關閉e選項
將這個特殊命令,用( )包起來
set -e 只對當前線程有效,對子線程失效
( ) 會將裡面的流程建立一個子線程,一般系統預設是不開啟e選項的
@unset的用法@
uninitialized_variable=23 # 賦值
unset uninitialized_variable #Unset it.
echo "uninitialized_variable= $uninitialized_variable"
@MKDIR- p @
可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在, 加上此選項後, 系統將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄。比如:假設目前的目錄中存在test,則mkdir test/test2/test3報錯,因為test2不存在,無法建立test3。而mkdir -p test/test2/test3就可以。
@帶檔案夾外殼複製所有檔案VS不帶檔案夾外殼複製所有檔案
若cp ./abc/*.* test_duplicate/ 則,test duplicate下面將有所有的檔案。
若cp ./abc/ test_duplicate/ 則,test duplicate下面將有abc/檔案夾及其所有的檔案。
若cp ./abc test_duplicate/ 則,test duplicate下面將有abc/檔案夾及其所有的檔案。
@CAT的功能
1.一次顯示整個檔案。$ cat filename
2.從鍵盤建立一個檔案。$ cat > filename
3.清空一個已有的檔案。$cat /dev/null > RedirectFile.txt
4.合并幾個檔案成一個檔案並輸出。輸入檔案按照排列順序被列印,如果要調換資訊的順序,就必須調換輸入檔案的順序。cat file1 file2 file3 >fileall
5.當需要處理的檔案數目過大而無法手工輸入檔案名稱時,可以使用萬用字元,如
cat chapter* > book將檔案夾下所有chapter開頭的檔案合并到book檔案中。
在使用萬用字元時,檔案名稱將會按照升序排列。
6. cat -s file合并多行空白行為一個單獨的空白行
cat -s file | sed '/^[[:space:]]*$/d'清除所有空白行
7. cat -b file對非空白行進行編號
8.cat -n file對所有行進行編號
@echo的格式
預設echo出argument之後還會echo一個分行符號號。-n選項可以取消分行符號號。
@nohup@
使得一個進程在後台運行可以採取的辦法是
①nohup ctrl+z然後bg
②screen命令
③crontab
@crontab執行@
基本格式 :
*****command分 時 日 月 周 命令
第1列表示分鐘1~59每分鐘用*或者
*/1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要啟動並執行命令
30 21 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每晚的21:30重啟apache。
45 4 1,10,22 * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每月1、10、22日的4
: 45重啟apache。
10 1 * * 6,0/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每周六、周日的1 : 10重啟apache。
0,30 18-23 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重啟apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpdrestart 1>/dev/null2>&1
上面的例子表示每星期六的11 : 00 pm重啟apache。
* */1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
每一小時重啟apache
* 23-7/1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
晚上11點到早上7點之間,每隔一小時重啟apache
0 11 4 * mon-wed/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
每月的4號與每周一到周三的11點重啟apache
0 4 1 jan */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
一月一號的4點重啟apache
@cut的用法
[@administer]# echo 11-22-33|cut-d"-" -f2,3
22-33
[@administer]# echo 11-22-33|cut-d"-" -f2,3|cut -d"-" -f1
22
注意管道符號前後有沒有空格都會輸出相同的顯示結果
@head和tail@
head用來查看檔案的頭部10行,
tail用來查看檔案的尾部10行。tail還可以用來追蹤檔案的更新情況。
head <filename>:
你可以通過head命令查看具體檔案最初的幾行內容,該命令預設是前10行內容,如果你想查看前面更多內容,你可以通過一個數字選項來設定,例如
head -20 install.log
通過上面命令你可以查看install.log這個檔案前面20行的內容
與head命令相反,tail命令是用來查看具體檔案後面幾行的內容,預設情況下,是查看該檔案尾10行的內容,同樣,如果想查看後面更多內容,也是通過數字選項來設定,例如
tail -20 install.log
你還可以使用 tail 來觀察記錄檔被更新的過程。使用 -f 選項,tail 會自動即時
地把開啟檔案中的新訊息顯示到螢幕上。例如,要即時觀察 /var/log/messages的變化,以根使用者身份在 shell 提示
下鍵入以下命令:
tail -f /var/log/messages
@SORT@的參數@
輸入tab鍵的方法 ctrl-v-i
cat FinalResult2.txt | sort-t' ' -k1,1 -k3,3 nr>FinalResult3.txt
注意排序依據大於一列時要寫為sort-t' ' -k1,1 -k3,3nr,不能夠寫為sort -t' ' -k1-k3nr
@查看磁碟空間大小@
用法一 df -h
[@administer ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgroot-lvroot
3.9G 482M 3.3G 13% /
/dev/mapper/vgroot-lvusr
4.9G 2.3G 2.4G 50% /usr
/dev/mapper/vgroot-lvvar
3.9G 427M 3.3G 12% /var
/dev/mapper/vgroot-lvopt
137G 79M 137G 1% /opt
/dev/cciss/c0d0p1 190M 19M 162M 11% /boot
tmpfs 6.9G 16K 6.9G 1% /dev/shm
/dev/cciss/c0d1p1 8.2T 7.3T 992G 89% /search
glusterfs#10.12.130.18
60T 49T 12T 81% /gfs
用法二
du -ch 看這個檔案夾整體
du -chs 分開看此檔案夾下面的所有小檔案夾。
du --max-depth=1 分開看此檔案夾下面的所有深度為1的小檔案夾。
@top命令查看運行情況@
# top
top - 09:13:42 up 43 days, 16:32, 2 users, load average: 11.62, 26.60, 20.90
Tasks: 168 total, 2running, 166 sleeping, 0 stopped, 0 zombie
Cpu(s): 24.8%us, 3.2%sy, 0.0%ni, 69.4%id, 2.4%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 16443520k total,10953860k used, 5489660k free, 2540k buffers
Swap: 8388600k total, 8286076k used, 102524k free, 429984k cached
# ll /proc/13299
@改變檔案或者檔案夾的屬主@
chown -R felicia:felicia./TempTask/
@rsync限制速度及顯示詳細資料@
rsync --bwlimit=1024 -v0.0.0.0::root/a/b/c/* ./
@chmod的使用
chmod u-x,go+rw linuxsir007.txt 註:減去檔案屬主對檔案的執行權,增加屬組和其它使用者對檔案的可讀可寫權;
@find與grep@
find用於尋找檔案系統中的指定檔案,格式為find 要尋找的路徑 運算式
例如
find . -name 1.txt 在目前的目錄及其子目錄下尋找檔案1.txt
find /tmp -name 1.txt 在/tmp 目錄及其子目錄下尋找檔案1.txt
grep命令用於尋找指定的模式比對格式為,grep [命令選項] 要尋找的匹配模式 [要尋找的檔案]
例如
grep cams test.txt 在test.txt 檔案中尋找cams 字串
grep -r cams /root/cams 在/root/cams 目錄及其子目錄下的所有檔案中尋找cams 字串
grep 命令除了能夠尋找檔案外還能夠將任意輸出資料流重新導向到grep 進行尋找
ps -ef | grep ora 尋找進程名中包含ora 的所有進程資訊
@pstree@
一般用到 pstree -ap 查看進程數(以詳細方式查看,包括其中包含的命令和PID)
@殺掉一個進程@
PROCESS=`ps -ef|grepyourprocess|grep -v grep |awk '{print $2}'`
kill -9 $PROCESS
@殺掉父進程及其子進程@
[@administer_18_71 Scripts]#pstree -ap|grep Statistics.sh
| | |-grep,14231 Statistics.sh
| | `-sh,1642 Statistics.sh
[@administer_18_71 Scripts]#pstree -ap 1642
sh,1642 Statistics.sh
|-cat,1643 ../Data/adid_log.20120506
`-exe,1644 200000000300000 ../Data/pv_pvid.20120506 ../Data/cd_pvid.20120506
[@administer_18_71 Scripts]# kill1642 1644
[@administer_18_71Scripts]#
[1]+ Terminated nohup sh Statistics.sh
@SCREEN命令@
screen -S sessionid
ctrl+a d 退出剛建立的視窗(回到進入screen前的環境)
screen建立新的終端視窗
screen -ls可以看所有的screen sessions
screen -r sessionid可以進sessionid指定的特定的screen session,不再使用的時候exit退出即可
screen -d sessionid強制把一個session切換為detached狀態
@字串刪除@
為了完整起見,我這裡再用一些例子加以說明 ${ }的一些特異功能:
假設我們定義了一個變量為:
@${ }@
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ }分別替換獲得不同的值:
${file#*/}:拿掉第一條 /及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 /及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 .及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 .及其左邊的字串:txt
${file%/*}:拿掉最後條 /及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 /及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 .及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 .及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鑑盤上 #在
$ 之左邊)
% 是去掉右邊(在鑑盤上 %在
$ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
${file:0:5}:提取最左邊的 5個字節:/dir1
${file:5:5}:提取第 5個字節右邊的連續 5個字節:/dir2
${file/dir/path}:將第一個dir提換為path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部dir提換為path:/path1/path2/path3/my.file.txt
@用touch來改變檔案的修改時間@
例一 touch -m FILE1 -r FILE2 把FILE1的時間修改為FILE2的時間
例一 touch -m Feature.cpp -r config.cpp
例二 touch -m FILE1 -t TIME(YYYYMMDDHHMM) 用TIME所指定的時間去修改FILE1的時間
例二 touch -m Feature.cpp -t 201211052230