bash - 将命令行参数附加到 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
解决方案
这是一个坏主意,但如果它是你真正想要的,printf %q
可用于生成一个字符串,当由 shell 解析时,将产生一个给定的参数列表。(确切的转义可能与您手写的内容不同,但评估它的效果- 使用eval
- 将是)。
#!/bin/bash
declare -a COMMANDS=( )
printf -v command '%q ' "/path/to/myscript" "$@"
COMMANDS+=( "$command" )
CMD_COUNT=${#COMMANDS[@]}
echo "$CMD_COUNT"
...但是,正如我所说,这都是一个坏主意。
推荐阅读
- rotativa - asp.net核心中的rotativa pdf不能有页眉和页脚
- angular - 以编程方式关闭组件对话框Angular 2
- r - 无法在 R 中安装 catboost
- kotlin - 在方法开始处使用箭头符号(->)的目的是什么?
- javascript - 批量大小为 0 或 NaN。请选择一个非零分数
- jenkins - aws cloudformation deploy 在添加 --tags 时失败
- xslt - fop xslt 转换后 pdf 中的可选列
- unit-testing - 在 jest/enzyme 中将 e.target 作为 DOM 节点发送
- php - 内部联接和按日期过滤不起作用会引发完整性约束违规错误
- angular-material - 角材料主题