Shell基礎(chǔ)知識

2018-06-08 17:06 更新

防偽碼:長風破浪會有時,直掛云帆濟滄海。

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)載!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號