1976年贪婪的嘴唇,韩国少妇激三级做爰2023电影,久久久久久精品国产三级涨奶,妖精漫画在线观看免费漫画下拉式

Bash快速入門指南
來源:易賢網 閱讀:1464 次 日期:2015-04-02 13:04:28
溫馨提示:易賢網小編為您整理了“Bash快速入門指南”,方便廣大網友查閱!

簡單shell腳本

!/bin/bash

這一行表明,不管用戶選擇的是那種交互式shell,該腳本需要使用bash shell來運行。由于每種shell的語法大不相同,所以這句非常重要。

簡單實例

下面是一個非常簡單的shell腳本。它只是運行了幾條簡單的命令

#!/bin/bash

echo "hello, $USER. I wish to list some files of yours"

echo "listing files in the current directory, $PWD"

ls # 列出當前目錄所有文件

首先,請注意第四行。在bash腳本中,跟在#符號之后的內容都被認為是注釋(除了第一行)。Shell會忽略注釋。這樣有助于用戶閱讀理解腳本。 ?$USER和 $PWD都是變量。它們是bash腳本自定義的標準變量,無需在腳本中定義即可使用。請注意,在雙引號中引用的變量會被展開(expanded)。“expanded”是一個非常合適的形容詞:基本上,當shell執行命令并遇到$USER變量時,會將其替換為該變量對應的值。

變量

任何編程語言都會用到變量。你可以使用下面的語句來定義一個變量:

X="hello"

并按下面的格式來引用這個變量:

$X

更具體的說,$X表示變量X的值。關于語義方面有如下幾點需要注意:

等于號兩邊不可以有空格!例如,下面的變量聲明是錯誤的 :

X = hello

在我所展示的例子中,引號并不都是必須的。只有當變量值包含空格時才需要加上引號。例如:

X = hello world # 錯誤

X = "hello world" # 正確

這是由于shell將每一行命令視為命令及其參數的集合,以空格分隔。 foo=bar就被視為一條命令。foo = bar 的問題就在于shell將空格分開的foo視為命令。同樣,X=hello world的問題就在于shell將X=hello視為一條完整的命令,而”world”則被徹底無視(因為賦值命令不需其他參數)。

單引號 VS 雙引號

基本上來說,變量名會在雙引號中展開,單引號中則不會。如果你不需要引用變量值,那么使用單引號可以很直觀的輸出你期望的結果。 An example 示例

#!/bin/bash

echo -n '$USER=' # -n選項表示阻止echo換行

echo "$USER"

echo "$USER=$USER" # 該命令等價于上面的兩行命令

輸出如下(假設你的用戶名為elflord)) $USER=elflord $USER=elflord

$USER=elflord

$USER=elflord

從例子中可以看出,在雙引號中使用轉義字符也是一種解決方案。雖然雙引號的使用更靈活,但是其結果不可預見。如果要在單引號和雙引號之間做出選擇,最好選擇單引號。

使用引號封裝變量

有時候,使用雙引號來保護變量名是個很好的點子。如果你的變量值存在空格或者變量值為空字符串,這點就顯得尤其重要。看下面這個例子:

#!/bin/bash

X=""

if [ -n $X ]; then # -n 用來檢查變量是否非空

echo "the variable X is not the empty string"

fi

運行這個腳本,輸出如下:

the variable X is not the empty string

為何?這是因為shell將$X展開為空字符串,表達式[-n]返回真值(因為改表達式沒有提供參數)。再看這個腳本:

#!/bin/bash

X=""

if [ -n "$X" ]; then # -n 用來檢查變量是否非空

echo "the variable X is not the empty string"

fi

在這個例子中,表達式展開為[ -n ""],由于引號中內容為空,因此該表達式返回false值。

在執行時展開變量

為了證實shell就像我上面說的那樣直接展開變量,請看下面的例子:

#!/bin/bash

LS="ls"

LS_FLAGS="-al"

$LS $LS_FLAGS $HOME

乍一看可能有點不好理解。其實最后一行就是執行這樣一條命令:

Ls -al /home/elflord

(假設當前用戶home目錄為/home/elflord)。這就說明了shell僅僅只是將變量替換為對應的值再執行命令而已。

使用大括號保護變量

