Bashは次の関数を呼び出します。
myFunction "1 2"
myFunction()
{
echo "$1"
echo "$2"
}
これにより、「1 2」と空白の行が印刷されます。ある行1と別の行2に印刷されるようにパラメータをどのように解析しますか?myFunction "1" "2"
パラメータが別の変数に保存されているため呼び出すことはできません
答え1
関数が受け取る最初の引数を空白文字に分割したいようです。これを行うには、スペースを区切り文字として使用するように分割を構成し、glob部分を無効にしてから、分割+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
(分割する部分が2つだけの場合):
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またはksh / zshでは、read -A
文字列を複数のフラグメントに分割して配列に配置できます。
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