01 . Shell詳細入門介紹及簡單應用

Shell簡介

Shell 是一個 C 語言編寫的腳本語言,它是用戶與 Linux 的橋樑,用戶輸入命令交給 Shell 解釋處理Shell 將相應的操作傳遞給內核(Kernel),內核把處理的結果輸出顯示到屏幕給用戶.

Shell分為兩類

圖形界面 Shell(GUI Shell)

GUI為 Unix 或者類 Unix 操作系統構造一個功能完善、操作簡單以及界面友好的桌面環境。主流桌面環境有 KDE,Gnome 等。

命令行界面 Shell(CLI Shell)

CLI是在用戶提示符下鍵入可執行指令的界面,用戶通過鍵盤輸入指令,完成一系列操作。

在 Linux 系統上主流的 CLI 實現是 Bash,是許多 Linux 發行版默認的 Shell。還有許多 Unix 上Shell,例如 tcsh、csh、ash、bsh、ksh 等。

如何查看系統支持的shell

一個系統中可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell,不同的shell可能支持的命令語法是不相同的,但是最常用的shell還是/bin/bash

cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
Shell命令基本格式

shell命令可以分為兩大類

  • 一類是內置命令,即系統自帶的命令,如ls,這是顯示文件夾下文件的命令;

  • 另一類是外置命令,如vi,是調用vi編輯器的命令,而vi編輯器是一個軟件,這類命令由獨立的程序實現的命令,用於對linux的擴展,是外置命令

shell命令格式如下

命令名 [選項] <參數1> <參數2>…
# 方括號內為可選的,命令可能有0個或者多個參數。
系統變量

在命令行提示符直接執行 env、set 查看系統或環境變量。env 顯示用戶環境變量,set 顯示 Shell預先定義好的變量以及用戶變量。可以通過 export 導出成用戶變量。

一些寫Shell腳本時常用的系統變量

$SHELL  默認 Shell
$HOME  當前用戶家目錄
$IFS  內部字段分隔符
$LANG  默認語言
$PATH  默認可執行程序路徑
$PWD  當前目錄
$UID  當前用戶 ID
$USER  當前用戶
$HISTSIZE  歷史命令大小,可通過 HISTTIMEFORMAT 變量設置命令執行時間
$RANDOM  隨機生成一個 0 至 32767 的整數
$HOSTNAME  主機名
普通變量與臨時環境變量

普通變量定義:VAR=value

臨時環境變量定義:export VAR=value

變量引用:$VAR

下面看下他們之間區別:

Shell 進程的環境變量作用域是 Shell 進程,當 export 導入到系統變量時,則作用域是 Shell 進程及其 Shell 子進程。

Shell 進程的環境變量作用域是 Shell 進程,當 export 導入到系統變量時,則作用域是 Shell 進程及其 Shell 子進程。

ps axjf 輸出的第一列是 PPID(父進程 ID),第二列是 PID(子進程 ID)當SSH 連接 Shell 時,當前終端 PPID(-bash)是 sshd 守護程序的 PID(root@pts/0),因此在當前終端下的所有進程的 PPID 都是-bash 的 PID,比如執行命令、運行腳本。

所以當在-bash 下設置的變量,只在-bash 進程下有效,而-bash 下的子進程 bash 是無效的,當export 後才有效。

進一步說明:再重新連接 SSH,去除上面定義的變量測試下所以在當前 shell 定義的變量一定要 export,否則在寫腳本時,會引用不到。

還需要注意的是退出終端後,所有用戶定義的變量都會清除。

在/etc/profile 下定義的變量就是這個原理.

位置變量

位置變量指的是函數或腳本後跟的第 n 個參數。

1−1−n,需要注意的是從第 10 個開始要用花括號調用,例如${10}

shift 可對位置變量控制,例如:

#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"

sh test.sh 1 2 3
1: 1
2: 3
3: 
# 每執行一次 shift 命令,位置變量個數就會減一,而變量值則提前一位。shift n,可設置向前移動n位。
特殊變量
$0  # 腳本自身名字
$?  # 返回上一條命令是否執行成功,0 為執行成功,非 0 則為執行失敗
$#  # 位置參數總數
$*  # 所有的位置參數被看做一個字符串
$@  # 每個位置參數被看做獨立的字符串
$$  # 當前進程 PID
$!  # 上一條運行後台進程的 PID
變量引用
賦值運算符 示例
= 變量賦值
+= 兩個變量相加
自定義變量與引用
a=123
echo $a
123

