首页 > 解决方案 > 将命令行参数附加到 Bash 数组

问题描述

我正在尝试编写一个将字符串附加到 Bash 数组的 Bash 脚本,其中字符串包含 Python 脚本的路径以及传递给 Bash 脚本的参数,用双引号括起来。

如果我使用 调用脚本./script.sh -o "a b",我希望 CMD_COUNT 为 1,但我得到的是 2。

脚本.sh:

#!/bin/bash

declare -a COMMANDS=()
COMMANDS+=("/path/to/myscript.py \"${@}\"")
CMD_COUNT=${#COMMANDS[*]}
echo $CMD_COUNT

如何确保附加的字符串是/path/to/myscript.py "-o" "a b"

编辑:完整的脚本实际上是这样的:

脚本.sh:

#!/bin/bash

declare -a COMMANDS=()
COMMANDS+=("/path/to/myscript2.py")
COMMANDS+=("/path/to/myscript.py \"${@}\"")
CMD_COUNT=${#COMMANDS[*]}
echo $CMD_COUNT

for i in ${!COMMANDS[*]}
do
    echo "${0} - command: ${COMMANDS[${i}]}"
    ${COMMANDS[${i}]}
done

标签: bash

解决方案


这是一个坏主意,但如果它是你真正想要的,printf %q可用于生成一个字符串,当由 shell 解析时,将产生一个给定的参数列表。(确切的转义可能与您手写的内容不同,但评估它的效果- 使用eval- 将是)。

#!/bin/bash

declare -a COMMANDS=( )

printf -v command '%q ' "/path/to/myscript" "$@"
COMMANDS+=( "$command" )
CMD_COUNT=${#COMMANDS[@]}
echo "$CMD_COUNT"

...但是,正如我所说,这都是一个坏主意。


推荐阅读