Если $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)
Какова ошибка? Лучше включите эту ошибку в вопрос. –
'$ test' устанавливается в подпроцессе, поэтому' ["test" == $ test] 'расширяется до' ["test" ==] ', что приводит к синтаксической ошибке. Я полагаю. – Biffen