【发布时间】:2021-10-04 10:06:12
【问题描述】:
我有一个 bash 脚本,由我公司的某个前同事编写。它的 shellcheck 结果很糟糕,使用 zsh 的我无法运行该脚本。他似乎在 bash 中使用了臭名昭著的 find 和 for loop thingy。但我不知道如何让它变得更好。
目前我得到了一个临时修复。
这是他的密码
#!/bin/bash
releases=$(for d in $(find ${DELIVERIES} -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo ${d##*_} ; done)
for sr in ${releases[@]}
do
echo "Release $sr"
deliveries=$(find ${deliveries_path}/*${sr}/ -type f -name "*.ear" -o -name "*.war" | sort)
if [ ! -e ${sr}.txt ]
then
for d in ${deliveries[@]}
do
echo "$(basename $d)" | tee -a ${sr}.txt
done
fi
echo
done
这是我的代码,甚至可以循环第一部分。
#!/bin/bash
for release in $(for d in $(find "${DELIVERIES}" -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo "${d##*_}" ; done)
do
echo "Release $release"
done
如您所见,我需要将 find 放入循环中,但无法将其保存在变量中,因为当我尝试循环时,它会尝试将 \n 放在任何地方,它就像一个元素?任何人都可以建议我应该如何解决这个问题,因为这位以前的同事经常使用这种查找搜索。
编辑:
脚本以特定名称访问每个文件夹,然后创建一个 X.X.X.txt 文件,其中 X 部分中的版本号。并将子文件夹内的文件名附加到 X.X.X.txt
【问题讨论】:
-
如果您专门询问 Bash,为什么要将此标记为 zsh?
-
如果不知道它应该处理的目录及其内容的含义,我们可能比您理解的还要少。您能否请edit 澄清脚本应该做什么?
-
它应该返回一个版本中更改的“模块、文件”列表,这是我拥有的最好的文档。
-
我们无法猜测这些目录包含哪些文件或它们是如何组织的。
-
@TaaviAnsper:真正可怕的是——特别是如果你被 zsh 修饰——脚本不太关心分词。在 zsh 中,当您有
${deliveries_path}时,您知道这是一个参数。在 bash 中,这会进行分词,这意味着代码会中断 fideliveries_path包含一个空格。但是这么小的脚本,你为什么不在zsh中从头重写呢,因为你更熟悉zsh而不是bash?