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

如何在复合xargs语句中设置bash变量,bash,xargs,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

我正在寻找一种在传递给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

谢谢。

在执行命令之前,此行正在将
${v1/txt/file}
解析为一个值:

$  ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo ${v1/txt/file}"
这意味着bash-c甚至没有看到
${v1/txt/file}

在这行中,单引号禁止变量替换,因此
echo处理{};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}"

在执行命令之前,此行正在将
${v1/txt/file}
解析为一个值:

$  ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo ${v1/txt/file}"
这意味着bash-c甚至没有看到
${v1/txt/file}

在这行中,单引号禁止变量替换,因此
echo处理{};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}"

它从父环境中提取$v1—您需要单引号来禁止变量替换。它从父环境中提取$v1—您需要单引号来禁止变量替换。