bash позволяет переменной по умолчанию использовать пользовательский ввод

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

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

Используя расширение параметра, я попробовал это:

${FILE="$( echo "Please provide the file:" >&2 ; read a; echo $a )"}

... но я всегда получаю ошибку command not found.

Какие-либо предложения?


person Horst    schedule 30.07.2015    source источник
comment
Попробуйте следующий скрипт. эхо Введите ваше имя ; прочитать имя; if [ ${#name} -eq 0 ] then echo -e \nName: Horst else echo -e \nName: $name fi   -  person mohangraj    schedule 30.07.2015
comment
Только что ответил сам: FILE=${FILE="$( echo "Please provide the file:" >&2 ; read a; echo $a )"} Это какое-то двойное задание, но оно работает!   -  person Horst    schedule 30.07.2015
comment
Попробуйте это: echo ${FILE=$( echo Укажите файл: ›&2 ; read a; echo $a )}   -  person mohangraj    schedule 30.07.2015
comment
Перестаньте отвечать на вопросы в комментариях.   -  person chepner    schedule 30.07.2015


Ответы (2)


я бы написал

# earlier in program, $FILE may or may not be defined

if [[ -z $FILE ]]; then
    read -p "Please provide the file: " FILE
fi

Если вы действительно хотите втиснуть его в одну строку, используйте команду : и синтаксис расширения присваивания

: ${FILE:=$(read -p "file?"; echo "$REPLY")}

Обратите внимание: не используйте ALL_CAPS_VARS: когда-нибудь вы будете использовать PATH и удивляться, почему ваш сценарий не работает.

person glenn jackman    schedule 30.07.2015
comment
Это то, что я искал! Таким образом я проверяю полдюжины переменных, поэтому однострочный код — единственное решение, позволяющее сохранить лаконичность кода. - person Horst; 30.07.2015
comment
Я бы порекомендовал что-то среднее: [[ -z $FILE ]] && read -p "..." FILE - person glenn jackman; 30.07.2015

Так должно быть

FILE="$( echo "Please provide the file:" >&2 ; read a; echo $a )"

Вы пытаетесь выполнить команду вместо инициализации

${FILE="$( echo "Please provide the file:" >&2 ; read a; echo $a )"}
Please provide the file:
Mahesh
-bash: Mahesh: command not found
$ FILE="$( echo "Please provide the file:" >&2 ; read a; echo $a )"
Please provide the file:
mahesh
$ echo $FILE
mahesh
person Mahesh Kharvi    schedule 30.07.2015