a+=456
echo $a
123456

# Shell 中所有變量引用使用$符,後跟變量名

# 有時個別特殊字符會影響正常使用,就需要使用${a},例如
[root@redis ~]# b=123
[root@redis ~]# echo $b
123
[root@redis ~]# echo ${b}
123
# 有時個別特殊字符會影響正常引用,那麼需要使用${VAR}
[root@redis ~]# echo $b123

[root@redis ~]# echo ${b}123
123123


# 將命令結果作為變量值
[root@redis ~]# c=`echo 123`
[root@redis ~]# echo $c
123
[root@redis ~]# c=$(echo 123)
[root@redis ~]# echo $c
123

# 這裡的反撇號等效於$(),都是用於執行 Shell 命令。

# 單引號和雙引號
[root@redis ~]# d=1
[root@redis ~]# d="1 2 $d"
[root@redis ~]# echo $d
1 2 1
[root@redis ~]# c=1
[root@redis ~]# c='1 2 $c'
[root@redis ~]# echo $c
1 2 $c
# 單引號是告訴 Shell 忽略特殊字符,而雙引號則解釋特殊符號原有的意義,比如$ 、 !。
shell命令小知識

1.shell自動補齊和歷史記錄

shell會在用戶輸入命令前幾個字母后按 鍵自動補齊,如果有多個候選命令會顯示出全部命令。
shell會自動記錄用戶使用的命令,用戶可以按 上 下 鍵 來查看。

2.shell提示符

shell提示符有兩種,一種是 $結尾,為普通用戶權限下的提示符號,一種是#結尾,為管理員權限,用戶可以用su命令切換用戶,如下圖:

3.輸入輸出重定向

shell命令是控制台命令,使用標準輸入和輸出設備,即從鍵盤接受輸入,將結果顯示在顯示器上。重定向可以將shell的輸入輸出重定向到文件或設備。
輸入重定向符號為」<」,輸出重定向符號為」>」和」>>」。如果shell命令 「X」在執行過程中,需要從控制台獲得數據,那麼執行」X < file」可以從file文件中獲得所需數據。如果X在執行過程中產生數據,可以用 「X > file」和」X >> file」將結果輸入到文件。」>」為覆蓋輸入,」>>」為追加輸入

4.管道

linux系統中,管道是一種先進先出的單數據通道,利用管道符號」|」可以將多個命令組合到一起,把一個命令的輸出傳遞給下一個命令作為輸入,最終得到經過多個命令一次處理的結果。如,用ll和grep結合來查找當前目錄是否有這個文件:

什麼是Shell腳本

腳本就是shell命令組成的文件,這些命令都是可執行程序的名字,腳本不用編譯即可通過解釋器解釋運行。
 它是一種解釋型語言,我們可以用shell腳本操存執行動作,用腳本判定命令的執行條件,用腳本來實現動作的批量執行

Shell簡單使用

腳本開頭

為了便於腳本的使用者可以快捷的了解到腳本的用途與其使用的解釋器,通常我們需要在腳本的開頭加上注釋。

#!/bin/bash		 腳本使用的解釋器,通常用幻數「#!」指定
# Autho:				腳本作者
# Create_date		腳本創作時間
# Mail:					腳本作者聯繫方式
# Description:	腳本作用解釋
# Version:			腳本的版本
腳本內容

在shell腳本中可以出現任何系統命令,輸入你想要執行的命令即可,我們創建一個hello.sh

cat hello.sh
#!/bin/bash		 腳本使用的解釋器,通常用幻數「#!」指定
# Autho:				腳本作者
# Create_date		腳本創作時間
# Mail:					腳本作者聯繫方式
# Description:	腳本作用解釋
# Version:			腳本的版本
echo hello
shell腳本的執行方法

首先我們給腳本執行權限

chmod +x 腳本路徑/腳本名

執行方式1: 輸入腳本的絕對路徑或者相對路徑

# 注意: 如果不給+x權限是不能這種方式執行腳本的
# 絕對路徑
/root/test.sh 
hello

# 相對路徑
./test.sh 
hello

執行方式2: sh +腳本

sh /root/test.sh
hello

執行方式3: source + 腳本

source /root/test.sh
hello

執行方式4: . + 腳本

 . test.sh 
hello

區別

# 第一種和第二種會新打開一個bash,不同bash中的變量無法共享,
# 第三種和第四種是直接使用當前運行環境作為解釋器運行環境