【正經教程】Linux基礎(四):認識與學習Bash


1. Shell

![](/assets/images/Screen Shot 2021-02-03 at 20.41.55.png)

簡而言之,shell是用戶與Kernel交互的界面。shell是用戶使用操作系統來操作硬件的一個接口。shell可以調用其他的軟件,比如各種各樣的命令,來調用內核運行所需的工作。

狹義上是僅僅只命令行,廣義上的shell也包括圖形操作界面。

我在mac和linux上用的shell都是bash.(Bourne Again SHell)

目錄/etc/shells可以用來查看當前系統中有多少可以使用的shell

![](/assets/images/Screen Shot 2021-02-03 at 20.50.51.png)

/home/username/.bash_history 目錄中存放有上一次登錄所使用的命令

2. 環境變量

  • 習慣性的,環境變量要求全部大寫

  • env命令可以查看當前所有的【環境變量】

  • set命令用於查看當前所有【變量】

  • 環境變量與自定義變量的區別在於,后者不可以被子進程所繼續引用,而環境變量可以。

  • export命令可以將自定義變量轉化為環境變量

PS1 提示符設置,這玩意可以改變命令提示符的樣式

![](/assets/images/Screen Shot 2021-02-03 at 22.11.13.png)

3. Bash Shell的操作環境

a.路徑與命令查找順序

  1. 以相對/絕對路徑執行命令,如"/bin/ls"或者"./ls"
  2. 由alias找到該命令來執行
  3. 由bash內置的(builtin)命令來執行
  4. 通過$PATH這個變量的順序找到的第一個命令來執行
    ![](/assets/images/Screen Shot 2021-02-04 at 12.51.43.png)

b.Bash的歡迎信息文件

/etc/issue 文件內寫了登錄終端機接口tty時的歡迎信息,你可以在里面畫圖之類的。

/etc/issue.net 文件內寫了遠程登錄終端機時的歡迎信息

/etc/motd 是讓所有人都知道的信息

【如何登錄tty】

  • 按下Ctrl + Alt + Fn1進入圖形化用戶登錄界面
  • 按下Ctrl + Alt + Fn2進入當前圖形化界面
  • 按下Ctrl + Alt + Fn3-Fn6進入命令行虛擬終端
  • 按下Ctrl + Alt + Fn7-Fn12進入另外的虛擬終端,這些虛擬終端沒有任何程序執行,所以只能看到一個閃爍的光標
issue內的各代碼意義
\d 本地端時間的日期
\l 顯示第幾個終端機接口
\m 顯示硬件的等級
\n 顯示主機網絡名稱
\o 顯示domain name
\r 顯示操作系統版本(相當於uname -r)
\t 顯示本地端時間的時間
\s 操作系統的名稱
\v 操作系統的版本

c.Bash的環境配置文件

①. login shell 與 non-login shell

login shell 取得bash時需要完整的登錄流程,稱為login shell, 如tty2~tty6

non-login shell 取得bash接口時不需要完整的登錄流程,如tty1是從圖形界面進入terminal,不需要再次登錄,屬於non-login shell

②. Login shell的配置文件讀取

文件
/etc/profile 內寫有系統的整體設置,最好不要修改。
~/.bash_profile 或者~/.bash_login或者 ~/.profile 用戶個人設置 想改動的話改動這里吧。左邊三個文件只會讀取其中一個,按照優先級順序為.bash_profile→.bash_login→.profile

/etc/profile文件內容

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then #判斷命令提示符的設定
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then # `id -u`拿到當前用戶的uid,判斷是否為root uid=0(root) 設定命令提示符
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do #對用戶有r權限的.sh文件進行調用
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi
# /etc/profile.d/*.sh中設置了顏色,語系,別名等等

~/.profile文件內容

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc" # 這個文件里寫了非常多自己bash的配置 .是source命令的簡寫,如果對這個文件進行了修改 可以直接source ~/.bashrc讀取新環境
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH" # 修改環境變量PATH
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH" #修改環境變量PATH
fi

login shell的啟動流程圖

![](/assets/images/Screen Shot 2021-02-04 at 14.55.55.png)

③.non-login shell的配置文件讀取

僅僅讀取~/.bashrc文件而已

④. 其他相關文件

  1. ~/.bash_history 記錄歷史命令
  2. ~/.bash_logout注銷bash系統后幫我做完什么操作再離開

3.Bash的通配符與特殊符號以及組合按鍵

  • bash默認組合按鍵
組合按鍵 執行結果
Ctrl + C 終止目前的命令
Ctrl + D 輸入結束(EOF)
Ctrl + M 就是Enter
Ctrl + S 暫停屏幕輸出
Ctrl + Q 恢復屏幕輸出
Ctrl + U 在提示符下,將整行命令刪除
Ctrl + Z 暫停目前的命令
  • 通配符
符號 意義
* 代表0到無窮多個任意字符
? 代表一定有一個任意字符
[] 同樣代表一定有一個在中括號內的字符(非任意字符) 如[abcd]表示有abcd其中某一個
[-] 表示在編碼順序內的所有字符 [0-9]
[^] 中括號中的第一個字符為^ 表示原向選擇 [ ^abc] 表示非a,b,c的任意字符
  • 特殊符號
符號 內容
# 腳本注釋
\ 轉義符
| 管道 分隔兩個管道命令的界定
; 連續執行命令分隔符 連續命令的界定
~ 用戶主文件夾
$ 變量前導符 $? 命令回傳碼
& 作業控制(job control)將命令變成背景下工作
! 邏輯運算 非
/ 目錄符號 路徑分隔
>,>> 輸出重定向 "替換" "累積"
<,<< 輸入重定向 "" <<表示輸入結束
'' 單引號 不具有變量置換功能
"" 雙引號 具有變量置換功能
`` 被反引號包住的命令可以先執行
() 子shell的起始與結束
{} 命令塊的組合
  • 命令執行的判斷
語句 說明
cmd;cmd 不考慮命令系相關性的連續執行
cmd1 && cmd2 若cmd1執行完畢且$?=0, 則開始執行cmd2
若cmd1執行完畢且$?≠0,則cmd2不執行
cm1 || cmd2 若cmd1執行完畢且$?=0,則不執行cmd2
若cmd1執行完畢且$?≠0,則執行cmd2


免責聲明!

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



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