2009-12-30 198 views
107

我正在寫一個bash腳本,我需要將包含空格的字符串傳遞給我的bash腳本中的函數。在空格中傳遞一個空格作爲函數參數

例如:

#!/bin/bash 

myFunction 
{ 
    echo $1 
    echo $2 
    echo $3 
} 

myFunction "firstString" "second string with spaces" "thirdString" 

中運行時,我期望的輸出是:

firstString 
second string with spaces 
thirdString 

然而,什麼是真正的輸出是:

firstString 
second 
string 

是否有辦法將空格作爲單個參數傳遞給bash中的函數?

+0

對我的作品時,空間分隔arguements ......我用充滿語法雖然功能」功能BLA( ){echo $ 1; }「,不能確定它是否爲一個班輪,不知道它有什麼不同。什麼版本的bash? – Eugene 2009-12-30 23:28:11

+3

嘗試'echo」$ @「'或'for i in」$ @「; echo $ i; done'因爲使用正確引用的包含空格的參數,這在'位置參數「部分下的所有'bash'文檔中都清楚地提到了 – Samveen 2013-06-14 07:06:09

+1

我有一個類似的問題,試圖傳遞一個帶引號的字符串作爲參數,字符串被識別爲參數的一部分Samveen建議將$ 1更改爲$ @爲我工作注意,我只向函數傳遞了一個參數,但如果我使用for語句傳遞的更多, – 2014-04-20 08:01:57

回答

116

你應該把引號也,你的函數聲明是錯誤的。

myFunction() 
{ 
    echo "$1" 
    echo "$2" 
    echo "$3" 
} 

和其他人一樣,它也適用於我。告訴我們你使用的是什麼版本的shell。

+1

這對我也很好。我們正在調用myFu中的另一個函數然後將參數傳遞給引號。乾杯:) – minhas23 2014-05-08 11:04:44

+1

你能解釋爲什麼需要引號嗎?我嘗試了兩種方法,但沒有爲我工作。我正在使用Ubuntu 14.04,GNU bash,版本4.3.11(1) - 發行版(x86_64-pc-linux-gnu)。 * *爲我工作的是使用$ @(帶或不帶引號)。 – 2016-11-22 20:52:48

4

你對myFunction的定義是錯誤的。它應該是:

myFunction() 
{ 
    # same as before 
} 

或:

function myFunction 
{ 
    # same as before 
} 

不管怎麼說,它看起來很好,巴蜀3.2.48爲我工作得很好。

-2

有同樣的問題,實際上問題不是函數或函數調用,而是我作爲參數傳遞給函數。

該函數是從腳本主體調用的 - 「主」 - 所以我從命令行傳遞了「st1 ab」「st2 cd」「st3 ef」,並使用myFunction $ *傳遞給函數

$ *導致問題,因爲它擴展成一組字符,這些字符將在使用空格作爲分隔符的函數調用中被解釋。

解決的辦法是在顯式參數處理中將函數的調用從main調用到函數中:調用將是myFunction「$ 1」「$ 2」「$ 3」,這將保留字符串內的空白爲引號將界定參數... 因此,如果一個參數可以包含空格,則應該在所有函數調用中明確處理它。

因爲這可能是長期的搜索問題的原因,很可能是聰明的人不使用$ *來傳遞參數...

希望這可以幫助別人,有一天,某處...... 月

+0

正確答案是''$ @'',並非全部引用'「$ 1」','「$ 2」',...位置參數或'$ *'。 – Samveen 2013-06-14 07:04:14

0

你可以在你的初始文本的情況下,這個問題的擴展設置成一個字符串類型的變量,例如:

function status(){  
    if [ $1 != "stopped" ]; then 
    artist="ABC"; 
    track="CDE"; 
    album="DEF"; 
    status_message="The current track is $track at $album by $artist"; 
    echo $status_message; 
    read_status $1 "$status_message"; 
    fi 
} 

function read_status(){ 
    if [ $1 != "playing" ]; then 
    echo $2 
    fi 
} 

在這種情況下,如果你不直傳STATUS_MESSAGE變量作爲字符串(被「」包圍)它會是分裂成一堆不同的參數。

「$變量」:當前曲目是CDE在DEF由ABC

$變量:上述問題的

+0

OP使用'myFunction「firstString」「第二個帶空格的字符串」「thirdString」',它不適用於他。所以你提出的建議不適用於這個問題。 – doubleDown 2013-06-15 22:55:25

14

另一種解決方案是在每個字符串設定爲一個變量,通話帶有由字面美元符號\$表示的變量的函數。然後在函數中使用eval按預期讀取變量和輸出。

#!/usr/bin/ksh 

myFunction() 
{ 
    eval string1="$1" 
    eval string2="$2" 
    eval string3="$3" 

    echo "string1 = ${string1}" 
    echo "string2 = ${string2}" 
    echo "string3 = ${string3}" 
} 

var1="firstString" 
var2="second string with spaces" 
var3="thirdString" 

myFunction "\${var1}" "\${var2}" "\${var3}" 

exit 0 

輸出則是:

string1 = firstString 
    string2 = second string with spaces 
    string3 = thirdString 

在試圖解決一個類似的問題這一點,我也陷入了UNIX的思考我的變量空間delimeted問題。我試圖通過使用awk來設置一系列後來用於創建報告的變量來將管道分隔字符串傳遞給函數。我最初嘗試了由ghostdog74發佈的解決方案,但無法讓它工作,因爲並非所有的參數都被引用。在爲每個參數添加雙引號後,它開始按預期工作。

下面是我的代碼之前的狀態,並在狀態之後完全運作。

前 - 未正常運行的代碼

#!/usr/bin/ksh 

#******************************************************************************* 
# Setup Function To Extract Each Field For The Error Report 
#******************************************************************************* 
getField(){ 
    detailedString="$1" 
    fieldNumber=$2 

    # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
    # And Strips Leading And Trailing Spaces 
    echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//' 
} 

while read LINE 
do 
    var1="$LINE" 

    # Below Does Not Work Since There Are Not Quotes Around The 3 
    iputId=$(getField "${var1}" 3) 
done<${someFile} 

exit 0 

之後 - 功能代碼

#!/usr/bin/ksh 

#******************************************************************************* 
# Setup Function To Extract Each Field For The Report 
#******************************************************************************* 
getField(){ 
    detailedString="$1" 
    fieldNumber=$2 

    # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
    # And Strips Leading And Trailing Spaces 
    echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//' 
} 

while read LINE 
do 
    var1="$LINE" 

    # Below Now Works As There Are Quotes Around The 3 
    iputId=$(getField "${var1}" "3") 
done<${someFile} 

exit 0 
0

爲我工作的簡單解決方案 - 報價$ @

Test(){ 
    set -x 
    grep "[email protected]" /etc/hosts 
    set +x 
} 
Test -i "3 rb" 
+ grep -i '3 rb' /etc/hosts 

我可以驗證實際grep命令(感謝set -x)。

0

解決這個問題的最簡單的辦法是,你只需要使用\「運行shell腳本 #!/bin/bash myFunction { echo $1 echo $2 echo $3 } myFunction "firstString" "\"Hello World\"" "thirdString"

相關問題