求助:如何将Bash参数列表中的{}替换为首个参数
解决Bash参数列表中替换特定参数的问题
你的问题核心是搞错了sed的用法,同时没处理好Shell变量的展开,我来一步步帮你理清:
为什么你的命令会报错?
sed -i是用来修改文件内容的:你把"$@"(即所有命令行参数)传给sed,它会把每个参数当成要修改的文件名,自然找不到名为{}的文件,这就是报错cannot stat '{}'的原因。- 单引号里的变量不会被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
相关产品推荐
相关产品推荐

