gpt4 book ai didi

bash - 在 Bash 中动态构建命令管道

转载 作者:行者123 更新时间:2023-11-29 09:45:32 24 4
gpt4 key购买 nike

我正在编写一个接受选项的 bash 程序。

例如:./my_program -l 3 -a -s

  • -l 3 将输出限制为三行
  • -a 将选择我所有的文件
  • -s 将对输出进行排序

现在,我可以通过这种方式一次使用两个选项:

if [ $all == 1 ]
then
if [ $sort == 1 ]
then
printf '%s\n' "${haikus[@]}" | sed -e 's/^[ \t]*//' | sort
else
printf '%s\n' "${haikus[@]}" | sed -e 's/^[ \t]*//'
fi
fi

如果 -a 选项,我打印整个文件,或者,如果 -a 选项和 -s 选项,我使用相同的命令,但我使用 sort

使用这个解决方案,如果我想实现 -l,它会创建很多“if”语句。

我首先想到创建一个包含我的命令的变量。

示例:

sort='sort'
limit='grep -m3'

然后这样写我的命令:

printf '%s\n' "${haikus[@]}" | sed -e 's/^[ \t]*//' | $sort | $limit

但这根本行不通。

事实是,我想编写一个基本命令,并能够根据选项添加更多命令。

如果没有大量的“if”语句,我如何正确地做到这一点?

最佳答案

很好的问题和一个棘手的、不太明显的解决方案。

您可以将几个函数调用链接在一起。这些函数可以检查相关标志,然后“做某事”,如调用 sort 或“什么都不做”,只需调用 cat。管道中的普通 cat 调用本质上是空操作:它将 stdin 原封不动地复制到 stdout。

maybe_sort() {
if [[ $sort == 1 ]]; then
sort
else
cat
fi
}

maybe_limit() {
if [[ -n $limit ]]; then
head -n "$limit"
else
cat
fi
}

要使用这些,您需要编写:

printf '%s\n' "${haikus[@]}" | sed -e 's/^[ \t]*//' | maybe_sort | maybe_limit

关于bash - 在 Bash 中动态构建命令管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538881/

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