在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问题的原因,所以从不使用$ *来传递参数是明智的。
希望这有助于某个人,某天,某个地方…