Shell基礎(chǔ)知識(shí)

2018-06-08 17:06 更新

防偽碼:長(zhǎng)風(fēng)破浪會(huì)有時(shí),直掛云帆濟(jì)滄海。

1.1 l Shell  簡(jiǎn)介

Shell 是一個(gè) C 語(yǔ)言編寫(xiě)的腳本語(yǔ)言,它是用戶(hù)與 Linux 的橋梁,用戶(hù)輸入命令交給 Shell 處理,

Shell 將相應(yīng)的操作傳遞給內(nèi)核(Kernel),內(nèi)核把處理的結(jié)果輸出給用戶(hù)。

下面是處理流程示意圖:

Shell 既然是工作在 Linux 內(nèi)核之上,那我們也有必要知道下 Linux 相關(guān)知識(shí)。

Linux 是一套免費(fèi)試用和自由傳播的類(lèi) Unix 操作系統(tǒng),是一個(gè)基于 POSIX 和 UNIX 的多用戶(hù)、多任

務(wù)、支持多線(xiàn)程和多 CPU 的操作系統(tǒng)。

1983 年 9 月 27 日,Richard Stallman(理查德-馬修-斯托曼)發(fā)起 GNU 計(jì)劃,它的目標(biāo)是創(chuàng)建一

套完全自由的操作系統(tǒng)。為保證 GNU 軟件可以自由的使用、復(fù)制、修改和發(fā)布,所有的 GNU 軟件都

有一份在禁止其他人添加任何限制的情況下授權(quán)所有權(quán)利給任何人的協(xié)議條款,GNU 通用公共許可

證(GNU General Plubic License,GPL),說(shuō)白了就是不能做商業(yè)用途。

GNU 是"GNU is Not Unix"的遞歸縮寫(xiě)。UNIX 是一種廣泛使用的商業(yè)操作系統(tǒng)的名稱(chēng)。

1985 年,Richard Stallman 又創(chuàng)立了自由軟件基金會(huì)(Free Software Foundation,F(xiàn)SF)來(lái)為

GNU 計(jì)劃提供技術(shù)、法律以及財(cái)政支持。

1990 年,GNU 計(jì)劃開(kāi)發(fā)主要項(xiàng)目有 Emacs(文本編輯器)、GCC(GNU Compiler Collection,GNU 編

譯器集合)、Bash 等,GCC 是一套 GNU 開(kāi)發(fā)的編程語(yǔ)言編譯器。還有開(kāi)發(fā)一些 UNIX 系統(tǒng)的程序庫(kù)和

工具。

1991 年,Linuxs Torvalds(林納斯- 托瓦茲)開(kāi)發(fā)出了與 UNIX 兼容的 Linux 操作系統(tǒng)內(nèi)核并在

GPL 條款下發(fā)布。

1992 年,Linux 與其他 GUN 軟件結(jié)合,完全自由的 GUN/Linux 操作系統(tǒng)正式誕生,簡(jiǎn)稱(chēng) Linux。

1995 年 1 月,Bob Young 創(chuàng)辦 ACC 公司,以 GNU/Linux 為核心,開(kāi)發(fā)出了 RedHat Linux 商業(yè)版。

Linux 基本思想有兩點(diǎn):第一,一切都是文件;第二,每個(gè)軟件都有確定的用途。與 Unix 思想十分

相近。

l 1.2 Shell  基本分兩大類(lèi)

1.2.1 圖形界面 Shell(GUI Shell)

GUI 為 Unix 或者類(lèi) Unix 操作系統(tǒng)構(gòu)造一個(gè)功能完善、操作簡(jiǎn)單以及界面友好的桌面環(huán)境。

主流桌面環(huán)境有 KDE,Gnome 等。

1.2.2 命令行界面 Shell(CLI Shell)

CLI 是在用戶(hù)提示符下鍵入可執(zhí)行指令的界面,用戶(hù)通過(guò)鍵盤(pán)輸入指令,完成一系列操作。

在 Linux 系統(tǒng)上主流的 CLI 實(shí)現(xiàn)是 Bash,是許多 Linux 發(fā)行版默認(rèn)的 Shell。還有許多 Unix

上用的 Shell,例如 tcsh、csh、ash、bsh、ksh 等等。

1.3  第一個(gè) l Shell  腳本

本教程主要講解在大多 Linux 發(fā)行版下默認(rèn) Bash Shell。Linux 系統(tǒng)是 RedHat 下的 CentOS 操作系

統(tǒng),完全免費(fèi)。與其商業(yè)版 RHEL(Red Hat Enterprise Linux)出自同樣的源代碼,不同的是

CentOS 并不包含封閉源代碼軟件和售后支持。

用 vi 打開(kāi) test.sh,編寫(xiě):

# vi test.sh

#!/bin/bash

echo "Hello world!"

第一行設(shè)置運(yùn)行環(huán)境,第二行打印 Hello world!

