2009-12-30 197 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"

相关问题