Bash-string不';t在for循环中工作

Bash-string不';t在for循环中工作,bash,Bash,我想检索文件名的第一部分并遍历文件列表。文件名是成对的,我试图在每对上运行一个程序。这就是它们的样子: H1T1A-left.fastq.gz H1T1A-right.fastq.gz 我可以在-之后删除所有内容,以获得唯一的名称: for d in *left*; do echo $d | cut -d- -f1; echo "Mapping $NAME"; done H1T1A H1T1B H1T1C H1T2A H1T2B 但如果我想将其加载到变量“NAME”中,以便

我想检索文件名的第一部分并遍历文件列表。文件名是成对的,我试图在每对上运行一个程序。这就是它们的样子:

H1T1A-left.fastq.gz
H1T1A-right.fastq.gz
我可以在-之后删除所有内容,以获得唯一的名称:

for d in *left*; do
    echo $d | cut -d- -f1;
    echo "Mapping $NAME";
done

H1T1A
H1T1B
H1T1C
H1T2A
H1T2B
但如果我想将其加载到变量“NAME”中,以便将其传递给程序:

for d in *left*; do
    NAME = echo $d | cut -d- -f1;
    echo "Mapping $NAME";
done
我得到一个错误:

NAME: command not found
Mapping
NAME: command not found
Mapping
我希望能够将$NAME作为每对的文件名的一部分传递:

>program "$NAME"-left.file "$NAME"-right.file

等号周围不得有空格。
尽管这样做是可行的,包括引号:让“i=1+2”

删除赋值周围的空格
=
如果要将commnad的输出存储在某个变量中,请将该命令放入
$(yourcommand)


语法问题,请首先在此处尝试代码(),确保语法正确。然后在这里发布逻辑问题。我想取$d | cut-d--f1并将结果放入NAME中,这样我就可以使用文件名的第一部分了。Echo不是这样做的,那么它是如何工作的呢?这在for循环之外也不起作用。构建一个好的应用程序的一部分是在问题停止发生之前进行测试——如果您尝试删除循环,问题仍然会发生。我不知道Shellcheck,这太棒了,顺便说一句,您可以(而且应该!)不使用
剪切
;例如,
name=${d%%-*}
--如果您在一个目录下运行此程序,其中有几十个或数百个文件匹配
*left*
仅用于算术运算,您将看到性能上的巨大差异。(它也是过时的语法,不是POSIX sh标准的一部分,而是包含在bash中,以与POSIX之前的古老shell兼容)。请参见
echo“$d”
,而不是
echo$d
。如果
d='left*right'
(这是一个完全有效的文件名!),则
echo$d
将包含当前目录中所有文件的名称,前面是
left
,后面是
right
。另外,请注意,特别是“回答好的问题”部分,特别是关于“以前已经被询问和回答过很多次了”。此外,运行
NAME=${d%%-*}
会更加高效,这样可以避免运行子shell和旋转(外部,而不是bash的一部分)
cut
命令的性能成本。
 #!/bin/bash
    for d in *left*; do
        NAME=$(echo $d | cut -d- -f1)
        echo "Mapping $NAME";
    done