Передайте входную переменную и зациклите ее здесь, документ bash script

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

Ниже мой код.

bash <<START
echo "Input :$1"
for i in 1 2 3 4 5
do
echo "For Loop Value : $i"
done
START

При запуске этого скрипта ./heredoc "asd" я получаю результат ниже

Input :asd
For Loop Value :
For Loop Value :
For Loop Value :
For Loop Value :
For Loop Value :

Как видите, значение i не приходит.

Но если я добавлю одинарную кавычку, это даст результат ниже.

Input :
For Loop Value :1
For Loop Value :2
For Loop Value :3
For Loop Value :4
For Loop Value :5

Как я могу решить эту проблему, чтобы мое входное значение, а также значение цикла выходили на выходе.

заранее спасибо


person vinay    schedule 21.06.2016    source источник
comment
попробовал bash ‹‹'START', но в этом случае я теряю значение переменной пользовательского ввода, как указано в сообщении. В любом случае спасибо.   -  person vinay    schedule 21.06.2016
comment
Ой, извини! затем избегайте расширений: echo "For Loop Value : \$i"   -  person gniourf_gniourf    schedule 21.06.2016
comment
gniourf_gniourf ты гений..спасибо..сработало...   -  person vinay    schedule 21.06.2016
comment
Теперь реальный вопрос: почему вы вообще используете вот такой вот документ?   -  person gniourf_gniourf    schedule 21.06.2016
comment
Вот настоящий вопрос. sudo -u vinay bash ‹‹EOF echo Входное значение после SUDO $1 IFS=';' прочитать -ra ADDR ‹‹‹$1 для i в ${ADDR[@]}; do echo \$i done echo end EOF он должен напечатать входное значение. поэтому, если я ввожу ввод asd; qwe; zxc, он должен печатать asd qwe zxc, но он не печатается :(.   -  person vinay    schedule 21.06.2016


Ответы (1)


Ты ничего не пропускаешь. $1 будет первым позиционным параметром запущенной оболочки, вероятно, пустой строкой.

Это сделает то, что вы хотите:

variable="hello there"

bash <<SCRIPT_END
echo "Input: $variable"
for i in 1 2 3 4 5; do
    echo "For Loop Value: \$i"
done
SCRIPT_END

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

Обратите внимание, что вы действительно хотите, чтобы это произошло для $variable (то, что вы называете "переходом к здешнему документу"), и поэтому мы не можем просто заключить все это в одинарные кавычки (путем изменения первого SCRIPT_END до 'SCRIPT_END').

person Kusalananda    schedule 21.06.2016