兄弟連Linux(八)--Shell基礎
1、Shell概述
1.1 Shell是什麼
Shell是一個命令直譯器,它為使用者提供了一個向Linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止,甚至是編寫一些程式。
Shell還是一個功能相當強大的程式語言,易編寫,易除錯,靈活性較強。Shell是解釋執行的指令碼語言,在Shell中可以直接呼叫Linux系統命令。
1.2 Shell的分類
Bourne Shell:從1979年其Unix就開始使用,Bourne Shell的主檔名為sh。
C Shell:C Shell主要在BSD版的Unix系統中使用,其餘發和C語言相類似而得名。
Shell的兩種主要語法型別有Bourne和C,這兩種語法彼此不相容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括csh、tcsh
Bash:與sh建甌讓,現在使用的Linux就是使用Bash作為使用者的基本Shell。
1.3 Linux支援的Shell
/etc/shells
2、Shell指令碼的執行方式
2.1 echo 輸出命令
$ echo -e [輸出內容]
-e 支援反斜線控制的字元轉換
\\ 輸出\本身
\a 輸出警告音
\b 退格鍵,也就是向左刪除鍵
\c 取消輸出行末的換行符。和“-n”選項一致
\e ESCAPE鍵
\f 換頁符
\n 換行符
\r 回車鍵
\t 製表符,也就是Tab鍵
\v 垂直製表符
\0nnn 按照八進位制ASCII碼輸出字元。其中0位數字0,nnn是三位八進位制數
\xhh 按照十六進位制ASCII碼輸出字元。其中hh是兩位十六進位制數
$ echo -e “ab\bc” 刪除左側字元
$ echo -e “a\tb\tc\nd\te\tf” 製表符與換行符
$ echo -e “\x61\t\x62\t\x63\n\x64\t\x65\t\x66” 按照十六進位制ASCII碼也同樣可以輸出
$ echo -e “\e[1;31m abcd \e[0m” 輸出顏色:30m=黑色,31m=紅色,32m=綠色,33m=黃色,34m=藍色,35m=洋紅,36m=青色,37m=白色
2.2 第一個指令碼
$ vi hello.sh
#!/bin/bash
#The first program
echo -e “Mr. Shen Chao is the most honest man in LampBrother”
2.3 指令碼執行
賦予執行許可權,直接執行
chmod 755 hello.sh
/root/sh/hello 通過絕對路徑方式執行
./hello.sh 通過在目錄中,輸入./檔名方式執行
通過Bash呼叫執行指令碼
Bash hello.sh
3、Bash的基本功能
3.1 歷史命令與命令不全
3.1.1 歷史命令
$ history -cw [歷史命令儲存檔案]
-c 清空歷史命令
-w 把快取中的歷史命令寫入歷史命令儲存檔案 ~/.bash_history
歷史命令預設會儲存1000條,可以在環境變數配置檔案/etc/profile中進行修改
歷史命令的呼叫
使用上、下箭頭呼叫以前的歷史命令
使用“!n”重複執行第n條歷史命令
使用“!!”重複執行上一條命令
使用“!字串”重複執行最後一條以該字串開頭的命令
3.1.2命令與檔案補全
在Bash中,命令與檔案補全是非常方便與常用的功能,我們只要在輸入命令或檔案時,按“Tab”鍵就會自動進行不全。
3.2 命令別名與常用快捷鍵
3.2.1 命令別名
$ alias 別名=‘原命令’ 設定命令別名
$ alias 查詢命令別名
命名執行順序
第1順位執行用絕對路徑或相對路徑執行的命令
第2順位執行別名
第3順位執行Bash內部命令
第4順位執行按照$PATH環境變數定義的目錄查詢順序找到的第一個命令
讓別名永久生效
$ vi /root/.bashrc
刪除別名
$ unalias 別名
3.2.2 Bash常用快捷鍵
Ctrl + A 把游標移動到命令列開頭。如果我們輸入的命令過長,想要把游標移動到命令列開頭時使用
Ctrl + E 把游標移動到命令列結尾
Ctrl + C 強制終止當前的命令
Ctrl + L 清屏,相當於clear命令
Ctrl + U 刪除火箭且游標之前的命令。我輸入了一行很長的命令,不用使用退格鍵一個一個字元刪除,使用這個快捷鍵就會更加方便
Ctrl + K 刪除或剪下游標之後的內容
Ctrl + Y 黏貼Ctrl+U或Ctrl+K剪下的內容
Ctrl + R 在歷史命令中搜索,按下Ctrl+R之後,就會出現搜尋介面,只要輸入搜尋內容,就會從歷史命令中搜索
Ctrl + D 退出當前中斷
Ctrl + Z 暫停,並放入後臺。這個快捷鍵牽扯工作管理的內容,我們在系統管理章節詳細介紹
Ctrl + S 暫停螢幕輸出
Ctrl + Q 恢復螢幕輸出
3.3 輸入輸出重定向
3.3.1 標準輸入輸出
鍵盤 /dev/stdin 0 標準輸入
顯示器 /dev/sdtout 1 標準輸出
顯示器 /dev/sdterr 2 標準錯誤輸出
3.3.2 輸出重定向
標準輸出重定向
命令 > 檔案 以覆蓋的方式,把命令正確輸出輸出到指定檔案或裝置當中
命令 >> 檔案 以追加的方式,把命令的正確輸出輸出到指定檔案或裝置當中
標準錯誤輸出重定向
錯誤命令 2> 檔案 以覆蓋的方式,把命令的錯誤輸出輸出到指定的檔案或裝置當中
錯誤命令 2>> 檔案 以追加的方式,把命令的錯誤輸出輸出到指定的檔案或裝置當中
正確輸出和錯誤輸出同時儲存
命令 > 檔案 2>&1 以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中
命令 >> 檔案 2>&1 以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中
命令 &> 檔案 以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中
命令 &>> 檔案 以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中
命令>>檔案1 2>>檔案2 把正確的出書追加到檔案1當中,把錯誤的輸出追加到檔案2當中
3.3.3 輸入重定向用的不多
$ wc -cwl [檔名]
-c 統計位元組數
-w 統計單詞數
-l 統計行數
命令<檔案 把檔案作為命令的輸入
3.4 多命令順序執行與管道符
3.4.1 多命令順序執行
; 命令1;命令2 多個命令順序執行,命令之間沒有任何邏輯聯絡
&& 命令1&&命令2 邏輯與;當命令1正確執行,則命令2才會執行;當命令1執行不正確,則命令2不會執行
|| 命令1||命令2 邏輯或;當命令1執行不正確,則命令2才會執行;當命令1正確執行,則命令2不會執行
$ ls ; data ; cd/user ; pwd
$ dd if=輸入檔案 of=輸出檔案 bs=位元組數 count=個數
if=輸入檔案 指定原始檔或源裝置
of=輸出檔案 指定目標檔案或目標裝置
bs=位元組數 指定一次輸入/輸出多少位元組,即把這些位元組看成一個數據塊
count=個數 指定輸入/輸出多少個數據塊
$ date ; dd if=/dev/zero of=root/testfile bs=1k count=100000 ; date
$ ls anaconda-ks.cfg && echo yes
$ ls /root/test || echo no
$ 命令 && echo yes || echo no 判斷這條命令是否正確
3.4.2 管道符
$ 命令1 | 命令2 命令1的正確輸出作為命令2的操作物件
$ ll -a /etc/ | more
$ netstat -an | grep “ESTABLISHED”
$ grep -inv “搜尋內容” 檔名
-i 忽略大小寫
-n 輸出行號
-v 反向查詢
--color=auto 搜尋出的關鍵字用顏色表示
3.5 萬用字元與其他特殊符號
3.5.1 萬用字元
? 匹配一個任意字元
* 匹配0個或任意多個任意字元,也就是可以匹配任何內容
[] 匹配中括號中任意一個字元。例如:[abc]代表一定匹配一個字元,或者是a,或者是b,或者是c。
[-] 匹配中括號中任意一個字元,-代表一個範圍。例如[a-z]代表匹配一個小寫字母
[^] 邏輯非,表示匹配不是中括號內的一個字元。例如:[^0-9]代表匹配一個不是數字的字元
$ cd /tmp/
$ rm -rf *
$ touch abc
$ touch abcd
$ touch 012
$ touch 0abc
$ ls ?abc
$ ls [0-9]*
$ ls [^0-9]*
3.5.2 Bash 中其他特殊符號
‘’ 單引號。在單引號中所有的特殊字元,如“$”和“`”(反引號)都沒有特殊含義
“” 雙引號。在雙引號中特殊符號都沒有特殊含義,但是“$”、“`”和“\”是例外,擁有“呼叫變數的值”、“引用命令”、和“轉義符”的特殊含義
`` 反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和$()作用一樣,不過推薦使用$(),因為反引號容易看錯
$() 和反引號作用一樣,用來引用系統命令
# 在Shell指令碼中,#開頭的行代表註釋
$ 用於呼叫變數的值,如需要呼叫變數name的值時,需要用$name的方式得到變數的值
\ 轉義符。跟在“\”之後的特殊符號將失去特殊含義,變成普通字元。如\$將輸出“$”符號,而不當做是變數引用
單引號與雙引號
$ name=sc
$ echo ‘$name’
$ echo “$name”
$ echo ‘$(date)’
$ echo ‘$(date)’
反引號與$()
$ echo `ls`
$ echo $(date)
4、Bash的變數
4.1 使用者自定義變數
4.1.1 什麼是變數
變數是計算機記憶體的單元,其中存放的值可以改變。當Shell指令碼需要儲存一些資訊時,入一個檔名或一個數字,就把它存放在一個變數中。每個變數有一個名字,所以很用以引用它。使用變數可以儲存有用資訊,是系統獲知使用者相關設定,變數也可以用於儲存暫時資訊。
4.1.2 變數設定規則
變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。如果變數名是“2name”則是錯誤的
在Bash中,變數的預設型別都是字串型,如果要進行數值計算,則必需修改指定變數型別為數值型。
變數用等號連線值,等號左右兩側不能有空格
變數的值如果有空格,需要使用單引號或雙引號包括
在變數的值中,可以使用“\”轉義符
如果需要增加變數的值,那麼可以進行變數值的疊加,不過變數需要用雙引號包括“$變數名”或用${變數名}包含
如果是把命令的節骨哦作為變數值賦予變數,則需要使用反引號或$()包含命令
環境變數名建議大寫,便於區分
4.1.3 變數分類
使用者自定義變數
環境變數:這種變數中主要儲存的是和系統操作環境相關的資料
位置引數變數:這種變數主要是用來向腳本當中傳遞引數或資料的,變數名不能自定義,變數作用是固定的
預定義變數:是Bash 中已經定義好的變數,變數名不能自定義,變數作用也是固定的
4.1.4本地變數
變數定義
$ name=”shenchao”
變數疊加
$ aa=123
$ aa=”$aa”456
$aa=${aa}789
變數呼叫
$ echo $name
變數檢視
$ set
變數刪除
$ unset name
4.2 環境變數
4.2.1 環境變數是什麼
使用者自定義變數只在當前的Shell中生效,而環境變數會在當前Shell和這個Shell的所有子Shell當中生效。如果把環境變數寫入相應的配置檔案,那麼這個環境變數就會在所有的Shell中生效。
4.2.2設定環境變數
export 變數名=變數值 申明變數
env 查詢變數
unset 變數名 刪除變數
4.2.3 系統常見環境變數
PATH:系統查詢命令的路徑
$ echo $PATH
/usr/lib/qt-3.3/bin:usr/local/sbin:/usr/local/bin:/sbin/bin:/usr/sbin:/usr/bin:/root/bin
$ PATH=”$PATH”:/root/sh PATH變數疊加
PS1:定義系統提示符的變數
\d 顯示日期,格式為“星期 月 日”
\h 顯示簡寫主機名。如預設主機名為“localhost”
\t 顯示24小時制時間,格式為“HH:MM:SS”
\T 顯示12小時制時間,格式為“HH:MM”
\A 顯示24小時制時間,格式為“HH:MM”
\u 顯示當前使用者名稱
\w 顯示當前所在目錄的完整名稱
\W 顯示當前所在目錄的最後一個目錄
\# 執行的第幾個命令
\$ 提示符。如果是root使用者會顯示提示符為“#”,如果是普通使用者會顯示提示符為“$”
$ PS1=’[\[email protected]\t \W]\$ ’
$ PS1=’[\[email protected]\@ \h \# \W]\$ ’
$ PS1=’[\u$\h \W]\$’
4.3 位置引數變數
4.3.1 位置引數變數
$n n位數字,$0代表命令本身,$1-$9代表第1到第9個引數,10以上的引數需要用大括號包含,如${10}
$* 這個變數代表命令列中所用引數,$*把所有的引數看成一個整體
[email protected] 這個變數也代表命令列中所有引數,不過[email protected]把每個引數區別對待
$# 這個變數代表命令列中所有引數的個數
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2)) 變數sum的值時num1和num2的和
echo $sum 達因變數sum的值
#!/bin/bash
echo “A total of $# parameters” 使用$#代表所有引數的個數
echo “The parameters is:$*” 使用$*代表所有的引數
echo “The parameters is [email protected]” 使用[email protected]也代表所有引數
$*和[email protected]的區別
#!/bin/bash
for i in “$*” $*中的所有引數看成一個整體,所以這個for迴圈只迴圈一次
do
echo”The parameters is: $i”
done
x=1
for y in “[email protected]” [email protected]中每個引數看成是獨立的,所以“[email protected]”有幾個引數,就迴圈幾次
do
echo”The parameter$x is :$y”
x=$(($x + 1))
done
4.4 預定義變數
4.4.1 預定義變數
$? 最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己決定),則證明上一個命令執行不正確
$$ 當前程序的程序號(PID)
$! 後臺執行的最後一個程序的程序號(PID)
#!/bin/bash
#Author:shenchao(E-mail:[email protected])
echo “The current process is $$” 輸出當前程序的PID;這個PID就是variable.sh這個指令碼執行的,生成的程序的PID
find /root -name hello.sh & 使用find命令在root目錄下查詢hello.sh檔案;符號&的意思是把命令放入後臺執行,工作管理我們在系統管理章節會詳細介紹
echo “The last one Daemon process is $!”
4.4.2 接收鍵盤輸入
$ read -ptns [變數名]
-p “提示資訊” 在等待read輸入時,輸出提示資訊
-t 秒數 read命令會一直等待使用者輸入,使用此選項可以指定等待時間
-n 字元數 read命令只接受指定的字元數,就會執行
-s 隱藏輸入的資料,適用於機密資訊的輸入
5、Bash的運算子
5.1 數值運算與運算子
5.1.1 declare宣告變數型別
$ declare [+/-] [選項] 變數名
- 給變數設定型別屬性
+ 取消變數的型別屬性
-i 將變數宣告為整數型(integer)
-x 將變數宣告為環境變數
-p 顯示指定變數的被宣告的型別
5.1.2 數值運算--方法1
$ aa=11 給變數aa和bb賦值
$ bb=22
$ declare -i cc=$aa+$bb
方法2:expr或let數值運算工具
$ aa=11 給變數aa和bb賦值
$ bb=22
$ dd=$(expr $aa + $bb) dd的值時aa和bb的和。注意“+”好左右兩側必須有空格
方法3:“$((運算式))”或$[運算式] 推薦使用!!
$ aa=11
$ bb=22
$ ff=$(($aa+$bb))
$ gg=$[$aa+$bb]
5.1.3 運算子
13 -,+ 單目負、單目正
12 !,~ 邏輯非、按位取反或補碼
11 *,/,% 乘、除、取模
10 +,- 加、減
9 << , >> 按位左移、按位右移
8 < =, > =, <, > 大於或小於、大於或等於、小於、大於
7 ==, != 等於、不等於
6 & 按位與
5 ^ 按位異或
4 | 按位或
3 && 邏輯與
2 || 邏輯或
1 =, +=, -
=,*-,/=,%=,&=,^=, 賦值、運算且賦值
|=,<<=,>>=
5.2 變數測試與內容替換
變數置換方式 |
變數y沒有設定 |
變數y為空值 |
變數y設定值 |
x=${y-新值} |
x=新值 |
x為空 |
x=$y |
x=${y:-新值} |
x=新值 |
x=新值 |
x=$y |
x=${y+新值} |
x為空 |
x=新值 |
x=新值 |
x=${y:+新值} |
x為空 |
x為空 |
x=新值 |
x=${y=新值} |
x=新值 y=新值 |
x為空 y值不變 |
x=$y y值不變 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不變 |
x=${y?新值} |
新值輸入到標準錯誤輸出(就是螢幕) |
x為空 |
x=$y |
x=${y:?新值} |
新值輸出到標準錯誤輸出 |
新值輸出到標準錯誤輸出 |
x=$y |
6、環境變數配置檔案
6.1 環境變數配置檔案簡介
6.1.1 source命令
$ source 配置檔案
或
$. 配置檔案
6.1.2 環境變數配置檔案簡介
環境變數配置檔案中主要是定義對系統的操作環境生效的系統預設環境變數,比如PATH、HISTSIZE、PS1、HOSTNAME等預設環境變數。
/etc/profile
/etc/profiled.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
6.2 環境變數配置檔案作用
/etc/profile的作用宣告環境變數,呼叫/etc/profile.d/*.sh檔案
USER變數
LOGNAME變數
MAIL變數
PATH變數
HOSTNAME變數
HISTSIZE變數
umask
呼叫/etc/profile.d/*.sh檔案(colorls.sh cvs.sh glib2.sh lang.sh(定義系統語言,呼叫/etc/systemconfig/i18n) less.sh qt.sh vim.sh)
/etc/sysconfig/i18n 編碼:UTF-8
~/.bash_profile 呼叫~/.bashrc 新增/bin到PATH中
~/.bashrc 別名呼叫/etc/bashrc
/etc/bashrc 命令提示符
6.3 其他配置檔案和登入資訊
6.3.1 登出時生效的環境配置檔案
~/.bash.logout
6.3.2 其他配置檔案
~/bash_history
6.3.3 Shell登入資訊
本地終端歡迎資訊: /etc/issue
\d 顯示當前系統資訊
\s 顯示作業系統名稱
\l 顯示登入的終端號,這個比較常用
\m 顯示硬體體系結構,如i386,i686等
\n 顯示主機名
\o 顯示域名
\r 顯示核心版本
\t 顯示當前系統時間
\u 顯示當前登入使用者的序列號
遠端終端歡迎資訊: /etc/issue.net
轉移符號在/etc/issue.ent檔案中不能使用
是否顯示此歡迎資訊,由ssh的配置檔案/etc/ssh/sshd_config決定,加入“Banner/etc/issue.net”行才能顯示,(記得重啟SSH服務)
登陸後歡迎資訊: /etc/motd
不管是本地登入,還是遠端登入,都可以顯示此歡迎資訊