2015-10-09 8 views
0

Так что я пытаюсь перебрать столбцы в файле, чтобы найти среднюю и среднюю ... Цикл работает нормально, но когда я добавляю временный файл (для при использовании стандартного ввода для указания файла), он выдает ошибку:bash- синтаксическая ошибка: операнд ожидается - возникает после создания временного файла

((: i<: syntax error: operand expected (error token is "<")

Это цикл: for ((i=$colIndex;i<$numCols;i++))

Создание файла TEMP: cat - > temp

EDIT:

Полный код STDIN:

if [[ $# -eq 2 ]] 
    then 
     fileName=$2 
    #file name was not given 
    elif [[ $# -eq 1 ]] 
    then 
     #file name comes from the user 
     fileName=/dev/stdin 
     cat - > temp 
    #incorrect number of arguments 
    else 
     echo "Usage: stats {-rows|-cols} [file]" 
     exit 1 
    fi 

код, чтобы получить число столбцов ($ numCols):

#get number of columns 
    while read -a cols 
    do 
     numCols=0 
     for i in "${cols[@]}" 
     do 
      numCols=`expr $numCols + 1` 
     done 
     #only need one row 
     break 
    done < "${2:-/dev/stdin}" 

Любая помощь будет здорово, спасибо!

+0

Показать скрипт с этими линиями в контексте относительно друг друга? –

+0

Они arent действительно относительно друг друга. Без кода 'cat -> temp' ошибка исчезнет, ​​и ошибка вернется. – NateDawg87

+2

для ((i = 1; i <; i ++)); do echo yes, done bash: ((: i <: синтаксическая ошибка: предполагается, что операнд (токен ошибки «<») $ numCols имеет значение null. – Lizardx

ответ

1

numCols не установлен (или не задано число):

$ colIndex=1 
$ numCols="" 
$ for ((i=$colIndex;i<$numCols;i++)); do echo $i; done 
-bash: ((: i<: syntax error: operand expected (error token is "<") 

UPDATE: Я думаю, что причина этого происходит, что cat - > temp стеклотары в стандартный ввод временного файла. Затем, когда вы делаете while read ... done < "${2:-/dev/stdin}", в stdin ничего не осталось, поэтому цикл никогда не запускается, и numCols никогда не получает назначений.

Есть несколько проблем здесь: при копировании стандартного ввода в временный файл, то необходимо будет установить fileName на пути в временный файл, а затем цикл чтения из $fileName вместо (возможно) стандартного ввода. Кроме того, вы должны использовать mktemp вместо фиксированного (и без ограничения) имени файла temp. Кроме того, чередование элементов массива для их подсчета излишне сложное; просто используйте numCols=${#cols[@]}.

Наконец, имея петлю, вы всегда выходите из первой итерации ... это совсем не петля. И это не только бессмысленно, но и на самом деле проблематично, потому что если файл пуст, цикл никогда не запускается и numCols никогда не будет установлен.

Как о чем-то вроде этого:

... 
elif [[ $# -eq 1 ]] 
then 
    #no filename given, reading from stdin 
    fileName="$(mktemp -t "$(basename "$0")")" || { 
     echo "Error creating temp file" >&2 
     exit 1 
    } 
    cat - > "$fileName" 
else 

... 
read -a cols <"$fileName" # Just read the first line (or null if the file is empty) 
numCols=${#cols[@]} 
if [ $numCols = 0 ]; then 
    echo "This file doesn't seem to have any columns (at least judging by the first line)" >&2 
    exit 1 
fi 
+0

Хорошо, что имеет смысл, но зачем мне добавлять 'cat -> temp' вызвать код, который получает количество столбцов, которые нужно пропустить, и в конечном итоге вызвать эту ошибку? – NateDawg87

+0

Ну, я получил его на работу ... Я изменил 1-ю строку с '#!/bin/sh' на' #!/bin/bash «Я знаю, что между ними есть некоторые различия, но каковы различия, которые заставляют все это работать? – NateDawg87

Смежные вопросы