1. 概要

多くのLinuxコマンドは、 sed grep awk など、標準入力(Stdin)とコマンド引数の両方をサポートしています。

一方、 cp rm mv など、一部のコマンドはStdinを読み取らず、引数のみをサポートします。 したがって、Stdinを入力としてこれらのコマンドを実行する場合は、Stdinを引数に変換する必要があります。 xargsコマンドはそれを行うために生まれました。

このチュートリアルでは、xargsコマンドを使用して複数の引数を処理する方法を学習します。

2. 複数の引数を使用する2種類のコマンド

コマンドは、次の2つのシナリオで複数の引数を持つことができます。

  • すべてのコマンド引数– COMMAND ARG1 ARG2 ARG3
  • オプション引数–たとえば、 COMMAND -a ARG1 -b ARG2 -c ARG3

このチュートリアルでは、 xargs を使用して複数の引数を処理する方法について説明します。もちろん、両方のシナリオについても説明します。

3. すべてのコマンド引数

3.1. threeWords.shスクリプト

まず、3つの引数を必要とするコマンドをシミュレートする簡単なシェルスクリプトを作成しましょう。

$ cat threeWords.sh
#!/bin/bash
if [[ "$#" != 3 ]]; then
    echo "[Error] Three arguments required."
    exit 1
fi

echo "The 1st argument is $1"
echo "The 2nd argument is $2"
echo "The 3rd argument is $3"

上記のcatの出力が示すように、threeWords.shスクリプトは3つの引数を個別に出力します。

3.2. スクリプトに3つの引数を渡す

3つの引数の位置は連続しているため、xargsにとっては問題ではありません。

$ echo "Tom Likes Jerry" | xargs ./threeWords.sh 
The 1st argument is Tom
The 2nd argument is Likes
The 3rd argument is Jerry

xargs コマンドは、Stdinを引数に変換できます。 また、プレースホルダーを使用して、必要な位置に引数を挿入することもできます。 ただし、Stdinからの引数の並べ替えなど、引数をさらに調整する場合は、xargsの作業は簡単ではありません。 たとえば、最初の引数として「 Jerry 」を渡し、3番目の引数として「Tom」を渡します。

これを解決する1つの方法は、データをxargsに渡す前に処理することです。

$ echo "Tom Likes Jerry" | awk '{ print $3, $2, $1 }' | xargs ./threeWords.sh
The 1st argument is Jerry
The 2nd argument is Likes
The 3rd argument is Tom

上記の例が示すように、データを xargs に渡す前に、awkに引数の並べ替えを依頼します。

4. オプション引数

4.1. 2つのオプションスタイル

引数構文規則によると、オプションには2つのタイプがあります。

  • -o-oARGなどのPOSIXオプション
  • –option–option =ARGなどの長いオプション

ご覧のとおり、両方のオプションタイプに引数を指定できます。 xargsコマンドは、オプションのスタイルに関係なく、オプションに引数を渡すために同じルールに従います。

したがって、このチュートリアルでは、POSIXオプションスタイルを例として取り上げます。

4.2. threeOptions.shスクリプト

繰り返しになりますが、引数付きの3つのオプションを受け入れるシェルスクリプトを作成しましょう。

$ cat threeOptions.sh
#!/bin/bash

while getopts ":A:B:C:" opt; do
  case $opt in
   A) echo "The argument for the option A is $OPTARG" ;;
   B) echo "The argument for the option B is $OPTARG" ;;
   C) echo "The argument for the option C is $OPTARG" ;;
   ?) echo "Unknown Option" 
      exit 1 ;;
  esac
done
shift "$(($OPTIND -1))"

スクリプトthreeOptions.shでは、getoptsを使用してオプションとその引数を解析しました。

4.3. スクリプトへの引数の受け渡し

今回は、引数は連続していません。

さらに、通常、オプションの順序はコマンドの実行に影響を与えないことがわかっています。 つまり、引数を正しい位置に自由に挿入するには、なんらかの方法で引数にインデックスを付ける必要があります

前述したように、xargsは引数を調整できません。 ただし、コマンドecho「TomLikesJerry」を学習しました| xargs a_shell_script は、「a_shell_script」に3つの引数を渡します。 もちろん、「 a_shell_script 」では、3つの引数に対してやりたいことが何でもできます。

したがって、実際のコマンドまたはスクリプトを「 a_shell_script 」でラップして、xargsコマンドからの引数を受け入れて調整することができます。

これを行う最も簡単な方法は、 bash -c’the_real_command -a arg1-barg2…’です。

bash -c’the_real_command .. “を使用する場合、最初の引数は$1ではなく$0に割り当てられることに注意する必要があります。

次に、私たちのアイデアが問題を解決するかどうかを見てみましょう。

$ echo "Tom Likes Jerry" | xargs bash -c './threeOptions.sh -A $0 -B $1 -C $2'
The argument for the option A is Tom
The argument for the option B is Likes
The argument for the option C is Jerry

引数にはインデックスが付けられているため、引数の順序を簡単に変更したり、どの引数をどのオプションに渡すかを決定したりできます。

Jerry」をオプション「A」に渡し、「Tom」をオプション「C」に割り当てたいとします。

$ echo "Tom Likes Jerry" | xargs bash -c './threeOptions.sh -A $2 -B $1 -C $0'
The argument for the option A is Jerry
The argument for the option B is Likes
The argument for the option C is Tom

だから、私たちは問題を解決しました。

5. 結論

xargs は、Stdinからの入力をコマンドの引数に変換するのに役立ちます。

この記事では、 xargs を使用して、例を通じてコマンドへの複数の引数を処理する方法について説明しました。