如何解析 bash 函数中带有空格的参数

如何解析 bash 函数中带有空格的参数

在 bash 中我调用函数:

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

这会打印“1 2”和空行。我如何解析参数,使其打印在一行 1 和另一行 2 上?我无法调用,myFunction "1" "2" 因为参数存储在其他变量中

答案1

听起来您想将函数收到的第一个参数拆分为空格字符。为此,您可以在将分割部分配置为使用空格作为分隔符并禁用 glob 部分后使用 split+glob 运算符:

myfunction() {
  local -       # make changes to options local to the function.
                # needs bash 4.4 or newer.
  local IFS=' ' # split on space only
  set -o noglob # disable glob part
  set -- $1     # split+glob invoked on $1 by leaving that $1 unquoted,
                # result stored in $1, $2... using set --
  printf '%s\n' "$1"
  printf '%s\n' "$2"
}
myfunction "1 2"

答案2

这与在空格上分割任何变量相同。使用分词或read

通过分词:

var="foo bar"
set -f              # disable globbing
IFS=' '             # make sure IFS contains (just) a space
printf "%s\n" $var  

对于read标准 shell(如果您知道只有两部分可以拆分):

var="foo bar"
IFS=' ' read a b <<EOF
$var
EOF
printf "%s\n" "$a" "$b" 

与此处字符串 (Bash/ksh/zsh) 相同:

var="foo bar"
IFS=' ' read a b <<< "$var"
printf "%s\n" "$a" "$b" 

read -aBash 或read -Aksh/zsh 中,您可以将字符串拆分为任意数量的片段并将它们放入数组中:

var="foo bar"
IFS=' ' read -a arr <<< "$var"     # Bash
printf "%s\n" "${arr[@]}"

在以上所有内容中,您都可以$1$var往常一样使用。

的变体read还假设字符串不包含多行。

但是,在 Bash 中,您还可以使用任何空格作为分隔符将多行字符串拆分为数组:

IFS=$' \t\n' read -d '' -a arr <<< "$var"

当然,如果您将字符串放在函数外部的变量中,并且运行myFunction $var,则在函数运行之前该变量将被拆分为多个参数。

答案3

尝试这样,

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

myFunction 1 2

相关内容