Замена Bash: ошибка, если отсутствует, переназначение, если существует

#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"