#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 (и отлаживать) через второй файл … поэтому я переписываю свой ответ без «реального кода».