Shell學習之Shell特性(一)
Shell學習之Shell特性
目錄
-
命令和檔案自動補齊功能
-
命令歷史記憶功能 history、上下鍵、!number、!string、!$、!!
-
別名功能 alias、unalias cp、~username/.bashrc、\cp -rf /etc/hosts
-
快捷鍵 ^R ^D ^A ^E ^L ^U ^K ^S ^Q
命令和檔案自動補齊功能
這個不說了,我們在輸入命令的時候,按tab鍵補全。
命令歷史記憶功能 history、上下鍵、!number、!string、!$、!!
history:歷史命令記錄 上下鍵:切換歷史命令 !number:執行對應number的歷史命令 !string:重新執行一遍含有string的最近的歷史命令 !$: !!:執行上一條命令
別名功能 alias、unalias cp、~username/.bashrc、\cp -rf /etc/hosts
alias:檢視臨時別名 alias 別名='命令':定義別名 unalias 別名:刪除別名 \命令 [選項] [引數]:跳過別名,如果這個命令定義了別名,但是你不想使用別名,可以這麼用
另外定義永久的別名: 超級使用者root的配置檔案:.bashrc 普通使用者的配置檔案:~username/.bashrc (前面這個符號代表家目錄)
^R:搜尋歷史命令,通過命令裡包含的字元 ^D:退出,相當於exit ^A:將游標移到最前面 ^E:將游標移到後面 ^L:刪除游標後面一個字元 ^U:刪除游標前面一個字元 ^K:截去游標後面的內容 ^S:鎖屏 ^Q:解屏
前後臺作業控制
&命令
注: 1.需要使用者互動的命令不要放在後臺執行,否則機器一直等待輸入 2.後臺程式在執行時,執行結果仍然會輸出到螢幕,干擾我們的工作, 建議將這樣的資訊重定向到某個檔案 3.在命令後面加上&可以將命令放到後臺執行,如果退出終端,則無效,只在本次會話有效
將這段程式碼放到後臺執行,直接在後面加&。 sleep 300 & 如果讓這個命令能在下次登陸也能生效,怎麼解決? 在命令前面加上nohup nohup sleep 6000 &
screen命令
,生成一個會話,可以一直使用 比如我們登陸到一個linux系統,先生成一個會話,不會影響你現在的工作,你該幹什麼幹什麼,會記錄所有當前會話內容,下次登陸,可以切換到你上次工作的會話下。 screen:生成一個會話 screen -s [會話名]:生成一個命名的會話 screen -list:檢視所有會話 screen -r [number]:切換會話
輔助命令
我們知道當有任務在前臺工作時,任務會佔用終端,你此時不能在終端工作,除非你再開啟一個終端 ^C:殺掉正在執行的前臺任務 ^Z:將正在執行的前臺任務暫停到後臺 bg:讓任務在後臺工作,bg [number] fg:讓任務回到前臺工作,fg [number] kill number:給pid為number的程序發信息 kill %[number]:給當前shell中作業號為number的發信息 ps: 列出系統中正在執行的程序 jobs:檢視當前有多少在後臺執行的命令
輸入輸出重定向
當我們在shell中執行命令的時候,每個程序都和三個開啟的檔案相聯絡,並使用檔案描述符來引用這些檔案:
系統中實際上有12個描述符,可以任意使用檔案描述符3-9 標準輸入對應檔案描述符0,是命令的輸入,預設是鍵盤 標準輸出對應檔案描述符1,是命令的輸出,預設是終端 標準錯誤對應檔案描述符2,是命令錯誤的輸出,預設是終端
利用檔案重定向功能對命令的標準輸入,輸出和錯誤進行修改: 常用檔案重定向命令: command >file:標準輸出重定向到一個檔案,錯誤仍然輸出螢幕 command >>file:標準輸出重定向到一個檔案(追加) command 1>file1:標準輸出重定向到一個檔案 command 2>>file2:標準錯誤重定向到一個檔案(追加) command 1>file 2>&1:標準輸出和標準錯誤一起重定向到一個檔案 command 1>>file 2>&1:標準輸出和標準錯誤一起重定向到一個檔案(追加) command < file1 >file2:以file1做為標準輸入,file2做為標準輸出 command <file:以file做為檔案標準輸入 注:上面的command>file 2>&1 可以修改為command>file 2>>file
例子
重定向標準輸出: 例: ls –l >>myfile.out 重定向標準輸入: 例: sort < name.txt> name.out 從name.txt讀入資料進行排序,然後將排序結果輸出到檔案name.out中 重定向標準錯誤 例: ls ddd 2> /dev/null ddd不存在,標準錯誤資訊會輸送到系統垃圾箱,而不會輸送到螢幕如果標準錯誤資訊有用,可以將其存放到錯誤檔案中 使用檔案重定向功能將MySQL-client-5.0.16-0.i386.rpm的包說明資訊追加到 mysql_install.log 檔案中。 rpm -qi MySQL-client-5.0.16-0.i386.rpm >>mysql_install.log 使用檔案重定向功能將ls ddd的錯誤資訊儲存在錯誤日誌error.log檔案中, 說明:ddd 目錄並不存在。 ls ddd 2>error.log 編寫指令碼,實現功能:讀取檔案myfile中一行資料,並通過echo打印出來 #!/bin/bash read data </root/myfile echo $data
輸入和輸出
輸出echo
echo命令:用來顯示文字行或變數取值,或者把字串輸入到檔案中。 格式:echo string echo的常用功能:\c不換行 \f不進紙 \t跳格 \n換行 注意: 對於linux系統,必須使用-e選項來使以上轉義符生效 例:$echo -e "hello\tboy" $helloboy echo命令對特殊字元敏感,如果要輸出特殊字元,需要用\遮蔽特殊含義 常用的特殊字元:雙引號"" 例:$echo "\"\"" $""
例子
編寫shell指令碼,藉助echo命令分別輸出系統中SHELL,PATH變數的取值 指令碼: echo $SHELL,$PATH 編寫shell指令碼,使用一個echo命令輸出如下格式的內容(注意對齊格式): idnamemsg 01mike"hello" 02john"hi" 指令碼: echo -e "id\tname\tmsg\n01\tmike\t\"hello\"\n02\tjohn\t\"hi\""
輸入read
從鍵盤或者檔案的某一行文字讀入資訊,並將其賦給一個變數。 格式:read var1 var2 ...
注意:如果輸入的值個數多於變數的個數,多餘的值會賦給最後一個變數。
例子
編寫shell指令碼,實現功能:接收使用者輸入的值,並顯示在螢幕。 指令碼: #!/bin/bash read name echo $name 編寫shell指令碼,使用read命令讀取user和password變數 第一次:輸入 mike 1234567 第二次:輸入 mike 第三次:輸入mike john 123456 分別使用echo命令檢視user,password的取值,比較有何不同? 指令碼: #!/bin/bash read user password echo $user $password
管道 | tee
管道
可以通過管道把一個命令的輸出傳遞給另一個命令做為輸入 格式:命令1 | 命令2 示例:cat test.txt | grep 'hello'
例子
編寫shell指令碼,對檔案file1,file2,file3內容合併,並對每行進行編號。 指令碼: cat -n file1 file2 file3 > file4.txt
tee命令
把輸出的一個副本輸送到標準輸出,另一個副本拷貝到相應的檔案中,如果想看到輸出的同時,把輸出也同時拷入一個檔案,這個命令很合適。 格式:tee -a file -a 表示檔案追加到末尾 file 表示儲存輸出資訊的檔案 tee命令一般和管道符 | 結合起來使用 例子:who | tee who.info 該命令的資訊返回在螢幕上,同時儲存在檔案who.info中
例子
1.使用tee命令將當前系統中所有程序資訊儲存到檔案pid_info中 指令碼: #!/bin/bash top | tee pid_info 2.使用tee命令和who命令將當前系統中登陸的終端資訊追加到檔案login_info中 指令碼: #!/bin/bash who | tee -a login_info
命令排序
如果你想在執行多個命令,可以使用下面三種分隔符 ; && || ; 不具備邏輯判斷,不關心前面的命令是否執行成功,後面的命令怎樣都會執行 示例:cd;cat file && 具備邏輯判斷,前面的命令執行成功,後面的命令才能執行 || 具備邏輯判斷,前面的命令執行不成功,後面的命令才能執行