linux $@的正确变量插值

0g0grzrc  于 2023-02-03  发布在  Linux
关注(0)|答案(2)|浏览(139)
#!/bin/bash
TARGET_ENV="$1"
shift
commandid=$(aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets Key=tag:Name,Values=$TARGET_ENV \
    --parameters '{"commands":["su -c \"./'$@'\" - ec2-user"]}' \
    --query 'Command.CommandId' \
    --output text)

echo $commandid

(ssm_跑步者. sh)
我的ec2示例有一个名为hello_world. sh的脚本,它打印hello world和echo.sh,后者接受参数并回显它。
以下工程

ssm_runner.sh dev hello_world.sh

但这个没有

ssm_runner.sh dev echo.sh hello
dtcbnfnu

dtcbnfnu1#

#!/bin/bash

TARGET_ENV="$1"
shift

# Compose a complete su command which can be safely interpreted with
# `eval` or `bash -c`.
printf -v cmd '%q ' "$@"
su="su -c ./${cmd% } - ec2-user"

# Create JSON using jq.
params=$(jq -c --arg su "$su" '.commands = [$su]' <<< '{}')

# Execute.
commandid=$(aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets Key=tag:Name,Values="$TARGET_ENV" \
    --parameters "$params" \
    --query 'Command.CommandId' \
    --output text)

echo "$commandid"
xxb16uws

xxb16uws2#

您可以执行以下操作。
1.在ssm_runner.sh脚本中,将位置参数变量$@的单引号改为双引号,并使其从第二个参数开始,该参数对应于您将通过终端调用传递的脚本。

--parameters '{"commands":["su -c \"./'$@'\" - ec2-user"]}' \
    --parameters '{"commands":["su -c \"./"${@:2}"\" - ec2-user"]}' \

请注意,${@:2}代表从第二个参数开始的 * 位置参数变量 *。
1.接下来就是这样调用脚本:

ssm_runner.sh dev "echo.sh hello"
                  --- ---------------
                   |         |
                  1st        --> 2nd pos. arg. as a single one thanks to quotation.
                pos. arg.
              we will ignore.

基本上,您需要您的echo.sh成为su -c <...>发现要执行的第一件事,也就是说,修剪掉dev并将其余部分作为参数保留,使用位置参数。

相关问题