Будет полезно, если вы включите полученные сообщения об ошибках. Когда я попробовал это, я получил ошибку:
./foo: line 9: [1: command not found
Это делает проблему довольно ясной. Оператор [
в операторе if
заключается в том, что в Unix стиль «никогда не используйте что-то сложное, когда какой-то простой взлом будет работать» - это просто другая программа. (См. ls /bin/[
для доказательства!) Как таковой, он должен рассматриваться как любая другая программа с параметрами командной строки; Вы отделяете это от его вариантов с пробелами. В противном случае bash будет считать, что «[$ choice», объединенный, является именем программы для выполнения, и попытается выполнить ее. Таким образом, эта строка должна быть:
if [ $choice == "$same_name" ];then
После того, как я это изменил, все заработало.
Кроме того, в качестве рекомендации по стилю я хотел бы отметить, что конструкция case
является гораздо более простым способом написания этого кода, чем использование операторов if
, когда у вас более одного теста. И, как отмечено в других ответах, вы должны поставить "
отметки вокруг $choice
, чтобы защититься от случая, когда пользовательский ввод пуст или содержит пробелы - $choice
без кавычек расширится до нуля или списка больше токенов разделено пробелами, тогда как "$choice"
всегда расширяется до одного токена.