2015-12-30 2 views
1

Я пытаюсь сделать простую проверку, если последнее выражение было успешным:

if [ $? -ne 0 ]; then 
    chrome a.html 
fi 

и эта форма работы. Однако, когда я пытаюсь сделать:

if [ $? != "0" ]; then 
    chrome a.html 
fi 

или без "", он всегда выполняется. Я не уверен, почему это происходит, поскольку следующие работы:

if [ $(id -u) != "0" ]; then 
#You are not the superuser 
echo "You must be superuser to run this" >&2 
exit 1 
fi 

Я бы подумал, что $? и $ (id -u) возвращают целое число, и, таким образом, сравнение: = «0» и -ne 0 должны работать. Однако, кажется, $? не является тем же типом, что и $ (id -u). Любое объяснение?

+0

«$?» - это код выхода последней выполненной команды, а не выход 'id -u' – anubhava

+0

Да, я знаю, я просто использовал $ (id -u) в качестве сравнения, потому что это возвращает число, а также $? – mtveezy

+0

Вы должны окружать переменные в «компенсировать переменное расширение, иначе вы могли бы столкнуться с некоторыми проблемами в будущем». – Lando

ответ

1

Я не вижу поведение, которое вы описали:

#!/bin/bash 
false 
echo false returns $? 
false 
if [ $? -ne 0 ] ; then 
     echo 'testing return -ne 0' 
fi 

false 
echo false returns $? 
false 
if [ $? != "0" ] ; then 
     echo 'testing return != "0"' 
fi 

true 
echo true returns $? 
true 
if [ $? != "0" ] ; then 
     echo 'testing return != "0"' 
fi 
echo done 
exit 0 

выходы:

false returns 1 
testing return -ne 0 
false returns 1 
testing return != "0" 
true returns 0 
done 
0

Я считаю, что это потому, что $? возвращает вывод как целое число, но $ (id -u) возвращает вывод как строку, а не как целое число. Оператор -ne используется для сравнения чисел, тогда как != используется со строковыми сравнениями. Оператор сравнения в оболочке недостаточно умен, чтобы автоматически преобразовывать строки в целое число, когда вы выполняете сравнение, используя !=.

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