2015-06-01 3 views
-2

У меня есть ошибка в моей Баш скрипт, когда я делаю, если контроль между строкой и функцией сценария чтенияошибка Баш на если заявление

#! /bin/bash 

test1="false" 
while [ $test1 == "false" ]; do 
tail -1 demo.txt | while read test 
do 
echo $test 
done 
if [ "test" == $test ]; then 
     test1="true" 
     echo "end" 
else 
     test1="true" 
     echo "else" 

fi 
done 

Это код и результат:

#! /bin/bash 

test1="false" 
while [ $test1 == "false" ]; do 
tail -1 demo.txt | while read test 
do 
echo $test 
done 
if [ "test1" == "$test" ]; then 
     test1="true" 
     echo "end" 
else 
     test1="true" 
     echo "else" 

fi 
done 

"test2.sh" 17 lines, 215 characters 
[email protected]:/tmp $ ./test2.sh 
test1 
else 
+3

Какова ошибка? Лучше включите эту ошибку в вопрос. –

+1

'$ test' устанавливается в подпроцессе, поэтому' ["test" == $ test] 'расширяется до' ["test" ==] ', что приводит к синтаксической ошибке. Я полагаю. – Biffen

ответ

1

Если $test пусто, то if становится:

if [ "test" == ]; then 

, который обычно вызывает ошибку:

-bash: [: test: unary operator expected 

Вам необходимо заключить переменную в кавычки для того, чтобы там быть значение, когда $test пуст:

if [ "test" == "$test" ]; then 

EDIT: Есть две причины, почему $test «пуст». Первая причина заключается в том, что | создает подпроцесс, как утверждает Biffen. Когда подпроцесс выходит, все переменные, которые были установлены внутри него, уходят. В вашем случае это не значит, что $test пуст; он даже не существует. Не в то время, когда вы пытаетесь использовать его в if.

Если вы избежите подпроцесса (который может быть выполнен несколькими способами), у вас может быть пустой $test. Тривиальным образом, чтобы избежать этого, чтобы написать ее не как трубы, но как процесс перенаправления:

while read test 
do 
    echo $test 
done < <(tail -1 demo.txt) 

Это позволит установить локальную переменную test к первой строке, он будет отображать его, то он будет установить его на следующий line, но нет следующей строки; read терпит неудачу, но не до этого nukes $test (так $test заканчивается пустым). То, что это действительно работает, как я говорю, вы можете проверить, запустив это:

while read test 
do 
    realtest="$test" 
    echo $test 
done < <(tail -1 demo.txt) 

echo REALTEST: $realtest 

и видеть, что $realtest Теперь действительно есть последняя строка файла (это не было бы, если бы вы попробовали переназначения подход).

Однако, если вы просто хотите прочитать одну строку, почему цикл while?

read test < <(tail -1 demo.txt) 
+0

Я делаю это изменение. Когда я печатаю $ test, я вижу значение test1, но когда я делаю элемент управления в выражении if, код не входит внутрь if – andy89ch

+0

Да, это то, о чем предупреждает @Biffen. – Amadan

+0

Вы можете увидеть код и результат. Тест $ не пуст ... – andy89ch

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