使用来自数组的参数运行命令

Flu*_*lux 7 bash

假设我有一个名为app. 用法示例:app -t 'first tab' -t 'second tab'在该程序中打开两个“标签”。

问题是:如果参数数量可以变化,我如何appbash脚本中执行命令(即)?

考虑一下:

#!/bin/bash
tabs=(
    'first tab'
    'second tab'
)

# Open the app (starting with some tabs).
app  # ... How to get `app -t 'first tab' -t 'second tab'`?
Run Code Online (Sandbox Code Playgroud)

我希望上述脚本具有等效于app -t 'first tab' -t 'second tab'. 这样的bash脚本怎么写?

编辑:请注意,问题是询问有关使用参数数组动态组合命令行参数的问题。

ilk*_*chu 10

从数组中提供参数很容易,"${array[@]}"将数组条目扩展为不同的单词(参数)。我们只需要添加-t标志。为此,我们可以遍历第一个数组,并为完整的参数列表构建另一个数组,同时添加-t标志:

#!/bin/bash
tabs=("first tab" "second tab")
args=()
for t in "${tabs[@]}" ; do 
    args+=(-t "$t")
done
app "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

使用"$@"而不是"${tabs[@]}"获取脚本的命令行参数而不是硬编码列表。

  • @ygoe,我不确定你在比较什么。引用实际上仅在首次处理 shell 命令行时才有意义。之后,最好考虑 shell“单词”或 shell 运行的命令的参数(shell“单词”可以包含空格,因此这是一个有点令人困惑的术语)。像“${args[@]}”这样的数组扩展将数组的每个元素扩展为单独的单词/参数,因此上面的工作方式类似于“app -t“第一个选项卡”-t“第二个选项卡””。如果有一些极端情况失败,请告诉我们。 (2认同)

Fed*_*rev 6

tabs=("-t" "one tab" "-t" "second tab")
echo app "${tabs[@]}"
app -t one tab -t second tab
Run Code Online (Sandbox Code Playgroud)

所以现在你应该将原始数组转换为带有“-t”标志的数组。希望这根本不是问题。