bash - 如何在复合 xargs 语句中设置 bash 变量
问题描述
我正在寻找一种在传递给 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 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}"
推荐阅读
- python - 如何将我的数据框分成两行,其中两列具有特定值?
- paperjs - 如何停止和启动 view.onFrame
- azure - 使用 VSTS 将角色分配给 Web 应用程序时出现授权错误
- android - 如何在 android 中检测整个面部(不是侧面,甚至不是面部隐藏的任何部分),就像 ios 中的 CI 面部检测器一样
- reactjs - mount(Component).debug() 给出了 emtpy 值
- apache-camel - 这条骆驼路线会在异常情况下确认消息吗?
- javascript - 无法让动画与 AMP 和 React 一起使用
- html - Flexbox最后一个子边距在Firefox中折叠
- docker - 码头工人无法读取地形文件
- c# - 使用 Kestrel 仅针对特定端口的 HTTPS 重定向(侦听混合端口)