Bash関数でスペースを持つパラメータを解析する方法

Bash関数でスペースを持つパラメータを解析する方法

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 -aBashまたは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

関連情報