You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何将Bash参数列表中的{}替换为首个参数

解决Bash参数列表中替换特定参数的问题

你的问题核心是搞错了sed的用法,同时没处理好Shell变量的展开,我来一步步帮你理清:

为什么你的命令会报错?

  1. sed -i是用来修改文件内容的:你把"$@"(即所有命令行参数)传给sed,它会把每个参数当成要修改的文件名,自然找不到名为{}的文件,这就是报错cannot stat '{}'的原因。
  2. 单引号里的变量不会被Shell解析:就算sed的用法没错,'s/{}/"$1"/g'里的$1会被当成字符串"$1",而不是实际的第一个参数值。

正确的解决方案:用Bash数组处理参数替换

Bash本身就有强大的参数处理能力,无需借助sed。我们可以把参数存入数组,遍历替换每个元素中的{},再执行处理后的命令:

脚本实现示例

#!/bin/bash

# 将所有参数存入数组
args=("$@")

# 遍历数组,把每个元素里的{}替换为第一个参数$1
for index in "${!args[@]}"; do
    args[$index]=${args[$index]//\{\}/$1}
done

# 执行处理后的命令
"${args[@]}"

测试用法

假设脚本名为replace_args.sh,赋予执行权限后运行:

./replace_args.sh /home/text.c /bin/mv {} ~/.trash

这会实际执行:/bin/mv /home/text.c ~/.trash,完美实现你想要的替换效果。

命令行直接处理(无需脚本)

如果只是临时在命令行处理,也可以这么做:

# 先设置参数列表
set -- /home/text.c /bin/mv {} ~/.trash
# 存入数组并替换
args=("$@")
for i in "${!args[@]}"; do args[$i]=${args[$i]//\{\}/$1}; done
# 执行命令
"${args[@]}"

关键知识点解释

  • ${var//pattern/replacement}:这是Bash的全局参数扩展语法,会把变量var中所有匹配pattern的部分替换成replacement。这里我们用\{\}匹配字符串{}(因为{}在参数扩展中有特殊含义,需要转义)。
  • "${args[@]}":展开数组时加双引号可以保留参数中的空格等特殊字符,确保命令执行正确。

内容的提问来源于stack exchange,提问作者tethys4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:59