Почему не работает этот bash-скрипт?

Не уверен, почему этот скрипт выдает случайные ошибки, когда я пытаюсь его запустить. В основном в строках 1-10. В основном это проблема компиляции. Это выдает ошибки для пустых строк, но я исправил это.

Я получаю следующие ошибки:

Main.sh: line 9: syntax error near unexpected token $'\r'
Main.sh: line 9: if (( "$#" > 3 ))

Вот мой код:

#!/bin/bash

#echo "All parameters: $@"
#echo "Parameter 1: $1"
#echo "Parameter 2: $2"
#echo "Parameter 3: $3"

tempCol="tempcolfile"
tempRow="temprowfile"
tempMean="tempmeanfile"

if (( "$#" > 3 ))
then
   echo "Matrix has too many arguments" 1>&2
   exit 1
fi


: <<'END'
elif [ $# -gt 1 ]
then
   fileOne=$2
   fileTwo=$3
elif [ $# -eq 1 ]
then
   fileOne=tmp
   cat > $fileOne
   #echo "Cat has finished"
fi
END


#function for dims
dims()
{
  lineNum=0

  while read myLine
  do
    lineNum=`expr $lineNum + 1`
  done <$fileOne

  numcol=$( head -n 1 $fileOne | wc -w) #count number of numbers in first line (-n 1) of input file provided from first argument
  echo -e "$lineNum $numcol"
}

#function for transpose
transpose()
{
  lineNum=0
  i=1

numcol=$( head -n 1 $fileOne | wc -w)

while [[ "$i" -le "$numcol" ]]
  do
     cut -f $i $fileOne > $tempCol
     cat $tempCol | tr -s '\n' '\t' > "$tempRow"
     rev "$tempRow" >"temp222"
     cat "temp222" | cut -c 2-  >"temp333"
     rev "temp333">$tempRow
     #echo >> "$tempRow"
     cat $tempRow
     #cat -A $tempRow
     i=`expr $i + 1`
  done
}

add()
{
 echo "Add function"
}

mean()
{
  i=1
  numcol=$( head -n 1 $fileOne | wc -w)
  echo "Number Col: $numcol"

  while [[ $i -le $numcol ]]
  do

  sum=0
  cut -f $i $fileOne > $tempCol

  while read num
  do
     sum=`expr $sum + $num`
     mean=`expr $sum / 2`
  done <$tempCol

  echo $mean > $tempRow
  cat $tempRow | tr -s '\t' > $tempMean
  echo >> "$tempMean"
  i=$((i+1))

  cat $tempMean

done


}

mulitply()
{
  echo "Multiply Function"
}


#Executing dims and mean
  if [ $1 = "dims" ] || [ $1 = "mean" ]
    then


      if (("$#" > 2 ))
      then
          echo "Invalid number of arguments" 1>&2
          exit 1
        fi

        if [ $# -gt 1 ]
        then
           fileOne=$2
           fileTwo=$3
         fi

        if [ $# -eq 1 ]
        then
           fileOne=tmp
           cat > $fileOne
           #echo "Cat has finished"
        fi

      if [ ! -f $2 ]
        then
          echo "Invalid file" 1>&2        #Redirects stdout to stderr 1>&2
          exit 1
      fi

      if [ $1 = "dims" ]
      then
        dims $fileOne
      fi

      if [ $1 = "mean" ]
      then
     mean $fileOne
      fi



    fi

#Executing transpose
    if [ $1 = "transpose" ]
    then


      if (( "$#" > 2 ))
      then
          echo "Invalid number of arguments" 1>&2
          exit 1

        elif [ $# -gt 1 ]
        then
           fileOne=$2
           fileTwo=$3


        elif [ $# -eq 1 ]
        then
           fileOne=tmp
           cat > $fileOne
           #echo "Cat has finished"
        fi


      if [ ! -r $2 ]
        then
          echo "Invalid file" 1>&2        #Redirects stdout to stderr 1>&2
          exit 1
      fi

      transpose $fileOne

    fi


#Executing add
    if [ $1 = "add" ]
    then
      echo "in Add"

      if [ $# -eq 0 ]
      then
        echo "No arguments to add" 1>&2
        exit 1
      fi

      if [ $# -ne 2 ]
      then
        echo "Invalid number of arguments" 1>&2
        exit 1
      fi

      if [ ! -r $2 ] || [ ! -r $3 ]
      then
        echo "Invalid file" 1>&2
        exit 1
      fi


       add $fileOne $fileTwo
    fi

2 ответа

Как подсказывает шелтертер в своем комментарии, проблема в том, что ваш файл содержит смесь стилей новой строки. Например, редакторы Microsoft (включая блокнот) всегда добавляют возврат каретки (CR, \n) и перевод строки (LF, \r) в конце каждой строки. Это имело смысл для данных, отправляемых на старый телепринтер, который имел физический механизм, который должен был возвращаться в крайнее левое положение и двигаться вниз на одну строку.

Таким образом, используя разумный редактор, который может удалить лишнее \r символы или утилита, такая как dos2unix (также, как отмечает shellter) решит вашу проблему.

Как отмечает Пьер Франсуа, вы можете использовать специфичные для bash [[ conditional expression ]] синтаксис для всех ваших сравнений. Это более гибко и потенциально быстрее, чем при использовании [ expression ] и улучшенная согласованность может улучшить читаемость.

Изменить строку кода

if (( "$#" > 3 ))

в

if [[ $# > 3 ]]

Кстати: кавычки не нужны вокруг переменной, содержащей всегда число.

Исправьте также остальную часть кода, изменив v.gr. elif [ $# -gt 1 ] в elif [[ $# > 1 ]] ради согласованности.

Другие вопросы по тегам