我正在编写一个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中的函数?


当前回答

在初始文本被设置为字符串类型变量的情况下,您可以对这个问题进行扩展,例如:

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变量作为字符串(由""包围)向前传递,它将被分割成不同参数的挂载。

"$variable":当前轨道是CDE at DEF by ABC

变量:美元

其他回答

在初始文本被设置为字符串类型变量的情况下,您可以对这个问题进行扩展,例如:

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变量作为字符串(由""包围)向前传递,它将被分割成不同参数的挂载。

"$variable":当前轨道是CDE at DEF by ABC

变量:美元

我遇到了同样的问题,事实上问题不在于函数本身,也不在于函数调用,而在于我传递给函数的参数。

该函数是从脚本的主体中调用的- 'main' -所以我从命令行传递"st1 a b" "st2 c d" "st3 e f",并使用myFunction $*将其传递给函数

$*会导致问题,因为它展开为一组字符,将在函数调用中使用空格作为分隔符进行解释。

解决方案是在显式参数处理中改变对函数的调用,从'main'转向函数:然后调用myFunction "$1" "$2" "$3",这将保留字符串中的空白,因为引号将分隔参数… 因此,如果一个形参可以包含空格,则应该在函数的所有调用中显式地处理它。

由于这可能是对问题进行长时间搜索的原因,因此永远不要使用$*来传递参数可能是明智的…

对我来说很简单的解决方案——引用$@

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

我可以验证实际的grep命令(多亏了set -x)。

这个问题最简单的解决方案是,当运行shell脚本时,你只需要使用“\”作为空格分隔的参数:

#!/bin/bash
myFunction() {
  echo $1
  echo $2
  echo $3
}
myFunction "firstString" "\"Hello World\"" "thirdString"

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

myFunction()
{
    # same as before
}

or:

function myFunction
{
    # same as before
}

不管怎样,它在Bash 3.2.48上看起来很好,对我来说也很好。