【Linux Shell 腳本攻略】Day01

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的值。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容