BASH命令和SHELL指令碼總結(3)命令篇

來源:互聯網
上載者:User

@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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.