shell 无法识别函数中的全局模式参数,并且在bash中找不到文件

ql3eal8s  于 2023-03-19  发布在  Shell
关注(0)|答案(1)|浏览(149)

我正在尝试编写一个bash脚本,并将一些全局模式作为参数传递给一个复杂函数。但是,该函数无法识别全局模式,并且我收到了一个提示,

EXITING because of fatal input ERROR: could not open readFilesIn=ABC001_2_good_????.txt

我正在使用的函数,

cat acc.txt | xargs -I{} ...--readFilesIn $Dir/{}_1_good_????.txt .....

acc.txt包含登录列表,例如ABC001、ABC002、ABC003。
先谢谢你。

mw3dktmi

mw3dktmi1#

问题是shell扩展了通配符(或尝试),然后将它们作为参数传递给xargs。这意味着它正在查找名称以“{}1_good"开头的文件,因此失败。由于没有匹配,因此传递(未展开)转换为xargs,它将“{}”替换为实际的前缀,但此时要将????部分视为通配符已经太晚了。
在我看来,最简单的解决方案是使用shell循环而不是xargs

while read prefix; do
    STAR .... --readFilesIn "$Dir/${prefix}_1_good_"????.fq "$Dir/${prefix}_2_good_"????.fq --outFileNamePrefix .......
done <acc.txt

在这种形式中,shell将替换$Dir${prefix},然后 * 再 * 扩展通配符,所以它应该可以工作,但是要注意,如果它找到多个匹配项,它将继续包含所有匹配的文件,这可能会混淆STAR工具。
顺便说一句,如果你使用$prefix_1_good_,它会把_1_good_当作变量名的一部分,所以你必须使用${prefix}而不仅仅是$prefix。我还在变量扩展周围添加了双引号,因为这是很好的通用脚本卫生。

相关问题