如何在复合xargs语句中设置bash变量

时间:2018-06-25 01:02:51

标签: bash xargs

我正在寻找一种在传递给xargs的语句中设置变量的方法。该值将在命令之一中进行操作。可以选择使用文件或其他实用程序,但是我不确定为什么在序列中设置bash变量总是总是为空。

$ ls c*txt
codebase.txt  consoleText.txt

$  ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo ${v1/txt/file}"
codebase.txt  consoleText.txt

processing codebase.txt

processing consoleText.txt

上面的示例将问题提炼为基础。我期望行为是这样的,但是内联:

$ fname=codebase.txt; echo ${fname/txt/file}
 codebase.file

谢谢。

1 个答案:

答案 0 :(得分:2)

此行将${v1/txt/file}解析为执行命令之前的值:

$  ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo ${v1/txt/file}"

这意味着bash -c甚至看不到${v1/txt/file}

在这一行中,单引号禁止变量替换,因此echo processing {}; v1={} && echo ${v1/txt/file}实际上作为参数传递给bash -c:

$  ls c*txt | xargs -i bash -c 'echo processing {}; v1={} && echo ${v1/txt/file}'

您可以通过转义美元符号来完成同样的事情:

$  ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo \${v1/txt/file}"