這里有一個潛在的問題。假設你想打印變量X的值,并在值后面緊跟著打印”abc”。那么問題來了:你該怎么做呢? 先試一試:

#!/bin/bash

X=ABC

echo "$Xabc"

這個腳本沒有任何輸出。究竟哪里出了問題?這是由于shell以為我們想要打印變量Xabc的值,實際上卻沒有這個變量。為了解決這種問題可以用大括號將變量名包圍起來,從而避免其他字符的影響。下面這個腳本可以正常工作:

!/bin/bashX=ABCecho “${X}abc”

#!/bin/bash

X=ABC

echo "${X}abc"

條件語句, if/then/elif

在某些情況下,我們需要做條件判斷。比如判斷字符串長度是否為0?判斷文件foo是否存在?它是一個鏈接文件還是實際文件?首先,我們需要if命令來執行檢查。語法如下:

if condition

then

statement1

statement2

..........

fi

當指定條件不滿足時,可以通過else來指定其他執行動作。

if condition

then

statement1

statement2

..........

else

statement3

fi

當if條件不滿足時,可以添加多個elif來檢查其他條件是否滿足。

if condition1

then

statement1

statement2

..........

elif condition2

then

statement3

statement4

........

elif condition3

then

statement5

statement6

........

fi

當相關條件滿足時,shell會執行在相應的if/elif與下個elif或fi之間的語句。事實上,判斷條件可以是任意命令,當且只當命令返回并且退出狀態為0時,才會執行該條件塊中的語句(換句話說,就是當命令成功返回時)。不過在本文的學習中,我們只會關注“test”或“[]”形式的條件判斷。

Test命令與操作符

條件判斷中的命令幾乎都是test命令。test根據測試條件通過或失敗來返回true或false(更準確的說是返回0或非0值)。如下所示:

test operand1 operator operand2

對某些測試來說,只需要一個操作數(operand2)通常是下面這種情況的簡寫:

[ operand1 operator operand2 ]

為了讓我們的討論更接地氣一點,給出下面一些例子:

#!/bin/bash

X=3

Y=4

empty_string=""

if [ $X -lt $Y ]# is $X less than $Y ?

then

echo "$X=${X}, which is smaller than $Y=${Y}"

fi

if [ -n "$empty_string" ]; then

echo "empty string is non_empty"

fi

if [ -e "${HOME}/.fvwmrc" ]; then # test to see if ~/.fvwmrc exists

echo "you have a .fvwmrc file"

if [ -L "${HOME}/.fvwmrc" ]; then # is it a symlink ?

echo "it's a symbolic link

elif [ -f "${HOME}/.fvwmrc" ]; then # is it a regular file ?

echo "it's a regular file"

fi

else

echo "you have no .fvwmrc file"

fi

需要注意的細節

Test命令的格式為“操作數< 空格 >操作符< 空格 >操作數”或者“操作符< 空格 >操作數”,這里特別說明必須要有這些空格,因為shell將沒有空格的第一串字符視為一個操作符(以-開頭)或者操作數。比如下面這個:

if [ 1=2 ]; then echo “hello”fi

它會打印出hello,這明顯與預期結果是不一致的(因為shell只看到操作數1=2,沒看到操作符)。

還有一種隱藏陷阱是未加引號的變量。像我們之前例子說的-n測試時變量須加引號的情形。其實,不管在什么情況下,加上引號總是沒有壞處的,還有可能規避一些很奇葩的錯誤。因為有時候不加引號的變量擴展開的測試結果會讓人非常困惑。例如:

#!/bin/bash

X="-n"

Y=""

if [ $X = $Y ] ; then

echo "X=Y"

fi

這個腳本打印出來的結果是錯誤的,因為shell將判斷展開為 [ -n = ],但是”=”的長度不為0,所以條件判斷通過從而導致輸出結果為“X=Y”。

Test操作符簡介

下圖是test操作符的快速查詢列表。當然這個列表并不全面,但記下這些就足夠平常使用了(如果還需要了解其他操作符,可以查看man手冊)。

operatorproduces true if…number of operands

-noperand non zero length1

-zoperand has zero length1

-dthere exists a directory whose name is operand1

-fthere exists a file whose name is operand1

-eqthe operands are integers and they are equal2

-neqthe opposite of -eq2

