在bash中用空格作为函数parameter passing一个string

我正在写一个bash脚本,我需要将包含空格的string传递给我的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 

有没有办法传递一个string与空格作为一个单一的参数在bash中的函数?

你应该把引号和你的函数声明是错误的。

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

和其他人一样,它也适用于我。 告诉我们你使用的是什么版本的shell。

上述问题的另一个解决scheme是将每个string设置为一个variables,调用函数的variables表示一个字面美元符号\$ 。 然后在函数中使用eval来读取variables并按照预期输出。

 #!/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思维的问题,我的variables是空间分隔。 我正在尝试使用awk将pipe道分隔string传递给函数,以设置稍后用于创build报表的一系列variables。 我最初尝试由ghostdog74发布的解决scheme,但不能得到它的工作,因为不是所有的参数都被引用。 在为每个参数添加双引号之后,它开始按预期工作。

下面是我的代码之前的状态,并在状态之后完全运作。

之前 – 非function代码

 #!/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 

后置function代码

 #!/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 

你的myFunction的定义是错误的。 它应该是:

 myFunction() { # same as before } 

要么:

 function myFunction { # same as before } 

无论如何,它看起来很好,并在Bash 3.2.48上正常工作。

如果您的初始文本被设置为stringtypesvariables,则可以对此问题进行扩展,例如:

 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 } 

在这种情况下,如果不以string方式向前传递status_messagevariables(由“”包围),它将被拆分成一堆不同的参数。

“$ variable” :当前曲目是由ABC定义的CDE

$variables :的

简单的解决scheme,为我工作 – 引用$ @

 Test(){ set -x grep "$@" /etc/hosts set +x } Test -i "3 rb" + grep -i '3 rb' /etc/hosts 

我可以validation实际的grep命令(感谢设置-x)。

有同样的问题,其实问题不是function,也不是函数调用,而是我作为parameter passing给函数。

该函数是从脚本的主体调用的 – “主” – 所以我从命令行传递“st1 ab”“st2 cd”“st3 ef”并使用myFunction $ *传递给函数

$ *会导致问题,因为它扩展成一组字符,这些字符将在使用空格作为分隔符的函数调用中被解释。

解决的办法是在显式参数处理中将函数的调用从main调用到函数中:调用将是myFunction“$ 1”“$ 2”“$ 3”,这将保留string内的空白字符,因为引号会分隔参数…所以如果一个参数可以包含空格,那么应该在所有的函数调用中明确地处理。

因为这可能是长时间search问题的原因,所以从不使用$ *来传递参数是明智的。

希望这有助于某个人,某天,某个地方…