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

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

假设我有一个名为 的图形程序app。用法示例:app -t 'first tab' -t 'second tab'在该程序中打开两个“选项卡”。

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

考虑一下:

#!/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'`?

我希望上面的脚本具有相当于app -t 'first tab' -t 'second tab'.这样的bash脚本怎么写呢?

编辑:请注意,问题是询问如何使用参数数组即时组合命令行参数。

答案1

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

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

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

有关的:我们如何运行存储在变量中的命令?

答案2

tabs=("-t" "one tab" "-t" "second tab")
echo app "${tabs[@]}"
app -t one tab -t second tab

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

答案3

使用以下方法更容易zsh

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

app -t$^tabs

app就像您输入了一样:

app -t'first tab' -t'second tab'

rcesfish隐式执行此操作(zsh$^array实际上是受rc's启发^):

在那些贝壳里,

app -t$tabs

也会这样做。在 zsh 中,默认情况下您也可以通过使用 启用该rcexpandparam选项来获得该行为set -o rcexpandparam

在 ksh93、bash 和 zsh 中,您还可以使用${array[@]/pattern/replacement}ksh93 中的运算符:

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

app "${tabs[@]/#/-t}"

我们用 替换每个元素的(零宽度)开头-t,因此实际上是-t在每个元素之前添加。

调用app就像

app -t 'first tab' -t 'second tab'

相对于

app -t'first tab' -t'second tab'

这就是-t和是,first tab的两个不同参数:appzsh

app ${${:--t}:^^tabs}

使用${array1:^^array2} 数组压缩运算符,其中${:--t}( 的最小形式${var:-default})用于排队第一个数组。

答案4

基本上,以下bash脚本将逐行读取包含站点的文件,并在新选项卡中打开每个站点。

#!/bin/bash
while read line
do 
    xdg-open "$line"
done < /root/file

用法

./script.sh sites

相关内容