ніколи не використовуйте оператора `-a` або` -o` разом з `[`


11

Стефан Шазелас написав:

кілька правил, як

  • завжди цитуйте змінні
  • ніколи не використовувати -aабо -oоператор (використовувати кілька [команд і &&та ||оболонки операторів)

Зробіть [надійними за допомогою оболонок POSIX.

Чому "ніколи не використовуйте -aабо -oоператора"?

Як я можу зробити «використовувати кілька [команд і &&та ||оболонки операторів)»?

Відповіді:


13

Чому "ніколи не використовуйте -aабо -oоператора"?

Тому що вони можуть бути однозначними, а значить, не сумісні з POSIX :

Розширення XSI, що визначають бінарні праймери -a та -o та оператори '(' і ')', були позначені застарілими. (Багато виразів, що використовують їх, неоднозначно визначаються граматикою залежно від конкретних виразів, що оцінюються.) Сценарії, що використовують ці вирази, повинні бути перетворені у форми, наведені нижче. Незважаючи на те, що багато реалізацій продовжуватимуть підтримувати ці застарілі форми, скрипти повинні бути надзвичайно обережними при роботі з введеними користувачем вводами, які можна переплутати з цими та іншими праймерами та операторами. Якщо розробник програми не знає всіх випадків, які створюють вклад до сценарію, виклики типу:

test "$1" -a "$2"

слід писати так:

test "$1" && test "$2"

Як я можу зробити «використовувати кілька [команд і &&та ||оболонки операторів)»?

Роблячи кілька тестів та з'єднуючи їх за допомогою вказаних операторів; наприклад:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

може бути переписаний як еквівалент:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

або, ще краще:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

Спасибі. (1) "Оператори" ("і") "були позначені застарілими". Існують (і )оператори , що команди групи? Якщо вони застаріли, що їх заміни? (2) Чи має test "$1" -a "$2"бути замінено на test "$1" && test "$2"або ((test "$1" && test "$2"))? Хіба нам це не потрібно ((..))?
Тім

@Tim Дивіться оновлення. (1) Так - ви можете використовувати ()і {}як заміну. (2) Перший; (())використовується для арифметичного розширення, тут ви хочете перевірити стан виходу з ланцюга тестів, тому або групуйте тести в нижній частині ()або в поточній оболонці {}.
kos

Спасибі. Я думаю, мої запитання можуть вийти за рамки цієї посади. Тож я публікую їх у новій посаді.
Тім

1
@Tim Єдина причина використовувати оператори (та )оператори - це коли ви використовуєте -aабо -o. Оскільки останні застарілі, перші, очевидно, теж більше не потрібні.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.