如何在xargs中重复两次变量


21

在此示例中,我如何也可以使第二个回显回显测试:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var这会给您:没有这样的文件或目录。

Answers:


27

只需{}在命令中编写两次即可。以下将起作用:

$ echo test | xargs -I {} echo {} {}
test test

您的问题是命令如何嵌套。让我们看一下:

echo test | xargs -I {} echo {} && echo {}

bash将执行echo test | xargs -I {} echo {}。如果运行成功,echo {}则执行。要更改嵌套,您可以执行以下操作:

echo test | xargs -I {} sh -c "echo {} && echo {}"

但是,您可能会遇到麻烦,因为该方法可能易于代码注入。当用外壳程序代码替换“ test”时,将执行它。因此,您可能应该将输入与参数一起传递给嵌套外壳。

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
请注意,如果您有一个文件callod(字面意思是),则在最后的代码中将得到意外的结果$(rm -f *)。最好这么做xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
库萨兰达

@Kusalananda,谢谢。我知道了这个问题,但是当时我想不出一个简单的解决方案。我将您的建议整合到了答案中。
JojOatXGME


0

对我来说,只有小写字母有效。我在目录中有数百张图片,并希望将它们的来源放入列表中。大写的我-I选项对我不起作用。仅小写。可能是由于版本差异所致。这些图像的名称都像Daniel_(somenumber).jpg

此语法有效:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

返回值:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux版本4.14.96-hw +#80 SMP x86_64 GNU / Linux


2
我为您的答案添加了一些格式,以使其更具可读性。我希望我已经正确理解了。
fra,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.