2016-07-01 2 views
1

У меня есть скрипт bash для подсчета строк в отчетах. У меня есть один массив, в котором хранятся все имена отчетов, и в цикле я подсчитываю строки. Однако для некоторых файлов мой скрипт получает ожидаемую ошибку двоичного оператора. У кого-нибудь есть решение?Ожидаемый двоичный оператор Bash

for i in ${ARRAY[@]}; do 
if [ ! -f "$BASE_DIR/$i"* ]; 
then 
     echo "File not generated yet" 
else 
     ARRAY2=$(wc -l < "$BASE_DIR/$i"*.tab | awk '{print $1-2}') 
     echo ${ARRAY2[$i]} $i 
fi 
+0

Вы могли бы знать о том, что '*' в этом контексте будет делать подстановку – sjsam

+0

подстановки используются по назначению, вызвать там также текст, прежде чем имя файла и расширение – ulsterboy

+1

sjsam спасибо за помощь, там была проблема – ulsterboy

ответ

1

Используйте двойные прямые фигурные скобки вместо следующих, поскольку вы используете расширенные выражения.

if [[ ! -f "$BASE_DIR/$i"* ]]; 

Необходимо проверить содержимое массива. Специальные символы как '' (пробелы) в именах файлов должны быть экранированы.

1

-f принимает только один аргумент, поэтому ошибка возникает, когда шаблон соответствует нескольким файлам.

Это кажется работать с [[, хотя я не могу найти любую документацию, чтобы почему это делает.

Большая проблема заключается в том, что вы можете использовать только один файл с оператором <; если шаблон соответствует нескольким файлам, вы получите неоднозначную ошибку перенаправления. Чтобы исправить это, вам нужно использовать cat:

cat "$BASE_DIR/$i"*.tab | wc -l 

Однако, не ясно, что вы ожидаете от выхода; ARRAY2 на самом деле не будет массивом.

+0

да, как и @ sjsam упомянул проблему с globbing, я обнаружил, что у меня есть некоторые файлы с .bak в конце – ulsterboy

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