#bash
#bash
Вопрос:
Я хочу сделать что-то подобное, но умным способом:
var=${1:?This is an error: --arg ${1}}
Это недопустимый синтаксис, но в принципе, если кто-то передает, $1
как foo
я хочу var
быть --arg foo
, но если они этого не делают, я хочу ошибку.
Есть ли умный способ сделать это?
Ответ №1:
Вам не нужны оба теста, просто используйте простое назначение с тестом на ошибку:
var="--arg ${1:?This is an error}"
Если $1
была передана, она присваивает ее (с префиксом « --arg
«) переменной; если она не была передана, она выводит ошибку и завершает работу (следовательно, присвоение не происходит).
Кстати, похоже, что вы пытаетесь сохранить несколько аргументов (для какой-либо другой программы) в простой переменной. Это небезопасно, потому что $1
может содержать пробелы и / или подстановочные знаки, и если вы обратитесь к этой переменной без двойных кавычек ( someprogram $var
), она будет разделена на все пробелы, и любые подстановочные знаки будут расширены. С другой стороны, если вы заключите его в двойные кавычки, --arg
часть будет передана как часть того же аргумента. Вместо этого используйте массив для безопасного хранения нескольких значений:
arrayvar=("--arg" "${1:?This is an error}")
someprogram "${arrayvar[@]}"
Комментарии:
1. Отличное понимание! Да, это именно то, что я пытаюсь сделать! Спасибо!
Ответ №2:
Вы не можете объединить несколько операторов расширения параметров.
Сделайте это в два этапа. Сначала проверьте наличие ошибки, затем выполните конкатенацию.
: ${1:?This is an error}
var="-arg $1"