本次記錄bash shell基礎知識及bash變量功能,bash操作環境的配置內容,涉及解釋什麼是shell?、bash變量的定義和引用、怎樣讀入與設定bash的環境配置文件等。
Shell的基本概念
1. Shell是什麼?
Linux系統由3個重要部分組成:
w 內核(kernel)
w Shell
w 應用程序
內核真正在控制着計算機系統上的各種硬件與軟件。功能包括進程管理、內存管理、設備管理、文件系統管理等等。
內核相當抽象,使用者不易和它直接通信,因此需要一個良好的接口,使得操作時更方便,而Shell就是一個連接系統核心與操作者之間的溝通接口。Shell用來負責接收使用者輸入的指令,然後把指令解譯成內核能夠理解的形式,傳給內核執行工作,並且將結果傳回到默認輸出設備。
簡單言之,我們可以通過Shell程序來操作各種應用程序,讓這些應用程序調用內核來運行所需的工作。
不只是Linux有Shell,其他操作系統也有,如DOS的COMMAND.COM、Windows和Mac OS的GUI圖形界面接口都Shell的一種,只不過Shell表現方式不一樣而已。
只要能夠操作應用程序的接口都能夠稱爲Shell。狹義的Shell指的是CLI方式的軟件,如bash、csh、zsh等。廣義的Shell則包括GUI界面的軟件。
2. Shell的簡單歷史
第一個重要的Shell是Bourne Shell。如此命名是爲了紀念此Shell的發明者Steven Bourne,簡稱sh。
第一個廣爲流行使用的Shell是由柏克萊大學的Bill Joy設計依附於BSD版的UNIX系統中的Shell,因爲此語法有點類似C語言,所以才得名爲C Shell,簡稱csh。
Linux distribution默認使用這個版本稱爲”Bourne Again Shell”(簡稱bash),這個Shell是Bourne Shell的增強版本,也是基於GNU的架構下發展出來的。
查看Linux系統可以使用的Shell:
[root@www ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
Bash shell是一種命令解釋器,通過對程序做語法分析後,確定哪些是指令,哪些是參數,哪些是數據,並交給內核處理完成。
3. Bash shell的功能
1) 命令記憶能力(history)
2) 命令與文件補全功能
3) 命令別名設置功能(alias)
4) 工業控制(job control)能力
5) 程序設計的能力(程序腳本)
Bash Shell的變量功能
1. 什麼是變量?變量類型有哪些?
變量就是存儲可變數據的內存空間(名稱空間)。
bash環境有哪幾種變量:
一、按照其作用範圍及功能劃分
1) 環境變量
其作用範圍爲當前shell進程及其子進程
2) 本地變量
其作用範圍爲當前shell進程
3) 局部變量
其作用範圍僅爲當前shell進程中只有特定程序可以訪問的(通常爲函數)
4) 位置參數變量
在向腳本傳遞參數時,引用此變量來獲取參數
5) 特殊變量
Bash內建的,用來保存特殊的相關值
二、根據變量定義方式不同劃分:
1) 內建變量
無須定義,可直接調用
2) 自定義變量
使用者自己命名,由bash自動分配空間
三、bash變量值類型有數值型、字符型兩種。
數值:整數型、浮點數型
字符:ASCII
四、語言對變量類型的支持不同:強類型和弱類型
bash變量屬於弱類型,一般來說無須事先聲明就可以調用。由於弱類型中變量類型不嚴格區分,除非使用內置命令declare特別指定變量的形態。bash Shell默認把任何存儲在變量中的值,皆視爲以字符組成的“字符串”。
設定變量值後,該變量值只在當前的Shell環境中有效。也就是說,每一個Shell環境都會維護一份它們自己的變量空間,彼此互不影響。
2. 變量的命名與定義
a. 變量名稱,可使用英文字母、數字及下劃線組成,但須字母開頭,不可用數字,注意區分字母大小寫。
變量命名時最好賦予意義,使得日後維護程序代碼,較容易瞭解其用途。
b. 定義變量,或者說變量賦值,方法比較簡單。
格式:變量名稱=值
如:myname=tom
如果變量值爲字符串的話,用雙引號或單引號括起來。
Mystr=“Hello world!”或‘Hello world!’
3. 變量的設置規則
變量值指得是變量名稱所代表的內存空間中所存儲的內容。
取變量值的方法,是在變量名稱前加$,即:
$變量名稱 或 ${變量名稱}
接着,用echo命令把變量的值顯示出來
myname=allen
echo $myname
echo ${myname}
請注意變量在設置時,還需符合某些規定:
(1) 變量內容若有空格符可使用雙引號“”或單引號‘’將變量內容結合起來
雙引號內的特殊字符如$等,可以保有原本的特性。
var=”lang is $LANG”
echo $var
lang is en_US
單引號內的特殊字符則僅爲一般字符(純文本)形成一個所見即所得的字符串
var=’lang is $LANG’
echo $var
lang is $LANG
(2) 若變量的後面接有其他英文單詞或下劃線,須用{}隔開$和變量名稱,否則bash shell 無法正確判斷變量。
yourname=ken
echo hi, ${yourname}Mmmm…
要是不用{},變成echo hi, $yournameMmmm…,bash shell會以爲要取用的是yournameMmmm變量的內容,但該變量並未定義過,故其內容爲空。
(3) $放在變量名稱之前,表示要取變量值,但如果要顯示$這個符號,得使用轉義字符”\”將其變成一般字符。
n=0
echo \$n 或 echo ‘$n’
$n
(4) 若需引用其他命令,可使用反單引號 `COMMAND` 或 $(COMMAND)
vesion=$(uname -r)
echo $version
2.6.32-573.el6.x86_64
(5) 若該變量爲了增加變量內容時,則可用$變量名稱或${變量}累加內容
PATH=”$PATH”:/home/bin
(6) 若該變量需要在其他子進程執行,export可以向後面的shell傳遞變量的值
export myname
4. 取消與清空變量
(1) 取消變量就是把變量由變量空間中釋放。
取消變量的方法:使用unset
unset 變量名稱
unset –v 變量名稱
選項-v表示要取消的是變量
unset –f 函數名稱
選項-f表示要取消的是函數
(2) 清空變量
unset不但把變量的內容取消,而且讓變量不存在。而清空變量是把變量的內容刪除,其值爲null,但該變量仍然存在(內存空間)。
變量名稱=
5. 變量的有效範圍
變量一旦設定之後,僅在各自的shell環境中有效,它無法影響其他shell環境中的變量。
環境變量=全局變量
自定義變量=局部變量
如果使父進程中定義的變量可以被子進程引用的話,可使用export VAR_NAME命令。
當子shell產生時,它會繼承父shell的環境變量等條件,因此,只要變量成爲環境變量,就能爲子shell取用。
如果希望shell script在現行shell環境中執行,可使用 . Script_FILE或source Script_FILE。
Linux環境變量能提升使用者shell體驗。很多程序和腳本都通過環境變量來獲取系統信息、存儲臨時數據和配置信息。
1) 什麼是環境變量
bash shell用一個稱作環境變量(environment variables)的特性來存儲有關shell會話和工作環境的信息。
在bash shell中環境變量分爲兩類:全局變量和局部變量
2) 全局環境變量
全局環境變量不僅對shell會話可見,對所有shell創建的子進程也可見。
系統環境變量一律使用全部大寫字母以區別於普通用戶的環境變量。
查看當前全局環境變量,可用env或printenv命令
[root@www ~]# env
HOSTNAME=www.contoso.com <--這臺主機的主機名
SELINUX_ROLE_REQUESTED=
TERM=xterm <--這個終端使用的環境是什麼類型
SHELL=/bin/bash <--目前環境shell類型
HISTSIZE=1000 <--記錄命令歷史條數
SSH_CLIENT=172.16.10.100 50761 2222
SELINUX_USE_CURRENT_RANGE=
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
USER=root <--目前環境中的使用者名稱
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root <--該用戶所取用的mailbox位置
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin <--執行文件命令查找路徑
PWD=/root <--目前用戶所在的目錄
LANG=zh_CN.UTF-8 <--語系
SELINUX_LEVEL_REQUESTED=
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root <--該用戶的家目錄
LOGNAME=root <--登錄主機的用戶名稱
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=172.16.10.100 50761 172.16.10.101 2222
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
G_BROKEN_FILENAMES=1
_=/bin/env
3) 局部環境變量
它只能在定義它們的進程中可見。
查看所有變量(含環境變量與自定義變量),可用set命令
Bash Shell的操作環境
我們在登錄Linux主機的時候,屏幕會出現一些說明文件,比如版本之類的信息,還有用戶一些信息或歡迎文字。此外我們習慣的環境變量、命令別名等是否可以登錄就主動幫我們設置好了。此外這些設置值又分爲系統全局設置值與個人喜好設置值。
1. 路徑與命令查找順序
基本上命令運行的順序可以這樣看:
1. 以相對/絕對路徑執行命令,例如“/bin/ls”或“./ls”;
2. 由alias找到命令來執行;
3. 由bash內置的(builtin)命令來執行;
4. 通過$PATH這個變量的順序找到的第一個命令執行。
如果想要了解命令查找的順序,其實通過type –a COMMAND也可以查詢得到。
2. bash的登錄與歡迎信息
1) /etc/issue配置文件
其內容顯示在本地tty1-tty6沒有登錄的情況下login提示符之前的信息。
issue內的各代碼意義:
\d: 顯示本地端日期
\t: 顯示本地端時間
\l: 顯示第幾個終端機接口
\m: 顯示硬件的等級(i386/i486/i586/i686…)
\n: 顯示主機網絡名稱
\o: 顯示domain name
\r: 顯示操作系統發行版本(相當於uname -r)
\s: 操作系統名稱
\v: 操作系統版本
CentOS release 6.7 (Final) (Terminal: \l)
Date: \d \t
The Server Kernel is \r on an \m
Welcome to Product Enviroment...
1) /etc/issue.net配置文件
此文件是提供給telnet遠程登錄程序用的。
2) /etc/motd配置文件
其內容顯示在本地tty1-tty6用戶成功登錄系統之後的信息。
/etc/motd即messageoftoday(布告欄信息),每次用戶登錄時,/etc/motd文件的內容會顯示在用戶的終端。系統管理員可以在文件中編輯系統活動消息,例如:管理員通知用戶系統何時進行軟件或硬件的升級、何時進行系統維護等。
3. bash的環境配置文件
因爲系統中有一些環境配置文件的存在,讓bash在啓動時直接讀取這些配置文件,以規劃好bash的操作環境。而這些配置文件可分爲系統全局配置文件以及用戶自定義配置文件。
當用戶登錄Linux系統啓動一個bash shell時,默認情況下bash會在幾個配置文件中查找指令。bash檢查的配置文件取決於啓動bash shell方式。
啓動bash shell有3種方式:
1) 登錄時當做默認登錄shell
2) 作爲非登錄shell的交互式shell
3) 作爲運行腳本的非交互shell
a. 登錄shell
當用戶通過tty1-tty6登錄Linux系統時,bash shell會作爲login shell啓動。login shell會從4個不同的配置文件裏讀取命令。其處理次序:
/etc/profile 系統默認的bash shell的主配置文件,系統上每個用戶登錄時都會執行此文件
~/.bash_profile或~/.bash_login或~/.profile 提供用戶專屬的配置文件來定義用戶專有的環境變量。大多數Linux發行版只用這3個配置文件中的一個,而讀取的順序則是依照上面的順序。
/etc/profile.d/*.sh 規定了bash操作接口的顏色、語系、一些命令別名等。
b. 交互式shell
如果用戶的bash shell不是登錄系統時啓動的,稱爲交互式shell。
處理次序:
~/.bashrc 會去用戶家目錄檢查 .bashrc是否存在
此文件有兩個作用:一是查看/etc目錄下的共用bashrc文件,二是爲用戶提供了一個定製自己的命令別名和私有腳本函數的地方。
通用的/etc/bashrc啓動文件會被系統上每個啓動交互式shell會話的用戶執行。它幫我們定義出下面的數據:
1) 依據不同的UID規定umask的值;
2) 依據不同的UID規定提示符(就是PS1變量);
3) 調用/etc/profile.d/*.sh的設置
萬一沒有~/.bashrc文件,無法調用/etc/bashrc來規定PS1變量,如果想要將命令提示符調回來,那麼可以複製/etc/skel/.bashrc到用戶主文件夾內。
4. 讀入環境配置文件的命令
一般環境配置文件修改過後,需註銷再登錄後該設置纔會生效。
能不能直接讀取配置文件而不註銷登錄呢?
利用source或 . 都可以將配置文件的內容讀進目前的shell環境中。