Contents

具有多个参数的Xargs

1. 概述

许多 Linux 命令同时支持标准输入 (Stdin) 和命令参数,例如*sed grepawk *。

另一方面,一些命令不读取 Stdin 并且只支持参数——例如cprmmv。所以,当我们想要以 Stdin 作为输入来执行这些命令时,我们需要将 Stdin 转换为参数。xargs命令就是为此而生的。

在本教程中,我们将学习如何使用 xargs命令来处理多个参数。

2. 两种使用多参数的命令

在两种情况下,命令可以有多个参数:

  • 所有命令参数 – COMMAND ARG1 ARG2 ARG3
  • 选项参数——例如,COMMAND -a ARG1 -b ARG2 -c ARG3

在本教程中,我们将介绍如何使用xargs处理多个参数,当然,我们将涵盖这两种情况。

3.所有命令参数

3.1. threeWords.sh脚本

首先,让我们创建一个简单的 shell 脚本来模拟需要三个参数的命令:

$ 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.2. 将三个参数传递给脚本

由于三个参数的位置是连续的,这对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 ”作为第一个参数,“ Tom ”作为第三个参数。

解决它的一种方法是我们在将数据移交给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. 两种期权样式

根据参数语法约定 ,有两种类型的选项:

  • POSIX 选项,例如*-o-o ARG*
  • 长选项,例如*–option–option=ARG*

正如我们所见,两种选项类型都可以有参数。xargs命令遵循相同的规则将参数传递给选项,而不管选项样式如何。

因此,在本教程中,我们将以 POSIX 选项样式为例。

4.2. threeOptions.sh脚本

同样,让我们创建一个 shell 脚本来接受三个带参数的选项:

$ 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 “Tom Likes Jerry” | xargs a_shell_script会将三个参数传递给“ a_shell_script ”。当然,在“ a_shell_script ”中,我们可以对这三个参数做任何我们想做的事情。

因此,我们可以将实际命令或脚本包装在“ a_shell_script ”中,以接受和调整来自xargs命令的参数。

最简单的方法是bash -c ’the_real_command -a arg1 -b arg2 …’

我们需要记住,如果我们使用bash -c ’the_real_command ..",第一个参数将分配给$0而不是$1。**

接下来,让我们看看我们的想法是否会解决问题:

$ 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

所以,我们已经解决了这个问题。