Условный аргумент bash

поэтому я пытаюсь сделать gitlab ci cd для автоматического создания проекта unity3d

и я в конечном итоге с длинным аргументом для выполнения процедуры сборки

Теперь я хотел бы сделать сценарий более динамичным для случая, когда некоторые аргументы действительно не нужны, например, для дифференцированной сборки Android, для которой требуется хранилище ключей или нет.

пока что я закончил с этим

/path/to/unity/unity -other args 
$([ ! -z $UNITY_ASSETS_EXPORT] && -assetPathNames $UNITY_ASSETS_EXPORT) 

но ничего не выводится, поэтому мне нужно использовать команду echo

Есть ли лучший способ для меня, чтобы я не засорять большую часть моего сценария с эхо для каждой переменной случаях?

Всего 2 ответа


Ваша идея была правильной, но способ обработки необязательного аргумента неверен. Выражение у вас есть

$([ ! -z $UNITY_ASSETS_EXPORT ] && -assetPathNames $UNITY_ASSETS_EXPORT) 

оценивает ниже, когда переменная установлена

$(-assetPathNames $UNITY_ASSETS_EXPORT)

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

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

unity_arg=([ ! -z "$UNITY_ASSETS_EXPORT" ] && -assetPathNames "$UNITY_ASSETS_EXPORT")

а теперь передайте содержимое массива в вашу команду

/path/to/unity/unity -other args "${unity_arg[@]}"

Расширение массива будет производить правильные строки аргумента, когда переменная определена, и расширяться до нуля, когда переменная пуста.


echo определенно является одним из способов, и остается наиболее гибким и, возможно, наиболее читабельным:

/path/to/unity/unity -other args 
$([ ! -z $UNITY_ASSETS_EXPORT ] && echo "-assetPathNames $UNITY_ASSETS_EXPORT")

Однако в этом простом случае вы можете использовать расширение переменных bash с помощью конструкции ${parameter:+word} . Он расширяется до word если parameter не пуст, в противном случае он расширяется до нуля:

/path/to/unity/unity -other args 
${UNITY_ASSETS_EXPORT:+-assetPathNames $UNITY_ASSETS_EXPORT}

Есть идеи?

10000