gpt4 book ai didi

linux - 如何在 bash 中创建动态命令?

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:17 25 4
gpt4 key购买 nike

我想在一个变量中包含一个命令,该命令运行一个程序并根据退出的文件数量指定它的输出文件名(每次处理一个新文件)。

这是我所拥有的:

导出 MY_COMMAND="myprogram -o ./dir/outfile-0.txt"

但是,我希望每次执行 MY_COMMAND 时都会增加此 outfile 数量。您可能认为 myprogram 在下一次调用之前很快就创建了该文件。因此可以从目录 ./dir/ 中存在的文件数量来检索该数量。我无权更改 myprogram 本身或使用 MY_COMMAND

提前致谢。

最佳答案

鉴于您无法更改myprogram — 它的-o选项将始终写入命令行上给出的文件,并假设您无法控制的某些东西正在运行 MY_COMMAND所以你不能改变 MY_COMMAND 的方式被调用,您仍然可以控制 MY_COMMAND

对于这个答案的其余部分,我将更改名称 MY_COMMANDcallprog主要是因为它更容易打字。

您可以定义callprog作为变量,如您的示例 export callprog="myprogram -o ./dir/outfile-0.txt" ,但您可以编写一个 shell 脚本并将其命名为 callprog ,并且 shell 脚本几乎可以做任何您想做的事情。

所以,你有一个充满 outfile-<num>.txt 的目录文件,并且您想要输出到下一个不冲突的 outfile-<num+1>.txt .

你的 shell 脚本可以通过列出文件、仅删除数字、对它们进行排序、然后取最大的数字来获取数字。

如果我们在dir中有这些文件:

outfile-0.txt
outfile-1.txt
outfile-5.txt
outfile-10.txt

ls -1 ./dir/outfile*.txt生成列表

./dir/outfile-0.txt
./dir/outfile-1.txt
./dir/outfile-10.txt
./dir/outfile-5.txt

(使用 outfile.txt 意味着即使存在名称不为 outfile 的其他文件,这也将起作用)
通过流编辑器管道来刮掉数字 sed ...捕获数字并仅保留该部分:

ls -1 ./dir/outfile*.txt | sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:'

(我使用冒号 : 而不是标准斜杠 /,因此我不必转义 dir/outfile 中的目录分隔符)

现在您只需选择最大的数字即可。对数字进行排序并取顶部

| sort -rn | head -1

-n 排序是数字,而不是字典排序,-r反转,因此最大的数字将是第一个,而不是最后一个。

将它们放在一起,这将列出文件,编辑名称,保留数字部分,排序,并仅获取第一个条目。您想将其分配给一个变量来使用它,所以它是:

high=$(ls -1 ./dir/outfile*.txt | sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:' | sort -rn | head -1)

在 shell 中(我使用的是 bash)你可以对此进行数学计算,$[high + 1]因此,如果 high 为 10,则表达式会生成 11
您可以使用它作为文件名的数字部分。

整个 shell 脚本只需要在文件名中使用该数字即可。这是为了更好的可读性而断行的:

#!/bin/sh

high=$(ls -1 ./dir/outfile*.txt \
| sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:' \
| sort -rn | head -1)

echo "myprogram -o ./dir/outfile-$[high + 1].txt"

当然,您不会回显我的程序,您只需运行它即可。

关于linux - 如何在 bash 中创建动态命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58019973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com