Linux Bash if语句适用于一种情况,而不适用于另一种情况

Linux Bash if语句适用于一种情况,而不适用于另一种情况,linux,bash,if-statement,Linux,Bash,If Statement,我使用bash从cuda程序中检索内核,代码如下: kername="kernelnames" loop="loop" filecp="filecp" funct="funct" truncate -s 0 $kername truncate -s 0 $loop truncate -s 0 $funct counter=1 funct_display(){ count=0 flag=1 while read line ; do echo "$line"

我使用bash从cuda程序中检索内核,代码如下:

kername="kernelnames"
loop="loop"
filecp="filecp"
funct="funct"
truncate -s 0 $kername
truncate -s 0 $loop
truncate -s 0 $funct
counter=1

funct_display(){
    count=0
    flag=1
    while read line ; do
        echo "$line"
        if [[ "$line" == "{" ]] ; then echo "$line"; count=$(( count+1 )) ; echo "$counter $count incre" ;fi
        if [[ "$line" == "}" ]] ; then count=$(( count-1 )) ; echo "$counter $count decre" ;fi      
        if [[ $count > 0 ]] ; then echo "$line" >> $funct ;fi
        if [[ $count == 0 ]] ; then flag=0 ; fi 
        if [[ $flag == 0 ]] ; then break ; fi   
        #if [[ $count == 0 ]] ; then counter=$(( counter+1 )); fi
        counter=$(( counter+1 ))        
    done < $filecp
    echo "}" >> $funct
    echo "" >>$funct
}
file_copy(){
    truncate -s 0 $filecp
    while read line; do
        echo "$line" >> $filecp
    done < $filename
}

read -p "Enter the name of the file to be scanned: " filename
var=$( grep "__global__" < $filename | wc -l )
echo "kernels" >> $kername
for((i=1;i<=$var;i++))
do
    temp1=$( grep -m$i "__global__" < $filename | tail -n1 )
    a=$( grep -n -m$i "__global__" < $filename | cut -d : -f 1 | tail -n1 )
    j=$(( i+1 ))
    temp2=$( grep -m$j "__global__" < $filename | tail -n1 )
    b=$( grep -n -m$j "__global__" < $filename | cut -d : -f 1 | tail -n1 )
    echo "$i $temp1 $a $b" >> $kername
    temp5=$( sed -n " $a , $b p" $filename )
    echo "$temp5" >> $loop
    #echo "$a"
    while read line ; do
        if [[ "$line" == "$temp1" ]] ; then 
            echo "$line " >> $funct
            echo "$line"
            file_copy
            for((k=$a;k>0;k--))
            do
                echo "$k"
                sed -i "${k}d" $filecp 
            done
            funct_display 
        fi
    done < $filename
    #echo "$temp1"
done
但它不适用于具有以下内核的程序:

__global__ void Vec_Mat_mul(float *gV, float*gM, float *gR, int Vecsize, int Matcols)

{   int i, j;
    float sum=0.0;
    i=(blockIdx.x*blockDim.x)+threadIdx.x; //For each block access
    if(i<Matcols)
{
        for(j=0;j<Vecsize;j++)
            sum=sum+(gV[j]*gM[j+(i*Vecsize)]);

        __syncthreads(); //Synchronization Barrier
        gR[i]=sum;
}
}
\uuuuu全局\uuuuuu无效向量材料(浮点*gV、浮点*gM、浮点*gR、整数向量大小、整数材料)
{int i,j;
浮动总和=0.0;
i=(blockIdx.x*blockDim.x)+threadIdx.x;//对于每个块访问

如果(i这里有两件事出了问题

  • 正如@Shelleter指出的,
    [[“$line”==“{”]]
    测试整行是否等于
    {
    ,因此在文件2的第3行失败:
    {int i,j;

  • 在达到这一点之前,文件2的空行2会使这些为真:

    if [[ $count == 0 ]] ; then flag=0 ; fi
    if [[ $flag == 0 ]] ; then break ; fi
    
  • 在到达第3行之前,当
    循环时,中断
    功能显示

    也许您可以将您的问题重命名为:如何使用命令行工具提取CUDA内核C代码,并给出一个您试图从两个输入示例中获得的输出示例

    如果您正在寻找一种至少可以处理这两个示例的快速修复方法,您可以进行一些预处理,将每个大括号单独放在它自己的行上,并删除任何空行或只有空格的行:

    sed 's/\(.*\)\([{}]\)\(.*\)/\1\n\2\n\3/' file.c |
      grep -v '^\s*$' > file.preprocessed.c
    

    是的,你是对的,
    if[[“$l{ine}”==“{”]
    只需要行上的
    {
    字符。请尝试
    if[[“${line}”~=“{”]
    。但这将匹配
    {
    在线上的任何位置。将其转换为
    awk
    将更容易、更高效,但您似乎已经为此投入了大量时间,所以请尽最大努力解决您的问题。祝您好运。事实证明,它在语义上是正确的,但我们试图处理的文件不知何故已“损坏”。我们将内容复制粘贴到一个新文件中,它工作得非常完美。不过,感谢所有的帮助。:)我会小心的。我在你的示例文件上运行了你的示例代码,但在第二个文件上不起作用。它似乎适用于所有花括号都单独在自己的行上,没有前导空格或尾随空格的文件。不过,无可否认,我不知道你想要的输出是什么,所以我不能确定它是否按预期工作,只是对于花括号,它的行为非常不同,而不仅仅是在它们自己的线条上。
    sed 's/\(.*\)\([{}]\)\(.*\)/\1\n\2\n\3/' file.c |
      grep -v '^\s*$' > file.preprocessed.c