2017-04-08 64 views
0


我是shell腳本編程新手。我有一個非常基本的問題,關於如何將我們終端中定義的變量作爲shell scirpt的輸入讀取。
如何將定義在終端中的變量讀取到bash腳本中

讓我們說我在終端定義這個變量
A = 22
如果我這樣做echo $a它給出22在我端子輸出。

我想這個變量作爲參數傳遞給一個名爲input.sh

#!/bin/bash 

echo "Enter variable name:" 
read Input 
echo $Input 

腳本我跑了scirpt作爲./input.sh它彈出的消息
輸入變量名:$ a

但在輸出中我有$ a作爲輸出不是22.我想要22作爲輸出。有沒有辦法做到這一點?

回答

2

你在這裏混合了幾件事情。從哪裏開始...

將值傳遞給腳本的常用方法是通過位置參數。

假設你這個劇本,叫s1

#!/bin/bash  
echo "First two args are: $1 $2" 

如果你喜歡這個執行:

./s1 Arg1 Arg2 

您將看到以下的輸出:

First two args are: Arg1 Arg2 

如果您想要將一個變量名稱傳遞給腳本,並讓該腳本輸出這個值變量,那麼你必須做兩件事。首先,初始化變量並使其可以通過子進程(包括您將調用的腳本,這是一個單獨的進程,除非使用source.調用)才能看到。

VAR="Some value" 
export VAR 

您也可以在單個語句一舉兩得:

export VAR="Some value" 

然後,適應腳本來執行的變量的間接訪問:

#!/bin/bash  
echo "Value of variable named $1 : ${!1}" 

請注意,雖然$1的意思是「變量1的內容」,${!1}的意思是「變量的內容被命名爲$1」。這是間接的一部分。

現在,如果您想要更進一步,並允許腳本以交互方式讀取用戶輸入(而不是參數)並將讀取的值用作變量名稱來展開,則可以這樣做:

#!/bin/bash 
echo "Please enter a variable name" 
read VARNAME 
echo "Value of variable named $VARNAME : ${!VARNAME}" 

使用位置參數可以使腳本更容易在非交互式場景中重用,因此讀取用戶輸入應限制在必要的情況下。

以上是幫助理解基礎。如果您不再使用玩具腳本,您需要了解間接訪問的安全影響(特別是如果允許用戶輸入的話)。您還需要驗證位置參數或用戶輸入對您的目的有效(即包含有效的變量名稱),以便您的腳本可以做出適當的反應。那麼,你可能需要檢查位置參數是否提供了開始。所有這些在shell腳本中都是可行的,但超出了單個問題的範圍。在任何情況下,如果您打算在預期可靠性的情況下擁有健壯的腳本,則需要檢查輸入(以及錯誤)。

0

要使用的終端定義的變量在bash腳本 -

  • 更改腳本的最後一行,這樣它看起來像 -

    #!/bin/bash 
    
    echo "Enter variable name:" 
    read Input 
    echo ${!Input} 
    
  • 運行腳本input.sh在終端上 -

    . input.sh 
    
  • 最後,當您輸入第e變量名稱,不要使用$符號。對於例如 -

    6c4008a16b7c:~ z001lg8$ . input.sh 
    Enter variable name: 
    a 
    22 
    6c4008a16b7c:~ z001lg8$ 
    

瞧,您現在可以使用腳本中的終端定義的變量。

解釋 -

在腳本中,這樣用戶輸入(變量名)的內容是呼應$輸入更改爲$ {輸入!},而不是變量名本身。 正如@Fred所解釋的那樣 - $ 1表示「變量1的內容」,$ {!1}表示「名稱爲$ 1的變量的內容」。

當腳本以. input.sh的形式運行時,這意味着您正在終端上採集腳本內容。 .符號用於獲取命令/腳本。

因爲${!Input}格式已考慮到Input變量中的值是變量名,所以在變量名輸入終端時不需要$符號。