针对来自终端的参数列表执行 shell 脚本

execute a shell script against a list of arguments from the terminal

偶尔,但不够经常需要为此编写脚本,我可能需要 运行 'foo' 反对一组论点。它可能会改变哪个参数是静态的与哪个是列表,并且它可能会改变列表的长度。

为了说明我正在尝试做的事情,请考虑

rm ./$(ls -lrt foo | awk '{print }')

作为我试图实现的相同功能的演示(当然除了这种语法 rm 是交互式的,有问题的脚本不会,但是 rm 对给定的参数集执行操作它)而不是,例如

foo 1 2a 3; foo 1 2b 3; foo 1 2c 3

是否有一些来自终端的语法(这个系统可以访问 ksh88 或 bash),例如

foo 1 $(2a,2b,2c) 3

或类似的,这样我就可以输入一次脚本和常量参数并仅自动化当前需要的部分?所需的 args 可能是顺序的,也可能不是顺序的,或者是使用 for 循环有意义的模式。所以我会列出,无论是 csv 还是其他某种方式,每一个都明确地列出,而不能通过任何其他命令的输出提供它。

我确信任何 shell 都能够按照我的意图进行操作,我只是没有办法测试在生产之外可能会起作用的方法。

提前致谢。

编辑:2a-2c 可能没有说明得那么准确,arg 可能是 (apple,banana,orange) 即它们不一定是 2(a..c) 这样简单的术语。

一个简单的 shell 循环:

for arg in apple banana orange; do
    foo 1 "$arg" 3
done

或 while-read 循环:

some_process_that_generates_arguments | while IFS= read -r line; do
    foo 1 "$line" 3
done

# usually better to write that like this:
while IFS= read -r line; do
    foo 1 "$line" 3
done < <(some_process_that_generates_arguments)

或者用xargs

some_process_that_generates_arguments | xargs -I ARG foo 1 ARG 3

演示

$ seq 5 8 | xargs -I ARG echo first ARG last
first 5 last
first 6 last
first 7 last
first 8 last

在您的问题中,使用 ls 表示您想对文件进行处理。 ls 是错误的工具:您应该使用 shell glob 或 find.

假设您要查找目录“foo”下的所有文件

shopt -s globstar nullglob
for path in foo/**; do
    [[ -f $path ]] || continue
    do_something_with "$path"
done

find foo -type f -exec do_something_with '{}' \;