03-Linux-Shell


1.什么是Bash shell(殼)

Bash Shell是一個命令解釋器,它在操作系統的最外層,負責用戶程序與內核進行交互操作的一種接口,將用戶輸入的命令翻譯給操作系統,並將處理后的結果輸出至屏幕。

通過xshell連接,就是打開了一個bash程序的窗口,不能點鼠標,只能輸入命令

當我們使用遠程連接工具連接linux服務,系統則會給打開一個默認的shell,我們可在這個界面執行命令、比如:獲取系統當前時間,創建一個用戶等等…

image-20200816223737732

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.當我們執行一個命令, 整個命令執行流程如下:

1) 判斷命令是否通過絕對路徑執行 2) 判斷命令是否存在alias別名 3) 判斷用戶輸入的是內部命令還是外部命令 4) Bash內部命令直接執行,外部命令檢測是否存在緩存 5) 通過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命令之后, 整個命令執行的流程步驟如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM