1、終端
終端是交互式工具,用戶可以通過終端與shell環(huán)境進(jìn)行交互。shell命令都是在shell終端中輸入并執(zhí)行的。
打開終端后,就會出現(xiàn)一個提示符。其形式通常如下:
username@hostname $
或者
root@hostname #
要么就以簡單的$或#表示。
$表示的是普通用戶,#表示的是管理員用戶root。root是Linux系統(tǒng)中權(quán)限最高的用戶。
2、Shell
shell腳本通常是以一個文本行#!/bin/bash起始的文本文件,#!位于解釋器路徑之前,/bin/bash是Bash的解釋器命令路徑。
有兩種運(yùn)行shell腳本的方式。一種是將腳本作為bash的命令行參數(shù),另一種是授予腳本可執(zhí)行權(quán)限。
1)將腳本作為命令行參數(shù)
運(yùn)行方式如下:
$ bash script.sh # 假設(shè)腳本文件位于當(dāng)前目錄下
或者
$ bash /home/path/script.sh # 使用script.sh的完整路徑
如果將腳本作為bash的命令行參數(shù)來運(yùn)行,就不用文本行#!/bin/bash了。
2)授予腳本可執(zhí)行權(quán)限
此時使用#!后的解釋器運(yùn)行。
添加可執(zhí)行權(quán)限:
chmod a+x script.sh
上述命令賦予所有用戶執(zhí)行script.sh文件的權(quán)限。執(zhí)行方式如下:
$ ./script.sh # ./ 表示當(dāng)前目錄
或者
$ /home/path/script.sh # 使用腳本完整路徑
內(nèi)核會讀取腳本的首行#!/bin/bash,并在內(nèi)部按一下方式執(zhí)行腳本:
$ /bin/bash script.sh
3、打印
1)echo命令
echo是用于終端打印的的基本命令。
使用帶雙引號的文本,結(jié)合echo命令就可以將該文本在終端中打印出來。如下:
$ echo "Welcome to Bash"
Welcome to Bash
類似地,不帶雙引號的文本也可以得到同樣的輸出結(jié)果:
$ echo Welcome to Bash
Welcome to Bash
使用單引號也可以達(dá)到同樣的效果:
$ echo 'Welcome to Bash'
Welcome to Bash
這些方法看起來相似,但各有一些特殊的用途和副作用。例如:
$ echo "Welcome to Bash!"
這條命令會返回:
-bash: !": event not found
因此需要打印感嘆號,就不要將其放入雙引號中,或者在之前加上一個轉(zhuǎn)義字符(\),將其轉(zhuǎn)義,如:
$ echo Welcome to Bash!
或者
$ echo 'Welcome to Bash!'
或者
$ echo "Welcome to Bash\!"
使用不帶引號的echo時,沒法在所要顯示的文本中使用分號,因?yàn)榉痔栐贐ash Shell中被用作命令定界符。以echo hello;hello為例,echo hello被視為一個命令,第二個命令hello則被視為另一個命令。
變量替換在單引號中無效,在雙引號中有效,如下:
$ value="Hello World"
$?echo ${value}
Hello World
$?echo "${value}"
Hello World
$?echo '${value}'
${value}
默認(rèn)情況下,echo會將一個換行符追加到輸出文本的尾部。可以使用-n來忽略結(jié)尾的換行符。如下:
$ echo -n "Welcome to Bash"
echo可以接受雙引號字符串內(nèi)的轉(zhuǎn)義字符作為參數(shù),如果需要使用轉(zhuǎn)義序列,則采用echo -e "包含轉(zhuǎn)義序列的字符串"這種形式。如下:
$ echo -e "1\t2\t3"
1 2 3
可以使用轉(zhuǎn)義序列來實(shí)現(xiàn)在終端生成彩色輸出。
每種顏色都有對應(yīng)的顏色碼。如:重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍(lán)色=34,洋紅=35,青色=36,白色=37。
如下腳本:
#!/bin/bash
# 文件名:printf.sh
echo -e "\e[1;30m This is black text \e[0m"
echo -e "\e[1;31m This is red text \e[0m"
echo -e "\e[1;32m This is green text \e[0m"
echo -e "\e[1;33m This is yellow text \e[0m"
echo -e "\e[1;34m This is blue text \e[0m"
echo -e "\e[1;35m This is magenta text \e[0m"
echo -e "\e[1;36m This is cyan text \e[0m"
echo -e "\e[1;37m This is white text \e[0m"
輸出如下:

要設(shè)置背景顏色,使用的顏色碼為:重置=0,黑色=40,紅色=41,綠色=42,黃色=43,藍(lán)色=44,洋行=45,青色=46,白色47。
如下腳本:
#!/bin/bash
# 文件名:printf.sh
echo -e "\e[1;40m Black Backgroud \e[0m"
echo -e "\e[1;41m Red Backgroud \e[0m"
echo -e "\e[1;42m Green Backgroud \e[0m"
echo -e "\e[1;43m Yellow Backgroud \e[0m"
echo -e "\e[1;44m Blue Backgroud \e[0m"
echo -e "\e[1;45m Magenta Backgroud \e[0m"
echo -e "\e[1;46m Cyan Backgroud \e[0m"
echo -e "\e[1;47m White Backgroud \e[0m"
輸出如下:

2)printf命令
printf使用的參數(shù)和C語言中的printf函數(shù)一樣。如下:
$ printf "Hello World"
printf使用引用文本或由空格分隔的參數(shù)。
可以在printf中使用格式化字符串,還可以指定字符串的寬度、左右對齊方式等。默認(rèn)情況下, printf并不像echo命令一樣會自動添加換行符,需要換行的時候手動添加即可。
如下:
#!/bin/bash
# 文件名:printf.sh
printf " %-5s %-10s %-4s\n" No Name Mark
printf " %-5s %-10s %-4.2f\n" 1 James 80.3456
printf " %-5s %-10s %-4.2f\n" 2 Wade 90.9876
printf " %-5s %-10s %-4.2f\n" 3 Yao 88.666
得到如下格式化輸出:

%s、%c、%d、%f都是格式替換符,其所對應(yīng)的參數(shù)可以置于帶引號的格式字符串之后。
%-5s指明了一個格式為左對齊且寬度為5的字符串替換,-表示左對齊。如果不用-指定對齊方式,字符串就采用右對齊的方式。寬度指定了保留給某個變量的字符數(shù)。對于Name而言,保留的寬度時10。因此,任何Name字段的內(nèi)容都會被顯示在10字符寬的區(qū)域內(nèi),如果內(nèi)通不足10個字符,余下的則以空格符補(bǔ)充.
對于浮點(diǎn)數(shù),如Mark字段,將其格式化為%4.2f,其中.2指定保留2個小數(shù)位。
每行格式字符串后都有一個換行符(\n)用以換行。
4、變量
1)普通變量
變量用于存放各類數(shù)據(jù),腳本語言通常不需要在使用變量前聲明其類型,只需要直接賦值即可。
在Bash中,每個變量的值都是字符串。在給變量賦值時,無論有沒有使用引號,值都會以字符串的形式存儲。
變量可以通過以下方式進(jìn)行賦值:
var=value
var是變量名,value是賦給變量的值。如果value不包含任何空白字符(如空格),那么就不需要使用引號進(jìn)行引用,否則必須使用單引號或雙引號。
注意:var=value不同于var = value,把var=value寫成var = value是一個常見的錯誤,前者是賦值操作,后者是相等操作。
在變量名之前加上$前綴,就可以打印出變量的內(nèi)容。
如下:
var="value"
echo $var
或者
echo ${var}
輸出如下:
value
可以在printf或echo命令的雙引號中引用變量值。
如下:
#!/bin/bash
# 文件名:variables.sh
fruit=apple
count=5
echo "We have $count ${fruit}(s)"
輸出如下:
We have 5 apple(s)
2)環(huán)境變量
有一些特殊的變量會被shell環(huán)境和操作系統(tǒng)環(huán)境用來存儲一些特別的值,這類變量稱為環(huán)境變量。
環(huán)境變量通常用戶存儲路徑列表,這些路徑用戶搜索可執(zhí)行文件、庫文件等。
環(huán)境變量是未在當(dāng)前進(jìn)程中定義,而從父進(jìn)程中繼承而來的變量。
可以使用env命令查看所有與終端相關(guān)的環(huán)境變量。
對于進(jìn)程來說,其運(yùn)行時的環(huán)境變量可以使用如下命令查看:
$ cat /proc/$PID/environ
其中,將PID設(shè)置成相關(guān)進(jìn)程的進(jìn)程ID,PID總是一個整數(shù)。
上述命令返回一個包含環(huán)境變量以及對應(yīng)值的列表。每一個變量以name=value的形式來描述,彼此之間由null字符(\0)分隔。
如果將\0替換成\n,那么就可以將輸出重新格式化,使得每一行顯示一組“變量=值”。
替換可以使用tr命令來實(shí)現(xiàn):
$ cat /proc/$PID/environ |tr '\0' '\n'
export命令用來設(shè)置環(huán)境變量。
如下:
$ HTTP_PROXY=192.168.1.100:3128
$ export HTTP_PROXY
執(zhí)行該命令之后,從當(dāng)前腳本執(zhí)行的任何應(yīng)用程序都會繼承這個變量。
默認(rèn)情況下,有許多標(biāo)準(zhǔn)環(huán)境變量可供shell使用。如:PATH。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:wq:/root/bin
PATH環(huán)境變量列出的是各個可執(zhí)行文件的目錄列表,各個目錄路徑之間以冒號分隔。在執(zhí)行命令后,shell會自動在PATH環(huán)境變量所包含的目錄列表中查找對應(yīng)的可執(zhí)行文件。
PATH通常定義在/etc/environment或/etc/profile或~/.bashrc中。
如果需要在PATH中增加一條新路徑,可以使用:
export PATH="$PATH:/home/user/bin"
也可以使用:
$ PATH="$PATH:/home/user/bin"
$?export PATH
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:wq:/root/bin:/home/user/bin
這樣就把/home/user/bin添加到了PATH中。
其他環(huán)境變量,如:HOME、PWD、USER、UID、SHELL等。
識別當(dāng)前所使用的shell,如下:
$ echo $SHELL
/bin/bash
或者
$ echo $0
-bash
獲得字符串長度,可食用如下方法:
length=${#var}
如下:
$ var=01234567890123456789
$ echo ${#var}
20
檢查是否為超級用戶,通過環(huán)境變量UID來檢查當(dāng)前腳本是以超級用戶還是普通用戶身份運(yùn)行的。如:
if [ $UID -ne 0 ];then
? ? echo Non root user. Please run as root.
else
? ? echo Root user
fi
root用戶的UID是0。
當(dāng)打開終端或者運(yùn)行shell時,會看到類似于user@hostname:/home/$的提示字符串。不同GNU/Linux發(fā)行版中的提示及顏色略有不同。
可以利用PS1環(huán)境變量來定制提示文本格式。默認(rèn)的shell提示文本時在文件/etc/bashrc中的某一行設(shè)置的。
可以使用如下命令列出設(shè)置變量PS1的那一行:
$ cat /etc/bashrc
可以看到類似PS1="[\u@\h \W]\\$的字符,\u為用戶名,\h為主機(jī)名,\w為當(dāng)前工作目錄。
可以修改成自定制的提示字符串。
了解知識:
一種shell參數(shù)擴(kuò)展形式:
${parameter:+parameter}
如果parameter有值且不為空,則使用parameter的值。