将数组中的每个项目作为标志参数传递给bash中的命令

时间:2018-10-10 21:13:01

标签: bash

我想知道如何将数组中的每个项目作为参数传递给命令中的标志。

例如

myCommand -f foo1 -f foo2, ... -f fooN

我想定义一个这样的数组

FOOS=("foo1" "foo2" ... "fooN")

并遍历数组以在示例中用作-f标志。

就我而言,我想将目录中的每个文件传递给某个命令,每个命令都使用-f命令。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

最可靠的解决方案是手动构建第二个列表:

CREATE TABLE Ship (
    shipID varchar(30) NOT NULL,
    pilot1_SIN varchar(11) NOT NULL,
    pilot2_SIN varchar(11) NOT NULL,
    years_in_operation INT,
    num_of_seats INT,
    manufacturer varchar(30),
    advertising_revenue FLOAT,
    fuel_type varchar(15)
    PRIMARY KEY (shipID, pilot1_SIN, pilot2_SIN),
    FOREIGN KEY (pilot1_SIN) REFERENCES Pilot(SINumber),
    FOREIGN KEY (pilot2_SIN) REFERENCES Pilot(SINumber),
    CONSTRAINT check_pilots CHECK (pilot1_SIN != pilot2_SIN)
);

没有真正简单的方法来做到这一点。您可以使用字符串替换在每个项目之前添加args=() for foo in "${FOOS[@]}"; do args+=(-f "$foo"); done myCommand "${args[@]}" 。它将一直工作到其中一个参数具有空格或glob,然后才没有。

"-f "

(请注意myCommand ${FOOS[@]/#/-f } 周围的缺乏。)

答案 1 :(得分:1)

如果该命令允许直接附加标志及其参数(例如myCommand -ffoo1 -ffoo2 ...),则可以通过在扩展时将-f附加到数组元素上来直接做到这一点:

myCommand "${FOOS[@]/#/-f}"

...但是,当然,并非所有命令都允许这样做。空(零长度)参数还存在潜在的问题;它们与分别传递的参数没有区别,因此此技巧将导致以下标志被误解析为空参数。

请注意,某些命令允许使用带有=分隔参数的长格式标志(例如myCommand -file=foo1 -file=foo2 ...),在这种情况下这将起作用,并且不适用于空参数的问题。