Знак сравнения как переменная

#bash

Вопрос:

Можно ли установить знак сравнения в качестве переменной?

Я хочу сделать что-то подобное:

 var1=${1}
var2=${2}
condition=${3}    

if [[ "${var1}" "${condition}" "${var2}" ]]; then
   echo "Warning!"
fi
 
 ./alert.sh "10" "5" ">"
 

Комментарии:

1. Вы могли бы заменить [[ на eval [[ .

2. Вы также можете выстрелить себе в ногу; хотя, вероятно, вы тоже не хотите этого делать. eval будет оценивать любую строку, которую она получит, а не только те части, которые вы «ожидаете» оценить.

Ответ №1:

Установить его не проблема, вот только использовать его очень сложно. (В вашем коде возникает синтаксическая ошибка.)

Вы могли бы переключиться с [[ ]] на test , хотя это не совсем то же самое.

Кстати, > это строковый оператор. Вы , наверное, хотели -gt , целочисленный оператор. Таблицу операторов смотрите по ссылке выше.

 var1="10"
var2="5"
condition="-gt"

if test "${var1}" "${condition}" "${var2}"; then
   echo "Warning!"
fi
 

Выход:

 Warning!
 

Одиночные квадратные скобки также работают (они эквивалентны), но по какой-то причине ShellCheck обнаруживает синтаксическую ошибку, поэтому, чтобы облегчить жизнь с помощью ShellCheck, я бы сказал, просто избегайте ее, даже если это ошибка.

 [ "${var1}" "${condition}" "${var2}" ]
 

Ответ №2:

Другой способ выполнения такой работы-создать и запустить второй скрипт.

Это должно быть проще отлаживать (вы можете увидеть и повторить непосредственно cde)

 echo "
#!/bin/bash
echo "es2 Start"
... write your cdes here ... with parameters you want
 

«> es2

 chmod  x es2

./es2
 

Комментарии:

1. Ваше цитирование неверно, даже игнорируя возможность того, что сами переменные содержат кавычки в своих значениях.

2. Это просто пример того, как вы можете делать то, что хотите … конечно, нет, если вы хотите скопировать / вставить 🙂 Надеюсь, другие люди найдут совет полезным…

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

4. Именно поэтому такой подход полезен, люди могут видеть реальный cde (и отлаживать) через второй файл … поэтому я переписываю свой ответ без «реального кода».