首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

Shell 基礎知識全攻略:從入門到進階應用

     編輯:C 語言入門

什麼是 Shell?

Shell 是一個命令行解釋器,它為用戶提供了一個向 Linux 內核發送請求以運行程序的介面。透過 Shell,用戶可以啟動、掛起、停止甚至編寫程序。Shell 同時也是一種功能強大的程式語言,具有易編寫、易調試、靈活性高等特點。作為解釋執行的腳本語言,Shell 可以直接調用 Linux 系統命令。

Shell 的分類

Shell 的主要語法類型分為 Bourne 和 C 兩大家族,兩者語法不兼容。

  • Bourne 家族:sh、ksh、Bash、psh、zsh
  • C 家族:csh、tcsh

Bourne Shell

自 1979 年起 Unix 開始使用 Bourne Shell,其主文件名為 sh,是一個非常古老且功能簡單的 Shell。

C Shell

C Shell 主要在 BSD 版的 Unix 系統中使用,其語法與 C 語言相似而得名。

Bash

Bash 與 sh 兼容,目前主流 Linux 發行版均採用 Bash 作為用戶的基本 Shell。

查看當前 Shell 與支持列表

echo $SHELL          # 查看當前 Shell
vim /etc/shells      # 查看系統支持的 Shell 列表

別名管理

查看與設置別名

alias                    # 查看當前所有別名
alias ll='ls -l --color=auto'  # 設置臨時別名
alias vi='vim'           # 例如:輸入 vi 實際執行 vim

刪除別名

unalias vi

永久配置別名

vi ~/.bashrc
# 在文件中添加
alias vi='vim'
# 保存退出後重新加載
source ~/.bashrc

命令生效優先級順序

  1. 使用絕對/相對路徑的命令
  2. 別名
  3. Bash 內部命令
  4. $PATH 環境變量定義的目錄中查找到的第一個命令

注意:別名優先級高於系統默認命令。

常用快捷鍵

快捷鍵功能
Ctrl+C強制終止當前命令
Ctrl+L清屏
Ctrl+A光標移動到行首
Ctrl+E光標移動到行尾
Ctrl+U從光標處刪除到行首
Ctrl+Z將命令放入後台
Ctrl+R在歷史命令中搜索

歷史命令管理

history [選項] [歷史文件]
  -c  : 清空歷史命令
  -w  : 將緩存中的歷史命令寫入 ~/.bash_history

註: 預設保存 1000 條,可在 /etc/profile 中修改 HISTSIZE 值。

歷史命令調用方式

  • 上/下箭頭鍵翻閱
  • !n 重複執行第 n 條命令
  • !! 重複執行上一條命令
  • !字串 重複執行最後一條以該字串開頭的命令

Tab 鍵補全

按 Tab 鍵可補全命令或文件名。若一次未補全,再按一次顯示所有匹配項。Tab 鍵在 $PATH 指定的可執行文件搜索路徑中查找命令。

Bash 中的特殊符號

