如果您想編寫指令碼並理解要從web上剪下和貼上的程式碼對Linux計算機的影響,那麼變數是至關重要的。我們會讓你開始的!
變數是表示字串或數值的命名符號。當您在命令和表示式中使用它們時,它們將被視為您鍵入了它們所包含的值,而不是變數的名稱。
要建立變數,只需為其提供名稱和值。變數名應該是描述性的,並提醒您它們所具有的值。變數名不能以數字開頭,也不能包含空格。但是,它可以以下劃線開頭。除此之外,您還可以使用任何大小寫字母數字字元的組合。
在這裡,我們將建立五個變數。格式是鍵入名稱、等號和值。注意等號前後沒有空格。給變數賦值通常被稱為給變數賦值。
今年,我們將建立四個字串變數和一個數字變數:
me=Dave my_boost=Linux him=Popeye his_boost=Spinach this_year=2019要檢視儲存在變數中的值,請使用echo命令。每當引用變數名包含的值時,必須在變數名前面加上美元符號$,如下所示:
echo $my_name echo $my_boost echo $this_year讓我們同時使用所有變數:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"變數的值替換它們的名稱。也可以更改變數的值。要給變數myu boost賦值,只需重複賦值時的操作,如下所示:
my_boost=Tequila如果重新執行上一個命令,現在會得到不同的結果:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"因此,可以使用引用相同變數的相同命令,如果更改變數中的值,則會得到不同的結果。
稍後我們將討論引用變數。現在,請記住以下幾點:
還可以建立一個變數,該變數的值來自現有變數或多個變數。下面的命令定義了一個名為drink\u of \u The \u Year的新變數,並將my\u boost和this\u Year變數的組合值賦給它:
drink_of-the_Year="$my_boost $this_year" echo drink_of_the-Year如果沒有變數,指令碼將完全無法執行。變數提供了靈活性,使指令碼成為通用的解決方案,而不是特定的解決方案。為了說明這一區別,這裡有一個指令碼對/dev目錄中的檔案進行計數。
將其鍵入文字檔案,然後另存為fcnt.sh公司(對於“檔案計數”):
#!/bin/bash folder_to_count=/dev file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count在執行指令碼之前,必須使其可執行,如下所示:
chmod +x fcnt.sh鍵入以下內容以執行指令碼:
./fcnt.sh這將列印/dev目錄中的檔案數。其工作原理如下:
但這隻適用於“/dev”目錄。如何使指令碼與任何目錄一起工作?只需要一點零錢。
許多命令(如ls和wc)採用命令列引數。它們向命令提供資訊,以便它知道您希望它做什麼。如果希望ls在主目錄上工作並顯示隱藏檔案,可以使用以下命令,其中tilde~和-a(all)選項是命令列引數:
ls ~ -a我們的指令碼可以接受命令列引數。第一個引數引用為$1,第二個引數引用為$2,依此類推,第九個引數引用為$9。(實際上,還有一個0美元,但這是保留的,以便始終儲存指令碼。)
可以在指令碼中引用命令列引數,就像引用常規變數一樣。讓我們修改指令碼,如下所示,並使用新名稱fcnt2.sh儲存它:
#!/bin/bash folder_to_count=$1 file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count這一次,folder_to_count變數被分配了第一個命令列引數$1的值。
指令碼的其餘部分和以前完全一樣。您的指令碼現在是通用的,而不是特定的解決方案。您可以在任何目錄上使用它,因為它不是硬編碼的,只能與“/dev”一起使用
下面是如何使指令碼可執行的:
chmod +x fcnt2.sh現在,用幾個目錄試試。您可以先執行“/dev”以確保得到與以前相同的結果。鍵入以下內容:
./fnct2.sh /dev ./fnct2.sh /etc ./fnct2.sh /bin對於“/dev”目錄,您將得到與之前相同的結果(207個檔案)。這是令人鼓舞的,對於其他每個命令列引數,都會得到特定於目錄的結果。
為了縮短指令碼,您可以省去變數folder\u To\u count,整個過程只引用$1,如下所示:
#!/bin/bash file_count=$(ls $1 wc -l) echo $file_count files in $1我們提到了$0,它總是設定為指令碼的檔名。這允許您使用指令碼來執行諸如正確列印其名稱之類的操作,即使它已重新命名。這在日誌記錄情況下很有用,在這種情況下,您需要知道添加了條目的程序的名稱。
以下是其他特殊預設變數:
你想在一個劇本里看到所有這些,是嗎?你可以!將以下內容另存為名為,特殊.sh:
#!/bin/bash echo "There were $# command line parameters" echo "They are: $@" echo "Parameter 1 is: $1" echo "The script is called: $0" # any old process so that we can report on the exit status pwd echo "pwd returned $?" echo "This script has Process ID $$" echo "The script was started by $USER" echo "It is running on $HOSTNAME" sleep 3 echo "It has been running for $SECONDS seconds" echo "Random number: $RANDOM" echo "This is line number $LINENO of the script"鍵入以下內容使其可執行:
chmod +x special.sh現在,您可以使用一系列不同的命令列引數來執行它,如下所示。
Bash使用環境變數來定義和記錄它在啟動時建立的環境的屬性。這些儲存資訊Bash可以隨時訪問,例如您的使用者名稱、區域設定、歷史檔案可以儲存的命令數、預設編輯器等等。
要檢視Bash會話中的活動環境變數,請使用以下命令:
env | less如果您在列表中滾動,您可能會找到一些有用的指令碼參考。
當一個指令碼執行時,它在自己的程序中,並且它使用的變數在該程序之外是看不到的。如果要與指令碼啟動的另一個指令碼共享一個變數,則必須匯出該變數。我們將用兩個指令碼向您展示如何實現這一點。
首先,用檔名指令碼儲存以下內容_一個.sh:
#!/bin/bash first_var=alpha second_var=bravo # check their values echo "$0: first_var=$first_var, second_var=$second_var" export first_var export second_var ./script_two.sh # check their values again echo "$0: first_var=$first_var, second_var=$second_var"這將建立兩個變數,第一個變數和第二個變數,並分配一些值。它將這些輸出到終端視窗,匯出變數,並呼叫指令碼_兩個.sh.When指令碼_兩個.sh終止,並且程序流返回到此指令碼,它再次將變數列印到終端視窗。然後,你可以看看他們是否改變了。
我們將使用的第二個指令碼是指令碼_兩個.sh。這是那個指令碼_一個電話. 鍵入以下內容:
#!/bin/bash # check their values echo "$0: first_var=$first_var, second_var=$second_var" # set new values first_var=charlie second_var=delta # check their values again echo "$0: first_var=$first_var, second_var=$second_var"第二個指令碼列印兩個變數的值,為它們指定新值,然後再次列印它們。
要執行這些指令碼,必須鍵入以下內容才能使其可執行:
chmod +x script_one.sh chmod +x script_two.sh現在,鍵入以下命令啟動指令碼_一個.sh:
./script_one.sh這是輸出告訴我們的:
在第二個劇本里發生的事,留在第二個劇本里。這就像變數的副本被髮送到第二個指令碼,但是當指令碼退出時它們被丟棄。第一個指令碼中的原始變數不會被第二個指令碼中的副本所發生的任何更改。
您可能已經注意到,當指令碼引用變數時,它們在引號中。這允許正確引用變數,因此在指令碼中執行行時使用它們的值。
如果指定給變數的值包含空格,則在將空格指定給變數時,空格必須位於引號中。這是因為,預設情況下,Bash使用空格作為分隔符。
舉個例子:
site_name=How-To GeekBash認為“Geek”前面的空格表示新命令正在啟動。它報告沒有這樣的命令,並放棄該行。echo告訴我們site\u name變數不包含任何內容,甚至包括“How To”文字。
用引號將值括起來,再試一次,如下所示:
site_name="How-To Geek"這一次,它被識別為單個值並正確地分配給site\u name變數。
可能需要一些時間來習慣命令替換、引用變數以及記住何時包含美元符號。
在按Enter鍵並執行一行Bash命令之前,請在它前面使用echo進行嘗試。這樣,你就可以確定接下來發生的事情是你想要的。您還可以發現語法中可能犯的任何錯誤。
...bash是什麼、不同的模式(互動式和非互動式)以及它是如何產生的基礎知識開始,這個站點提供了一個全面的背景知識來幫助您理解命令列的機制。 ...
...更多的特性。瞭解更多關於Bash-on-Windows的資訊,從您應該如何以及為什麼安裝它,到您可能不知道的隱藏特性。 ...
...為輸入執行它。這些特殊的應用程式被稱為水滴。下面是如何建立一個: ...
... 第一行告訴執行這個程式的人如何執行它(即使用bash直譯器)。第二個命令與您在命令列中輸入的任何其他命令一樣。將該檔案另存為hello_世界.sh,然後: ...
...改其目錄,您可以控制他們可以訪問哪些命令。下面介紹如何在Linux上設定受限shell。 受限炮彈 受限shell不是另一個shell。這是標準外殼的另一種模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下啟動。在本文中,我們將...
Bash不是唯一的Linux shell。很容易嘗試其他的shell,比如非常流行的Zsh。找到一個您喜歡的shell後,使用chsh命令將其設定為預設shell。我們會教你怎麼做。 為什麼貝殼很重要 shell位於您和作業系統之間。它在終端視窗內提供環境...
...小又簡單。 在使用Linux計算機的第一個小時內,您將學習如何使用Bash和其他shell附帶的cd命令。也許您以前有在其他作業系統上使用它的經驗,不需要解釋。它會改變當前的工作目錄,對嗎?還有什麼要知道的? 好吧,比你想象...
...在shell中的,因此Bash不必費勁地查詢這些命令。 但是Bash如何定位其他命令、程式和外部獨立二進位制檔案呢?Bash使用路徑,實際上是一組路徑,每個路徑指向一個目錄。然後,它在每個目錄中搜索與您試圖執行的命令或程式匹...