针对来自终端的参数列表执行 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 '{}' \;
偶尔,但不够经常需要为此编写脚本,我可能需要 运行 '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 '{}' \;