假设我有一个名为 的图形程序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'
rc
,es
并fish
隐式执行此操作(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
的两个不同参数:app
zsh
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