具有多个参数的Xargs
1. 概述
许多 Linux 命令同时支持标准输入 (Stdin) 和命令参数,例如*sed 、grep和awk *。
另一方面,一些命令不读取 Stdin 并且只支持参数——例如cp、rm和mv。所以,当我们想要以 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
所以,我们已经解决了这个问题。