=the operands are equal (as strings)2

!=opposite of =2

-ltoperand1 is strictly less than operand2 (both operands should be integers)2

-gtoperand1 is strictly greater than operand2 (both operands should be integers)2

-geoperand1 is greater than or equal to operand2 (both operands should be integers)2

-leoperand1 is less than or equal to operand2 (both operands should be integers)2

循環

循環結構允許我們執行重復的步驟或者在若干個不同條目上執行相同的程序。Bash中有下面兩種循環

for 循環

while 循環

For 循環

直接來個例子,來直觀地感受for循環的語法。

#!/bin/bash

for X in red green blue

do

echo $X

done

For循環會遍歷空格分開的條目。注意,如果某一項含有空格,必須要用引號引起來,例子如下:

#!/bin/bash

colour1="red"

colour2="light blue"

colour3="dark green"

for X in "$colour1" $colour2" $colour3"

do

echo $X

done

如果我們漏掉for循環中的引號,你能猜想出會發生什么嗎?這個例子說明,除非你確認變量中不會包含空格,否則最好都用引號將變量保護起來。

在for循環中使用通配符

如果shell解析字符串時遇到*號,會將它展開為所有匹配的文件名。當且僅當目標文件與號展開后的字符串一致才會匹配成功。例如,單獨的*號展開為當前目錄的所有文件,中間以空格分開(包含隱藏文件)。

所以:

echo *

列出當前目錄下的所有文件和目錄。

echo *.jpg

列出所有的jpeg圖片格式的文件。

echo ${HOME}/public_html/*.jpg

列出home目錄中public_html目錄下的所有jpeg文件。

正是由于這種特性,使得我們可以很方便的來操作目錄和文件,尤其是和for循環結合使用時,更是便利。例子如下:

#!/bin/bash

for X in *.html

do

grep -L '<UL>' "$X"

done

打印出當前目錄下所有不包含<UL>字段的html文件。

While 循環

當給定條件為真值時,while循環會重復執行。例如:

#!/bin/bash

X=0

while [ $X -le 20 ]

do

echo $X

X=$((X+1))

done

這樣導致這樣的疑問: 為什么bash不能使用C風格的for循環呢?

for (X=1,X<10; X++)

這也跟bash自身的特性有關,之所以不允許這種for循環是由于:bash是一種解釋性語言,因此其運行效率比較低。也正是由于這個原因,高負荷迭代是不允許的。

命令替換

Bash shell有個非常好用的特性叫做命令替換。允許我們將一個命令的輸出當做另一個命令的輸入。比如你想要將命令的輸出賦值給變量X,你可以通過變量替換來實現。

有兩種命令替換的方式:大括號擴展和反撇號擴展。

大括號擴展: $(commands) 會展開為命令commands的輸出結果。并且允許嵌套使用,所以commands中允許包含子大括號擴展。

反撇好擴展:將commands擴展為命令commands的輸出結果。不允許嵌套。

這里有一個例子:

#!/bin/bash

files="$(ls)"

web_files=`ls public_html`

echo "$files" # we need the quotes to preserve embedded newlines in $files

echo "$web_files" # we need the quotes to preserve newlines

X=`expr 3 * 2 + 4` # expr evaluate arithmatic expressions. man expr for details.

echo "$X"

$()替換方式的優點不言自明:非常易于嵌套。并且大多數bourne shell的衍生版本都支持(POSIX shell 或者更好的都支持)。不過,反撇號替換更簡單明了,即使是最基本的shell它也提供了支持(任意版本的#!/bin/sh都可以)。

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:Bash快速入門指南
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
主站蜘蛛池模板: 岑巩县| 汽车| 金阳县| 新郑市| 宜阳县| 富阳市| 黔南| 郸城县| 深州市| 建宁县| 合江县| 五原县| 闽侯县| 长寿区| 库伦旗| 贵定县| 安平县| 黄石市| 三都| 湖南省| 高尔夫| 桃源县| 专栏| 沁水县| 长沙市| 万宁市| 疏附县| 望奎县| 来凤县| 和平区| 龙陵县| 本溪市| 广州市| 晋宁县| 彰化县| 清水河县| 临高县| 彭州市| 武山县| 奉贤区| 苏尼特右旗|