【问题标题】:execute a shell script against a list of arguments from the terminal针对来自终端的参数列表执行 shell 脚本
【发布时间】:2021-07-07 16:03:57
【问题描述】:

偶尔,但不足以需要为其编写脚本,我可能需要针对一组参数运行“foo”。它可能会改变哪个参数是静态的,哪个是列表,它可能会改变列表的长度。

为了说明我想要做什么,请考虑

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

作为我试图实现的相同功能的演示(当然除了这个语法 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 都能够做我想做的事情我只是没有办法测试在生产之外可能工作的东西。

提前致谢。

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

【问题讨论】:

  • echo 1 2{a,b,c} 3 => 1 2a 2b 2c 3,所以也许试试foo 1 2{a,b,c} 3?如果这不能解决您的问题,那么我们将需要更多详细信息和/或示例
  • 当然这并不能回答您的问题,但请注意,rm ./$(ls -lrt foo | awk '{print $9}') 是一个相当严重的反模式——文件名带有空格时会严重失败,不能保证在整个文件名中都能正常工作一系列符合 POSIX 的ls 实现等。另请参阅Why you shouldn't parse the output of ls
  • 太棒了for i in a b c; do foo 1 2$i 3; done?
  • @CharlesDuffy 谢谢你提供的信息。我只是将它用于说明目的,因为它的工作原理促使我考虑我可以在输入数据方面变得多么聪明,而不必为不常见或一次性的情况制作尽可能多的脚本和函数。

标签: bash ksh


【解决方案1】:

一个简单的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 '{}' \;

【讨论】:

  • for 肯定会起作用,只是在一行中有点多。在这种情况下, xargs 将无济于事,但这是我为未来所指出的。假设没有其他顿悟,这可能是我必须坚持的,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2015-12-08
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多