防偽碼:長風破浪會有時,直掛云帆濟滄海。
1.1 l Shell 簡介
Shell 是一個 C 語言編寫的腳本語言,它是用戶與 Linux 的橋梁,用戶輸入命令交給 Shell 處理,
Shell 將相應(yīng)的操作傳遞給內(nèi)核(Kernel),內(nèi)核把處理的結(jié)果輸出給用戶。
下面是處理流程示意圖:
Shell 既然是工作在 Linux 內(nèi)核之上,那我們也有必要知道下 Linux 相關(guān)知識。
Linux 是一套免費試用和自由傳播的類 Unix 操作系統(tǒng),是一個基于 POSIX 和 UNIX 的多用戶、多任
務(wù)、支持多線程和多 CPU 的操作系統(tǒng)。
1983 年 9 月 27 日,Richard Stallman(理查德-馬修-斯托曼)發(fā)起 GNU 計劃,它的目標是創(chuàng)建一
套完全自由的操作系統(tǒng)。為保證 GNU 軟件可以自由的使用、復(fù)制、修改和發(fā)布,所有的 GNU 軟件都
有一份在禁止其他人添加任何限制的情況下授權(quán)所有權(quán)利給任何人的協(xié)議條款,GNU 通用公共許可
證(GNU General Plubic License,GPL),說白了就是不能做商業(yè)用途。
GNU 是"GNU is Not Unix"的遞歸縮寫。UNIX 是一種廣泛使用的商業(yè)操作系統(tǒng)的名稱。
1985 年,Richard Stallman 又創(chuàng)立了自由軟件基金會(Free Software Foundation,F(xiàn)SF)來為
GNU 計劃提供技術(shù)、法律以及財政支持。
1990 年,GNU 計劃開發(fā)主要項目有 Emacs(文本編輯器)、GCC(GNU Compiler Collection,GNU 編
譯器集合)、Bash 等,GCC 是一套 GNU 開發(fā)的編程語言編譯器。還有開發(fā)一些 UNIX 系統(tǒng)的程序庫和
工具。
1991 年,Linuxs Torvalds(林納斯- 托瓦茲)開發(fā)出了與 UNIX 兼容的 Linux 操作系統(tǒng)內(nèi)核并在
GPL 條款下發(fā)布。
1992 年,Linux 與其他 GUN 軟件結(jié)合,完全自由的 GUN/Linux 操作系統(tǒng)正式誕生,簡稱 Linux。
1995 年 1 月,Bob Young 創(chuàng)辦 ACC 公司,以 GNU/Linux 為核心,開發(fā)出了 RedHat Linux 商業(yè)版。
Linux 基本思想有兩點:第一,一切都是文件;第二,每個軟件都有確定的用途。與 Unix 思想十分
相近。
l 1.2 Shell 基本分兩大類
1.2.1 圖形界面 Shell(GUI Shell)
GUI 為 Unix 或者類 Unix 操作系統(tǒng)構(gòu)造一個功能完善、操作簡單以及界面友好的桌面環(huán)境。
主流桌面環(huán)境有 KDE,Gnome 等。
1.2.2 命令行界面 Shell(CLI Shell)
CLI 是在用戶提示符下鍵入可執(zhí)行指令的界面,用戶通過鍵盤輸入指令,完成一系列操作。
在 Linux 系統(tǒng)上主流的 CLI 實現(xiàn)是 Bash,是許多 Linux 發(fā)行版默認的 Shell。還有許多 Unix
上用的 Shell,例如 tcsh、csh、ash、bsh、ksh 等等。
1.3 第一個 l Shell 腳本
本教程主要講解在大多 Linux 發(fā)行版下默認 Bash Shell。Linux 系統(tǒng)是 RedHat 下的 CentOS 操作系
統(tǒng),完全免費。與其商業(yè)版 RHEL(Red Hat Enterprise Linux)出自同樣的源代碼,不同的是
CentOS 并不包含封閉源代碼軟件和售后支持。
用 vi 打開 test.sh,編寫:
# vi test.sh
#!/bin/bash
echo "Hello world!"
第一行設(shè)置運行環(huán)境,第二行打印 Hello world!
寫好后,開始執(zhí)行,執(zhí)行 Shell 腳本有三種方法:
方法 1:直接用 bash 解釋器執(zhí)行
# bash test.sh
Hello world!
方法 2:添加可執(zhí)行權(quán)限
# ll test.sh
-rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh
# chmod +x test.sh
# ./test.sh
-bash: ./test.sh: Permission denied
# chmod +x test.sh
# ./test.sh # ./在當前目錄
Hello world!
方法 3:source 命令執(zhí)行,以當前默認 Shell 執(zhí)行
# source test.sh
Hello world!
l 1.4 Shell 變量
1.4.1 系統(tǒng)變量
在命令行提示符直接執(zhí)行 env、set 查看系統(tǒng)或環(huán)境變量。env 顯示用戶環(huán)境變量,set 顯示 Shell
預(yù)先定義好的變量以及用戶變量??梢酝ㄟ^ export 導(dǎo)出成用戶變量。
一些寫 Shell 腳本時常用的系統(tǒng)變量:
$SHELL | 默認Shell |
$HOME | 當前用戶家目錄 |
$IFS | 內(nèi)部字段分隔符 |
$LANG | 默認語言 |
$PATH | 默認可執(zhí)行程序路徑 |
$PWD | 當前目錄 |
$UID | 當前用戶ID |
$USER | 當前用戶 |
$HISTSIZE | 歷史命令大小,可通過HISTTIMEFO 變量設(shè)置命令執(zhí)行時間 |
$RANDOM | 隨機生成一個 0 至 32767 的整數(shù) |
$HOSTNAME | 主機名 |
1.4.2 普通變量與臨時環(huán)境變量
普通變量定義:VAR=value
臨時環(huán)境變量定義:export VAR=value
變量引用:$VAR
下面看下他們之間區(qū)別:
Shell 進程的環(huán)境變量作用域是 Shell 進程,當 export 導(dǎo)入到系統(tǒng)變量時,則作用域是 Shell 進程
及其 Shell 子進程。、
ps axjf 輸出的第一列是 PPID(父進程 ID),第二列是 PID(子進程 ID)
當 SSH 連接 Shell 時,當前終端 PPID(-bash)是 sshd 守護程序的 PID(root@pts/0),因此在當
前終端下的所有進程的 PPID 都是-bash 的 PID,比如執(zhí)行命令、運行腳本。
所以當在-bash 下設(shè)置的變量,只在-bash 進程下有效,而-bash 下的子進程 bash 是無效的,當
export 后才有效。
進一步說明:再重新連接 SSH,去除上面定義的變量測試下
所以在當前 shell 定義的變量一定要 export,否則在寫腳本時,會引用不到。
還需要注意的是退出終端后,所有用戶定義的變量都會清除。
在/etc/profile 下定義的變量就是這個原理,后面有章節(jié)會講解 Linux 常用變量文件。
1.4.3 位置變量
位置變量指的是函數(shù)或腳本后跟的第 n 個參數(shù)。
$1-$n,需要注意的是從第 10 個開始要用花括號調(diào)用,例如${10}
shift 可對位置變量控制,例如:
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
每執(zhí)行一次 shift 命令,位置變量個數(shù)就會減一,而變量值則提前一位。shift n,可設(shè)置向前移動
n 位。
1.4.4 特殊變量
$0 | 腳本自身名字 |
$? | 返回上一條命令是 否執(zhí)行成功,0 為 執(zhí)行成功,非 0 則 為執(zhí)行失敗 |
$# | 位置參數(shù)總數(shù) |
$* | 所有的位置參數(shù)被 看做一個字符串 |
$@ | 每個位置參數(shù)被看 做獨立的字符串 |
$$ | 當前進程 PID |
$! | 上一條運行后臺進 程的 PID |
1.5 變量引用
賦值運算符 | 示例 |
= | 變量賦值 |
+= | 兩個變量相加 |
# VAR=123
# echo $VAR
123
# VAR+=456
# echo $VAR
123456
Shell 中所有變量引用使用$符,后跟變量名。
有時個別特殊字符會影響正常引用,那么需要使用${VAR},例如:
# VAR=123
# echo $VAR
123
# echo $VAR_ # Shell 允許 VAR_為變量名,所以此引用認為這是一個有效的變量名,故此返回
空
# echo ${VAR}
123
還有時候變量名與其他字符串緊礙著,也會誤認為是整個變量:
# echo $VAR456
# echo ${VAR}456
123456
1.5.2 將命令結(jié)果作為變量值
# VAR=`echo 123`
# echo $VAR
123
# VAR=$(echo 123)
# echo $VAR
123
這里的反撇號等效于$(),都是用于執(zhí)行 Shell 命令。
1.6 雙引號和單引號
在變量賦值時,如果值有空格,Shell 會把空格后面的字符串解釋為命令:
# VAR=1 2 3
-bash: 2: command not found
# VAR="1 2 3"
# echo $VAR
1 2 3
# VAR='1 2 3'
# echo $VAR
1 2 3
看不出什么區(qū)別,再舉個說明:
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
單引號是告訴 Shell 忽略特殊字符,而雙引號則解釋特殊符號原有的意義,比如$、!。
1.7 注釋
Shell 注釋也很簡單,只要在每行前面加個#號,即表示 Shell 忽略解釋。
謝謝觀看,真心的希望能幫到您!
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: