linux學習——shell
1.什麼是Bash shell(殼)
Bash Shell是一個命令直譯器,它在作業系統的最外層,負責使用者程式與核心進行互動操作的一種介面,將使用者輸入的命令翻譯給作業系統,並將處理後的結果輸出至螢幕。
通過xshell連線,就是打開了一個bash程式的視窗,不能點滑鼠,只能輸入命令
當我們使用遠端連線工具連線linux服務,系統則會給開啟一個預設的shell,我們可在這個介面執行命令、比如:獲取系統當前時間,建立一個使用者等等…
2.Bash Shell能幹什麼?
使用Shell實現對Linux系統的大部分管理,例如:
1.檔案管理(檔案建立,移動,複製,刪除,編輯…)
2.許可權管理(不同使用者不通許可權)
3.使用者管理(建立,刪除….)
4.磁碟管理(掛載)
5.網路管理
6.軟體管理
.等等.
3.平時我們如何使用Shell呢?
輸入命令 –> 效率低 –>適合少量的工作
Shell Script –> 效率高–>適合複雜重複性的工作
例如:建立100個使用者,單純輸入命令需要執行100次,而Shell指令碼只需要幾行命令即可完成100個使用者的建立
vim test.sh
for i in {1..100}
do
useradd test$i
echo "create test$i"
done
bash test.sh
4.Shell提示符
# $ = 普通使用者, # = root使用者(超級管理員) ### [root@lqz ~]# # root:當前登入使用者 # @ :沒有意義 # lqz:主機名稱,如果很長會顯示不全,通過hostname檢視 # ~:當前使用者所在家目錄 # #:通常指超級管理員 # $:普通使用者 [root@lqz ~]# whoami root [root@web01 ~]# useradd jack [root@web01 ~]# passwd jack Changing password for user jack. New password: BAD PASSWORD: The password is a palindrome Retype new password: passwd: all authentication tokens updated successfully. [root@web01 ~]# su jack [root@web01 ~]# cd root 提示沒有許可權
5.Shell基礎語法
命令列bash shell, 為使用者提供輸入, 執行命令的介面
#命令 選項 引數 command [-options] [arguments] [root@lqz ~]# ls #命令 [root@lqz ~]# ls -a #命令+選項 [root@lqz ~]# ls -a /home/ #命令+選項+引數 ls -a -l ls -la ls --all ls --list ls -c ls --color ls -a /tmp #命令: 整條shell命令的主體 #選項: 用於調節命令的輸出效果 #以 “-”引導短格式選項(單個字元),例如“-l” #以“--”引導長格式選項(多個字元),例如“--color” #多個短格式選項可以寫在一起,只用一個“-”引導,例如“-al” #引數: 命令操作的物件,如檔案、目錄名等 # 選項和引數可以出現位置調換,命令,選項,引數之間要至少有一個空格 # 命令必須開頭, 選項和引數位置可以發生變化
2.Bash Shell基本特性
1.命令補全
當使用windows查詢一個目錄層級特別多的檔案時,開啟的效率會非常的慢,但如果使用linux查詢一個目錄層級特別多的檔案時,可以通過tab鍵快速的補全
PS: tab鍵可以實現命令補全,路徑補全,在實際生產中tab補全往往是我們使用的最多的, 因為可以減少執行命令以及路徑出錯率。
# yum provides ifconfig
# yum install net-tools
#檢視ip時忘記具體了命令
[root@lqz ~]# ifcon
#按下tab鍵會自動補全
[root@lqz ~]# ifconfig
#按一下tab鍵沒有反應, 按兩下tab鍵列出所有if開頭的命令
[root@lqz ~]# if
if ifconfig ifenslave ifrename
ifcfg ifdown ifnames ifup
#linux目錄較深,經常使用tab鍵進行補全, 如果路徑出錯是沒有辦法補全(帶斜線表示是目錄(window叫資料夾))
[root@lqz ~]# ls /etc/sysconfig/network-scripts/
# 安裝選項補全
yum install bash-comple*
yum install bash-completion
# ls -- Tab建,空格上下翻
2.命令快捷鍵,快捷鍵可以幫助我們大大提升工作效率
Ctrl + a #游標跳轉至正在輸入的命令列的首部
Ctrl + e #游標跳轉至正在輸入的命令列的尾部
Ctrl + c #終止前臺執行的程式
Ctrl + d #在shell中,ctrl-d表示推出當前shell。
Ctrl + z #將任務暫停,掛至後臺
Ctrl + l #清屏,和clear命令等效。
Ctrl + k #刪除從游標到行末的所有字元
Ctrl + u #刪除從游標到行首的所有字元
Ctrl + r #搜尋歷史命令, 利用關鍵字,Tab建選中
Ctrl + w #按單詞或空格進行向前刪除
Ctrl + 左右建 #按單詞或空格進行向前向後跳
#在命令列前加面加 "#" 則該命令不會被執行
3.歷史命令History, 追溯之前發生情況
-w 儲存命令歷史到歷史檔案
-c 清空命令歷史記錄, 不會情況檔案
-d 刪除命令歷史的第 N 條行
#1.使用雙 !! 可執行上一條執行過的命令
[root@lqz ~]# ls
lqz.com
[root@lqz ~]# !!
ls
lqz.com
#2.輸入!6, 執行history命令歷史中第 6 行命令
[root@lqz ~]# !6
touch lqz.com
#使用!cat, 呼叫history命令歷史最近一次執行過的cat命令
[root@lqz ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
[root@lqz ~]# !cat # 最近一次
cat /etc/sysconfig/network-scripts/ifcfg-eth0
[root@lqz ~]# ls /etc/passwd
#呼叫上一條命令的最後引數或選項, 按下ESC鬆開, 然後按下 "."
[root@lqz ~]# cat
[root@lqz ~]# cat /etc/passwd
#第二種方式, 輸入!$
[root@lqz ~]# ls !$
ls /etc/passwd
/etc/passwd
# history -d 100 刪除第100條歷史記錄
# history -c 清空記錄(儲存到檔案中的還有)
# history -w 儲存歷史集合,儲存到當前使用者的家目錄 .bash_history
# > .bash_history 清空檔案的儲存(操作完,不讓別人看你執行的命令)
3.命令別名
命令別名將使用者經常使用的複雜命令簡單化, 可以用"alias 別名名稱=命令"
命令建立屬於自己的命令別名, 若要取消一個命令別名,則是用unalias 別名名稱
命令。
#1.定義臨時別名, wk為檢視eth0網絡卡別名
[root@lqz ~]# alias wk='ifconfig'
# alias 檢視一下是否成功,發現系統內建了很多
[root@lqz ~]# wk
# 取消別名(都是臨時的)
[root@lqz ~]# unalias wk
#2.如果定義命令本身, 會執行什麼?
[root@lqz ~]# alias ifconfig='ifconfig eth0'
#絕對路徑執行, 呼叫命令本身
[root@lqz ~]# /sbin/ifconfig
#通過轉義字元, 呼叫命令本身
[root@WebServer ~]# ifconfig
#3.取消別名
[root@lqz ~]# unalias ifconfig
#4.永久生效,/etc/bashrc
[root@lqz ~]# echo "alias ifconfig='ifconfig eth0'" >> /etc/bashrc
3.Bash Shell獲取幫助
1.命令 –help幫助
[root@lqz ~]# ls --help
用法: ls [選項]...[檔案]...
#ls 常見選項
-a #檢視目錄下的所有檔案,包括隱藏檔案
-l #以長格式的方式顯示檔案的詳細內容
-h #以人性化的方式顯示內容,配合-l使用
-d #只列出目錄名,不列出目錄以下的內容
-t #按修改時間進行排序
-i #顯示檔案的inode(該檔案在該分割槽的一個編號)
[root@lqz ~]# date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
[root@lqz ~]# date +%F #檢視日期
2019-03-28
[root@lqz ~]# date -s 12:00 #修改時間
#時間不是用來檢視,而是有其他的用途
[root@web01 ~]# touch `date +%F`_file.txt
[root@web01 ~]# ls
2019-03-28_file.txt
2.命令 man手冊
# man ls #檢視ls命令的手冊
3.linux命令大全url傳送門
linux命令大全
linux命令手冊
4.Bash Shell命令流程
1.當我們執行一個命令, 整個命令執行流程如下:
- 判斷命令是否通過絕對路徑執行
- 判斷命令是否存在alias別名
- 判斷使用者輸入的是內部命令還是外部命令
- Bash內部命令直接執行,外部命令檢測是否存在快取
- 通過PATH路徑查詢命令,有執行,無報錯
2.什麼是內部命令,什麼是外部命令
內部命令: shell程式自帶的命令。
外部命令: 在系統PATH變數的某個路徑下的可執行程式。
3.如何檢查使用者輸入的命令是內部命令還是外部命令
#cd命令屬於shell內部命令
[root@linux-node1 ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd
#ping屬於外部命令, 同時會列印當前命令路徑
[root@lqz ~]# type -a ping
ping is /bin/ping
4.如果是外接命令,Bash可以通過查詢PATH變數,獲取該命令的絕對路徑。
#列印當前環境變數目錄
[root@lqz ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PS: PATH由多個路徑組成,每個路徑值之間用冒號間隔,對這些路徑的增加和刪除操作都將影響到Bash直譯器對Linux命令的查詢
5.如果是外接命令還會涉及到一個記憶體快取,也就是說,當我們出現重複執行相同的命令,會通過快取調取執行,也就意味著不會搜尋PATH路徑。
#表快取命令所在位置
[root@lqz ~]# hash
hits command
1 /usr/bin/tty
3 /sbin/ifconfig
#已快取命令,如果移動位置會導致無法找到該命令
[root@lqz ~]# mv /sbin/ifconfig /bin/
[root@lqz ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory
#刪除快取過的ifconfig命令, 即可執行
[root@lqz ~]# hash -d ifconfig
[root@lqz ~]# ifconfig
#當然可以清空快取表
[root@lqz ~]# hash -r
#注意: 命令快取hash需要注意如下情況:
1.只要執行外部命令1次就會對該命令進行快取
2.如果將命令移動了位置,該如何執行
a.使用絕對路徑執行
b.刪除hash表的快取指令
6.命令執行流程總結: 當我們執行了一個ping
命令之後, 整個命令執行的流程步驟如下:
- 檢查執行的命令是否使用的是絕對路徑執行的。
- 檢查ping命令是否存在alias別名
- 檢查ping命令是內部命令還是外部命令
- 如果是內部命令Bash直接執行,如果是外部命令,首先檢查Hash快取,存在則直接調取
- 如果該命令不存在Hash快取,則通過PATH路徑進行逐行查詢該命令所在的位置
- 如果PATH路徑沒有查詢到該命令所在的路徑,則返回錯誤碼。command not found