Команда тесту в unix не друкує вихід


20

Коли я набираю це в терміналі

test 4 -lt 6

Я не отримую жодного результату. Чому ні? Мені потрібно це 0 або 1


1
Не було б непогано, якби тест мав можливість негайно вивести значення? Просто варіант. Це все, що нам знадобиться.
Тодд Уолтон

Відповіді:


15

Ви отримуєте 0 або 1. У вихідному коді.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Оновлення : щоб зберегти вихідний код для подальшого використання, просто призначте його змінній:

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

1
чи є спосіб передати вихідний код?
індіанець

3
Ні. Лише вихід може бути перенаправлений. У всякому разі, зазвичай в цьому немає потреби. Щоб зберегти його для подальшого використання, просто призначте його змінній. Або скажіть нам, який саме ваш намір з цією цінністю.
манатура

2
Код виходу поміщається у $?змінну - принаймні, доки вона не буде перезаписана наступною командою, яку ви виконуєте.
Шадур

1
PS: Ви можете використовувати в $PIPESTATUSмасив , щоб отримати результат декількох команд в конвеєрі. $?буде по бути результатом останньої команди в конвеєрі , якщо опція вимкнена (за замовчуванням). pipefail
l0b0

@indieman, якщо вам потрібно зробити щось інше на основі статусу виходу, вам навіть не потрібно його зберігати - просто використовуйтеif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

Інший спосіб

test 4 -lt 6 && echo 1 || echo 0

Але будьте обережні в такому випадку. Якщо testповернення успіху і echo 1невдачі echo 0буде виконано.


2

Якщо ви хочете, щоб результат порівняння на стандартному вийшов замість вихідного коду, ви можете скористатися expr(1)командою:

$ expr 4 '<=' 6
1

Дві речі, які слід зазначити:

  1. вам, ймовірно, доведеться цитувати оператора, оскільки багато з них суперечать метахарактерам оболонки
  2. вихідне значення протилежне коду повернення для test. testповертає 0 для true (що є стандартом для кодів виходу), але exprдрукує 1 для true.

1
3. Є testвбудована оболонка, яка значно швидша (приблизно в 50 разів на моїй машині), ніж testта exprвиконувані файли з пакета coreutils .
манатура

+1 за другий бал. Не вдалося знайти помилку, яку дуже засмучує, якщо зіпсувати це.
Емануель Берг

2

Ви можете ввести таку команду:

echo $(test -e myFile.txt) $?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.