符號作用
''單引號:其中所有特殊符號(如 $、`)均無特殊含義
""雙引號:特殊符號無特殊含義,但 $、`、\ 例外,分別具備「調用變量值」「引用命令」「轉義符」功能
` `反引號:括起的內容作為系統命令先執行,等同於 $(),推薦使用 $()
$()引用系統命令,作用同反引號
#Shell 腳本中以 # 開頭的行視為註釋
$調用變量值,如 $name
\轉義符:其後的特殊符號失去特殊含義,如 \$ 輸出 $ 符號

Shell 變量詳解

變量命名規則

  • 必須以字母或下劃線開頭
  • 只能包含字母、數字、下劃線
  • 長度不超過 255 字符
  • 在有效範圍內唯一
  • Bash 中變量默認類型均為字符串型

變量分類

  • 用戶自定義變量:用戶定義,僅在當前 Shell 生效
  • 環境變量:保存系統操作環境相關數據,在當前 Shell 及其所有子 Shell 中生效
  • 位置參數變量:向腳本傳遞參數,變量名固定($0~$9、${10} 等)
  • 預定義變量:Bash 內建,名稱和作用固定

定義與使用變量

# 定義:變量名=值(中間不能有空格)
x=5
# 打印
echo $x
echo ${x}

變量疊加

x=123
x="$x"456
x=${x}789

查看與刪除變量

set          # 查看所有變量(含環境變量和用戶變量)
set -u       # 啟用未聲明變量報錯
unset 變量名  # 刪除變量(變量名前不加 $)

環境變量深度解析

關鍵區別:用戶自定義變量僅在當前 Shell 生效,環境變量在當前 Shell 及其所有子 Shell 中生效。

# 定義變量 a
a=5
# 進入子 shell
bash
# 子 shell 中無法訪問 a
echo $a  # 空輸出

# 父 shell 中導出變量
export a
bash
# 子 shell 現在可以訪問
echo $a  # 輸出 5

# 子 shell 無法刪除父 shell 的變量
unset a
exit
# 父 shell 中刪除
unset a

查看環境變量

set   # 所有變量
env   # 僅環境變量

PS1 環境變量:自定義命令提示符

轉義字符含義
\d日期(如「週一 1月 01」)
\H完整主機名
\t24小時制時間(HH:MM:SS)
\A24小時制時間(HH:MM)
\u當前用戶名
\w完整工作目錄路徑
\W當前目錄最後一級名稱
$提示符(root 顯示 #,普通用戶顯示 $)
echo $PS1
# 輸出示例:[\u@\h \W]\$

PS2:換行提示符

# 輸入不完整命令時顯示的提示符(默認為 >)
ls \
> ~

語系設置

locale          # 查看當前語系
echo $LANG      # 查看主語系變量
locale -a | more  # 查看系統支持的所有語系

系統默認語系配置文件:/etc/sysconfig/i18n

cat /etc/sysconfig/i18n
# LANG="zh_CN.UTF-8"

Linux 中文支持條件:正確安裝中文字體和語系。圖形界面可直接支持;遠程工具(如 XShell)需設置正確語系;純字符界面需第三方插件(如 zhcon)。

位置參數變量

變量作用
$n$0為命令本身,$1-$9為第1-9個參數,10以上用 ${10}
$*所有參數視為一個整體
$@所有參數分別對待
$#參數個數
# $* 與 $@ 差異示例
for i in "$*"; do echo $i; done  # 一行輸出所有參數
for i in "$@"; do echo $i; done  # 每行輸出一個參數

預定義變量

變量作用
$?上一條命令返回狀態(0 成功,非 0 失敗)
$$當前進程 PID
$!後台運行的最後一個進程 PID

read 命令:交互式輸入

選項說明
-p "提示信息"等待輸入時顯示提示
-t 秒數指定等待超時時間
-n 字符數讀取指定字符數即執行
-s隱藏輸入(適用於密碼等機密信息)

Shell 運算符與數值運算

Shell 變量默認為字符串型,直接運算會進行字符串拼接而非數學計算。

declare 聲明變量類型

declare [+/-][選項] 變量名
  -a  數組型
  -i  整數型
  -x  環境變量
  -r  只讀變量
  -p  顯示變量聲明類型

整數運算示例

aa=11; bb=22
cc=$aa+$bb      # 結果:11+22(字符串拼接)
declare -i cc=$aa+$bb  # 結果:33(數學運算)

數組聲明

movie[0]=zp
movie[1]=tp
declare -a movie[2]=live
echo ${movie[*]}  # 輸出所有元素

環境變量聲明

export bb=2
# 等同於
declare -x bb=2

只讀屬性

declare -rx test=123
test=456      # 報錯:readonly variable
unset test    # 報錯:cannot unset
declare +r test  # 報錯:readonly variable

數值運算的多種方法

# 方法1:expr(注意運算符兩側需有空格)
dd=$(expr $aa + $bb)

# 方法2:$(()) 或 $[](推薦,無需空格)
dd=$(($aa+$bb))
dd=$[$aa+$bb]

運算符優先級

運算符優先級表

註:數值越大,優先級越高。

變量測試

變量測試語法表

註:變量測試語法簡潔但邏輯複雜,實際工作中建議查閱手冊或採用其他等效實現方式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved