在 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 -a
Bash 或read -A
ksh/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