Мне нравится использовать оператор case для сравнения строк.
Тривиальный пример:
case "$input"
in
"$variable1") echo "matched the first value"
;;
"$variable2") echo "matched the second value"
;;
*[a-z]*) echo "input has letters"
;;
'') echo "input is null!"
;;
*[0-9]*) echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
;;
*) echo "Some wacky stuff in the input!"
esac
Я делал сумасшедшие вещи, как
case "$(cat file)"
in
"$(cat other_file)") echo "file and other_file are the same"
;;
*) echo "file and other_file are different"
esac
И это тоже работает, с некоторыми ограничениями, например, размер файлов не может превышать пару мегабайт, а оболочка просто не видит нулей, поэтому, если один файл заполнен нулями, а другой - нет (( и ни у кого больше ничего нет), этот тест не увидит никакой разницы между ними.
Я не использую сравнение файлов в качестве серьезного примера, только пример того, как оператор case способен выполнять гораздо более гибкое сопоставление строк, чем это доступно с test или expr или другими подобными выражениями оболочки.