Intereting Posts
Перенаправление пакетов из интерфейса обратной петли с помощью маршрутизации на основе политик Как выполнить скрипт при запуске и завершении программы Помещение Linux-процессов на определенные ядра ЦП Поиск и управление файлами на внешнем жестком диске через FileZilla через SSH Что такое «подрезы»? Поместите Linux-сервер в режим сна и разбудите его с помощью WOL-пакетов Сценарий Bash для вставки информации после каждой строки блока данных Почему так медленно? Почему режим cp –no-preserve = сохраняет режим? Доступны альтернативные инструменты? Получить идентификатор и установленное местоположение USB Регулярное выражение для замены экземпляра двух последовательных строк, которые могут быть разделены пробелами Использование обратного SSH-туннелирования за один шаг вместо двух шагов (с -X) Как сделать tmux count windows начиная с 1 вместо 0? Могу ли я использовать команду find для передачи аргументов perl? Arch Linux netinstall – конфликтующие пакеты при установке

Как использовать два операнда в левой части оператора сравнения в Bash

Это:

3.8.13-68.3.4.el6uek.x86_64 #2 SMP Tue Jul 14 15:03:36 PDT 2015 x86_64 x86_64 x86_64 GNU/Linux bash --version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 

Я знаком со следующим синтаксисом:

 [ $VAR = "iotools" ] || [ $VAR_2 = "iotools" ] 

где либо $VAR должен содержать значение iotools либо $VAR_2 должно содержать значение iotools .

Есть ли способ, который я могу написать, как показано ниже:

 [ $VAR||$VAR_2 = "iotools" ] 

Идея состоит в том, чтобы сэкономить пространство, потребляемое кодом, и избавиться от дополнительного кода во второй паре квадратных скобок.

Нет, вы не можете сократить левую сторону сравнения. Однако вы можете использовать рисунок справа:

 [[ iotools == @("$VAR"|"$VAR_2") ]] 

Обратите внимание, что вам нужно использовать [[ ... ]] вместо [ ... ] для этого. Подробные сведения см. В разделе « Сопоставление шаблонов» в man bash .

Переменные должны быть указаны для предотвращения соответствия VAR='a|iotools|b' .

Поскольку вы используете bash, это можно сделать с использованием двух понятий:

  • Существует способ перечислить несколько переменных с похожим именем:

     VAR=iotools VAR_2=tools2 VAR_3=othertools printf '<%s> ' "${!VAR@}" 

    Будет печать:

     <VAR> <VAR_2> <VAR_3> 
  • Это также можно сделать косвенно ${!var} (var – другая переменная, чем $ VAR):

     for var in "${!VAR@}"; do printf '<%s> ' "${!var}" done 

    Будет печать:

     <iotools> <tools2> <othertools> 

Все вместе будут:

 #!/bin/bash VAR=iotools VAR_2=tools2 VAR_3=othertools testvalue="$1" for var in "${!VAR@}"; do if [[ ${!var} == $testvalue ]]; then echo "Some value matched" break fi done 

Вызов:

 $ script iotools Some value matched $ script notool $