Linux 學習作業:認識bash shell

本次記錄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。

6. Linux環境變量

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個配置文件中的一個,而讀取的順序則是依照上面的順序。

image

/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環境中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章