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中的變數無法共享,
# 第三種和第四種是直接使用當前運行環境作為解釋器運行環境