寫(xiě)好后,開(kāi)始執(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 # ./在當(dāng)前目錄

Hello world!

方法 3:source 命令執(zhí)行,以當(dāng)前默認(rèn) Shell 執(zhí)行

# source test.sh

Hello world!

l 1.4 Shell  變量

1.4.1 系統(tǒng)變量

在命令行提示符直接執(zhí)行 env、set 查看系統(tǒng)或環(huán)境變量。env 顯示用戶(hù)環(huán)境變量,set 顯示 Shell

預(yù)先定義好的變量以及用戶(hù)變量。可以通過(guò) export 導(dǎo)出成用戶(hù)變量。

一些寫(xiě) Shell 腳本時(shí)常用的系統(tǒng)變量:

$SHELL

默認(rèn)Shell
$HOME
當(dāng)前用戶(hù)家目錄
$IFS內(nèi)部字段分隔符
$LANG默認(rèn)語(yǔ)言
$PATH默認(rèn)可執(zhí)行程序路徑
$PWD當(dāng)前目錄
$UID當(dāng)前用戶(hù)ID
$USER當(dāng)前用戶(hù)
$HISTSIZE歷史命令大小,可通過(guò)HISTTIMEFO 變量設(shè)置命令執(zhí)行時(shí)間
$RANDOM隨機(jī)生成一個(gè) 0 至 32767 的整數(shù)
$HOSTNAME 主機(jī)名


1.4.2 普通變量與臨時(shí)環(huán)境變量

普通變量定義:VAR=value

臨時(shí)環(huán)境變量定義:export VAR=value

變量引用:$VAR

下面看下他們之間區(qū)別:

Shell 進(jìn)程的環(huán)境變量作用域是 Shell 進(jìn)程,當(dāng) export 導(dǎo)入到系統(tǒng)變量時(shí),則作用域是 Shell 進(jìn)程

及其 Shell 子進(jìn)程。、

ps axjf 輸出的第一列是 PPID(父進(jìn)程 ID),第二列是 PID(子進(jìn)程 ID)

當(dāng) SSH 連接 Shell 時(shí),當(dāng)前終端 PPID(-bash)是 sshd 守護(hù)程序的 PID(root@pts/0),因此在當(dāng)

前終端下的所有進(jìn)程的 PPID 都是-bash 的 PID,比如執(zhí)行命令、運(yùn)行腳本。

所以當(dāng)在-bash 下設(shè)置的變量,只在-bash 進(jìn)程下有效,而-bash 下的子進(jìn)程 bash 是無(wú)效的,當(dāng)

export 后才有效。

進(jìn)一步說(shuō)明:再重新連接 SSH,去除上面定義的變量測(cè)試下

所以在當(dāng)前 shell 定義的變量一定要 export,否則在寫(xiě)腳本時(shí),會(huì)引用不到。

還需要注意的是退出終端后,所有用戶(hù)定義的變量都會(huì)清除。

在/etc/profile 下定義的變量就是這個(gè)原理,后面有章節(jié)會(huì)講解 Linux 常用變量文件。

1.4.3 位置變量

位置變量指的是函數(shù)或腳本后跟的第 n 個(gè)參數(shù)。

$1-$n,需要注意的是從第 10 個(gè)開(kāi)始要用花括號(hào)調(diào)用,例如${10}

shift 可對(duì)位置變量控制,例如:

#!/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 命令,位置變量個(gè)數(shù)就會(huì)減一,而變量值則提前一位。shift n,可設(shè)置向前移動(dòng)

n 位。

1.4.4 特殊變量

$0腳本自身名字
$?

返回上一條命令是

否執(zhí)行成功,0 為

執(zhí)行成功,非 0 則

為執(zhí)行失敗

$# 位置參數(shù)總數(shù)
$*

所有的位置參數(shù)被

看做一個(gè)字符串

$@

每個(gè)位置參數(shù)被看

做獨(dú)立的字符串

$$ 當(dāng)前進(jìn)程 PID
$!

上一條運(yùn)行后臺(tái)進(jìn)

程的 PID

1.5  變量引用

賦值運(yùn)算符示例
變量賦值
+= 兩個(gè)變量相加

# VAR=123

# echo $VAR

123

# VAR+=456

# echo $VAR

123456

Shell 中所有變量引用使用$符,后跟變量名。

有時(shí)個(gè)別特殊字符會(huì)影響正常引用,那么需要使用${VAR},例如:

# VAR=123

# echo $VAR

123

# echo $VAR_ # Shell 允許 VAR_為變量名,所以此引用認(rèn)為這是一個(gè)有效的變量名,故此返回

# echo ${VAR}

123

還有時(shí)候變量名與其他字符串緊礙著,也會(huì)誤認(rèn)為是整個(gè)變量:

# echo $VAR456

# echo ${VAR}456

123456

1.5.2 將命令結(jié)果作為變量值

# VAR=`echo 123`

# echo $VAR

123

# VAR=$(echo 123)

# echo $VAR

123

這里的反撇號(hào)等效于$(),都是用于執(zhí)行 Shell 命令。

1.6  雙引號(hào)和單引號(hào)

在變量賦值時(shí),如果值有空格,Shell 會(huì)把空格后面的字符串解釋為命令:

# 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ū)別,再舉個(gè)說(shuō)明:

# N=3

# VAR="1 2 $N"

# echo $VAR

1 2 3

# VAR='1 2 $N'

# echo $VAR

1 2 $N

單引號(hào)是告訴 Shell 忽略特殊字符,而雙引號(hào)則解釋特殊符號(hào)原有的意義,比如$、!。

1.7  注釋

Shell 注釋也很簡(jiǎn)單,只要在每行前面加個(gè)#號(hào),即表示 Shell 忽略解釋。

謝謝觀看,真心的希望能幫到您!

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)