中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Bash快速入門指南
來源:易賢網 閱讀:1677 次 日期: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)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
在线视频一区二区| 欧美大胆成人| 中文久久精品| 久久久久www| 亚洲欧美国产高清| 久久综合五月| 狠狠色综合色综合网络| 亚洲一区二区不卡免费| 国产精品自在线| 久久黄色级2电影| 国产综合精品| 欧美激情综合五月色丁香| 在线日韩欧美视频| 国内精品久久久久久久影视麻豆| 久久久久成人精品| 亚洲日韩欧美一区二区在线| 欧美色大人视频| 香蕉国产精品偷在线观看不卡| 国产精品一区二区在线| 久久久青草青青国产亚洲免观| 99精品福利视频| 国产综合色产| 国产美女精品一区二区三区| 久久精品在线观看| 亚洲经典在线看| 国产精品一区二区在线| 一区二区三区日韩在线观看| 国产主播一区二区三区| 国产精品乱码久久久久久| 欧美不卡在线视频| 久久久国产精品一区二区中文| 亚洲免费人成在线视频观看| 激情久久久久久久久久久久久久久久| 欧美久久久久久久| 欧美插天视频在线播放| 久久精品视频一| 欧美一进一出视频| 亚洲第一中文字幕| 国产日韩欧美二区| 欧美另类在线播放| 久久综合中文| 欧美精品日韩| 久久精品日韩欧美| 久久亚洲欧美| 欧美日韩国产综合在线| 国产精品mm| 今天的高清视频免费播放成人| 国产精品自在欧美一区| 国产精品日本一区二区| 国产偷久久久精品专区| 伊人久久综合97精品| 亚洲精品日本| 欧美在线视频不卡| 欧美中文在线观看| 欧美日韩综合不卡| 激情欧美一区二区| 亚洲欧美资源在线| 欧美国产日韩一区| 国产一区视频在线看| 夜夜精品视频一区二区| 欧美在线观看日本一区| 欧美另类在线播放| 激情综合色丁香一区二区| 亚洲一区在线看| 亚洲欧美日韩另类精品一区二区三区| 99视频在线观看一区三区| 亚洲欧美另类国产| 久久精品首页| 久久狠狠婷婷| 国产一区二区三区免费观看 | 国产精品永久入口久久久| 亚洲欧洲视频在线| 久久人91精品久久久久久不卡| 国产精品成人观看视频免费| 亚洲精品久久久久久久久| 麻豆久久精品| 最新日韩av| 欧美日韩精品免费观看| 亚洲乱码国产乱码精品精可以看| 浪潮色综合久久天堂| 国产精品久久久久久久久免费樱桃 | 美女脱光内衣内裤视频久久网站| 欧美午夜精彩| 久久国产一区| 亚洲黄色在线看| 欧美日韩一区二区欧美激情| 亚洲欧美国产不卡| 欧美日韩三级视频| 国产精品99久久久久久人| 欧美日韩精品免费观看视一区二区| 一本色道久久加勒比精品| 国产亚洲一区在线播放| 欧美大胆成人| 欧美在线视频一区二区三区| 亚洲第一视频| 国产精品亚洲产品| 欧美在线观看网站| 欧美成人视屏| 亚洲欧美亚洲| 亚洲人成小说网站色在线| 国产日韩精品一区二区三区| 欧美成在线观看| 欧美一区二区在线播放| 精品动漫3d一区二区三区免费| 国产精品国产三级国产aⅴ无密码| 亚洲欧美三级在线| 夜夜嗨av一区二区三区四季av | 欧美国产先锋| 国产精品日韩在线| 久久久青草青青国产亚洲免观| 久久夜色精品国产欧美乱| 久久aⅴ国产紧身牛仔裤| 欧美日韩福利在线观看| 久久一本综合频道| 欧美日韩国产精品| 国产日韩精品在线播放| 亚洲黄色在线视频| 久久久999精品免费| 欧美日韩在线播放三区| 欧美日韩爆操| 久久婷婷久久| 欧美日韩成人综合| 欧美精品18videos性欧美| 蘑菇福利视频一区播放| 欧美电影免费观看大全| 欧美人与禽性xxxxx杂性| 国产精品九九久久久久久久| 国产精品日本一区二区| 国产精品入口日韩视频大尺度| 国产精品嫩草久久久久| 国产婷婷色综合av蜜臀av| 国内精品久久久久影院薰衣草| 亚洲国产日日夜夜| 国产一本一道久久香蕉| 久久精品国产999大香线蕉| 理论片一区二区在线| 欧美精品日韩三级| 国产精品亚洲精品| 国产午夜亚洲精品羞羞网站| 激情文学一区| 99在线|亚洲一区二区| 亚洲一区欧美激情| 蜜桃久久av一区| 国产乱码精品一区二区三区忘忧草 | 亚洲裸体视频| 亚洲二区免费| 欧美高清影院| 影音先锋亚洲一区| 久久精品一区二区三区不卡| 国产欧美日韩一区二区三区在线观看 | 国产曰批免费观看久久久| 亚洲视频 欧洲视频| 欧美激情第8页| aa级大片欧美三级| 欧美激情视频给我| 一区二区三区国产盗摄| 欧美大片免费| 亚洲精品小视频| 欧美私人网站| 久久国产精品99精品国产| 亚洲黄色大片| 欧美一区二区三区视频在线观看| 欧美日韩中文在线| 亚洲视频一起| 欧美在线一级va免费观看| 国产一区二区三区久久悠悠色av | 亚洲黄色一区| 久久综合九色综合久99| 999在线观看精品免费不卡网站| 欧美成人精品福利| 亚洲一品av免费观看| 伊人一区二区三区久久精品| 久久久一区二区三区| 亚洲激情成人在线| 欧美无乱码久久久免费午夜一区| 亚洲亚洲精品在线观看| 蜜桃av一区二区三区| 精品成人在线| 久久亚洲私人国产精品va| 午夜激情综合网| 噜噜噜躁狠狠躁狠狠精品视频| 蜜桃av噜噜一区| 国产精品久久久久婷婷| 国产美女扒开尿口久久久| 国产亚洲va综合人人澡精品| 国内精品久久国产| 亚洲第一二三四五区| 久久亚洲精品欧美| 国产精品高潮久久| 亚洲国产精品成人va在线观看| 亚洲高清精品中出| 91久久精品国产91久久性色tv| 国产日韩欧美亚洲| 久久久久久久综合日本| 一区二区三区.www| 亚洲一区二区视频在线| 欧美专区日韩视频| 欧美精品 日韩| 国产综合色产| 亚洲一级影院|