Bash脚本中sed命令无法解析用户参数$1的问题求助
解决Bash脚本中sed命令变量未解析的问题
问题根源
你的sed命令使用了单引号包裹字符串,而Bash中单引号内的变量不会被Shell解析,所以$1被当作普通文本输出,而非脚本接收的第一个参数。
解决方案1:修改sed的引号规则
把sed命令中的单引号改成双引号,让Shell能解析$1:
sed -i "/^Hostname.*/a User\t$1" config.txt
如果想让代码更清晰,可以先把参数赋值给变量再使用:
TARGET_USER="$1" sed -i "/^Hostname.*/a User\t$TARGET_USER" config.txt
解决方案2:直接在jq中生成User行(更高效)
没必要先生成配置再用sed追加,直接在jq的输出里加上User行,减少文件操作步骤:
#!/bin/bash echo "user : $1" VPC="$(aws ec2 describe-vpcs | jq -r '.Vpcs[] | .VpcId')" # 初始化配置文件,避免重复执行残留旧内容 > config.txt for x in $VPC do echo "$x" aws ec2 describe-instances --filters "Name=vpc-id,Values=$x" | jq -r --arg user "$1" '.Reservations[].Instances[] | (.Tags[]//[]|select(.Key=="Name")|.Value) as $name | "Host \($name)\nHostname \(.PrivateIpAddress)\nUser \($user)"' >> config.txt done cat config.txt
这里用jq的--arg参数把Shell的$1传递给jq变量,直接生成完整的SSH配置行,同时用>>追加到文件,避免每次循环覆盖内容。
内容的提问来源于stack exchange,提问作者Vanaan
相关产品推荐
相关产品推荐

