Я пишу сценарий CLI, который задает ряд вопросов, прежде чем делать несколько вещей. Как я могу передать их в качестве аргументов, чтобы мне не приходилось вводить их каждый раз, когда я хочу проверить свой скрипт?
В принципе, он должен передать 4 элемента в STDIN, например «text1 [ENTER] text2 [ENTER] text3 [ENTER] text4 [ENTER] "автоматически.
Да, я мог бы изменить свой скрипт, чтобы действительно прочитать аргументы оболочки, но я не хочу так поступать, поскольку это Предположим, что он больше похож на мастера.
Ищете что-то вроде
SOMEPROGRAM myscript arg1 arg2 arg3 arg4
или
SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript
Или что-то в этом роде. Есть ли такая программа?
Я понимаю, что вы не хотите изменять myscript.
Что касается второго решения, которое вы запрашиваете, вы можете использовать printf:
printf '%s\n' text1 text2 text3 text4 | myscript
, чтобы, определяя псевдоним для SOMEPROGRAM как:
alias SOMEPROGRAM="printf '%s\n'"
, вы могли бы эффективно вызвать
SOMEPROGRAM text1 text2 text3 text4 | myscript
Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что она не " t знать, где начинаются параметры параметров myscript и текстовые параметры, если myscript не будет эффективно вызываться без каких-либо параметров. В этом случае вы можете использовать функцию:
SOMEPROGRAM() {
myscript="$1"
shift
printf '%s\n' "$@" | "$myscript"
}
, чтобы вы могли эффективно называть
SOMEPROGRAM myscript text1 text2 text3 text4
С помощью bash вы можете сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\
Итак, в основном, вы хотите передать каждый аргумент как строку дочерней программе. Ниже приведен скрипт, который перебирает все аргументы, переданные ti SOMEPROGRAM, и печатает их как строку. Вы можете передать пустую строку («введите без ввода чего-либо раньше»), передав пустой аргумент, как в SOMEPROGRAM yes '' | myscript.
#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
echo "$arg"
done
Если вам всегда нужно ответить «да» на ваш сценарий, используйте coreutil yes:
yes | myscript
Если вам нужно передать какое-то другое значение, скажите «нет»:
yes 'no' | myscript
Я почти уверен, что вы ожидаете.
изменить: пример добавлен
#!/bin/bash
USER="root"
HOST="192.168.1.111"
PASS="secret"
expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
interact
"
- из ожидать блог
Для простых случаев способ, которым enzotib описывает его с помощью stdin из файла, кажется разумным. Рассмотрим этот скрипт:
#!/bin/bash
read -p "What's your name?" name
echo $name
read -p "Age?" age
echo $age
echo "Your name is " $name " and your age is "$age
вызывать его с помощью:
echo -e "Foobar\n14\n" | ./namenage.sh
-e - включить escape-последовательности, такие как \n ewline.
Foobar
14
Your name is Foobar and your age is 14
Обратите внимание, как магически, bash не выводит приглашение для чтения.
Однако для более сложных случаев существует программа, называемая expect для обработки интерактивных программ CLI, где вам нужно дождаться следующего приглашения, прежде чем вводить второе значение, и я думаю, вы можете даже ветвь в условиях.
Если вы пишете скрипт, просто используйте getopts, чтобы аргументы были переданы скриптам, а затем вы можете использовать эти аргументы, как хотите? Это то, что вы ищете?
http://wiki.bash-hackers.org/howto/getopts_tutorial
Вы можете передать параметры, но это не сработает, вам также придется модифицировать скрипт bash, чтобы принимать параметры из командной строки.
Я понимаю, что вы не хотите изменять myscript.
Что касается второго решения, которое вы запрашиваете, вы можете использовать printf:
printf '%s\n' text1 text2 text3 text4 | myscript
, чтобы, определяя псевдоним для SOMEPROGRAM как:
alias SOMEPROGRAM="printf '%s\n'"
, вы могли бы эффективно вызвать
SOMEPROGRAM text1 text2 text3 text4 | myscript
Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что она не " t знать, где начинаются параметры параметров myscript и текстовые параметры, если myscript не будет эффективно вызываться без каких-либо параметров. В этом случае вы можете использовать функцию:
SOMEPROGRAM() {
myscript="$1"
shift
printf '%s\n' "$@" | "$myscript"
}
, чтобы вы могли эффективно называть
SOMEPROGRAM myscript text1 text2 text3 text4
С помощью bash вы можете сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\
Итак, в основном, вы хотите передать каждый аргумент как строку дочерней программе. Ниже приведен скрипт, который перебирает все аргументы, переданные ti SOMEPROGRAM, и печатает их как строку. Вы можете передать пустую строку («введите без ввода чего-либо раньше»), передав пустой аргумент, как в SOMEPROGRAM yes '' | myscript.
#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
echo "$arg"
done
Если вам всегда нужно ответить «да» на ваш сценарий, используйте coreutil yes:
yes | myscript
Если вам нужно передать какое-то другое значение, скажите «нет»:
yes 'no' | myscript
Я почти уверен, что вы ожидаете.
изменить: пример добавлен
#!/bin/bash
USER="root"
HOST="192.168.1.111"
PASS="secret"
expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
interact
"
- из ожидать блог
Для простых случаев способ, которым enzotib описывает его с помощью stdin из файла, кажется разумным. Рассмотрим этот скрипт:
#!/bin/bash
read -p "What's your name?" name
echo $name
read -p "Age?" age
echo $age
echo "Your name is " $name " and your age is "$age
вызывать его с помощью:
echo -e "Foobar\n14\n" | ./namenage.sh
-e - включить escape-последовательности, такие как \n ewline.
Foobar
14
Your name is Foobar and your age is 14
Обратите внимание, как магически, bash не выводит приглашение для чтения.
Однако для более сложных случаев существует программа, называемая expect для обработки интерактивных программ CLI, где вам нужно дождаться следующего приглашения, прежде чем вводить второе значение, и я думаю, вы можете даже ветвь в условиях.
Если вы пишете скрипт, просто используйте getopts, чтобы аргументы были переданы скриптам, а затем вы можете использовать эти аргументы, как хотите? Это то, что вы ищете?
http://wiki.bash-hackers.org/howto/getopts_tutorial
Вы можете передать параметры, но это не сработает, вам также придется модифицировать скрипт bash, чтобы принимать параметры из командной строки.
Я понимаю, что вы не хотите изменять myscript.
Что касается второго решения, которое вы запрашиваете, вы можете использовать printf:
printf '%s\n' text1 text2 text3 text4 | myscript
, чтобы, определяя псевдоним для SOMEPROGRAM как:
alias SOMEPROGRAM="printf '%s\n'"
, вы могли бы эффективно вызвать
SOMEPROGRAM text1 text2 text3 text4 | myscript
Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что она не " t знать, где начинаются параметры параметров myscript и текстовые параметры, если myscript не будет эффективно вызываться без каких-либо параметров. В этом случае вы можете использовать функцию:
SOMEPROGRAM() {
myscript="$1"
shift
printf '%s\n' "$@" | "$myscript"
}
, чтобы вы могли эффективно называть
SOMEPROGRAM myscript text1 text2 text3 text4
С помощью bash вы можете сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\
Итак, в основном, вы хотите передать каждый аргумент как строку дочерней программе. Ниже приведен скрипт, который перебирает все аргументы, переданные ti SOMEPROGRAM, и печатает их как строку. Вы можете передать пустую строку («введите без ввода чего-либо раньше»), передав пустой аргумент, как в SOMEPROGRAM yes '' | myscript.
#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
echo "$arg"
done
Если вам всегда нужно ответить «да» на ваш сценарий, используйте coreutil yes:
yes | myscript
Если вам нужно передать какое-то другое значение, скажите «нет»:
yes 'no' | myscript
Я почти уверен, что вы ожидаете.
изменить: пример добавлен
#!/bin/bash
USER="root"
HOST="192.168.1.111"
PASS="secret"
expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
interact
"
- из ожидать блог
Для простых случаев способ, которым enzotib описывает его с помощью stdin из файла, кажется разумным. Рассмотрим этот скрипт:
#!/bin/bash
read -p "What's your name?" name
echo $name
read -p "Age?" age
echo $age
echo "Your name is " $name " and your age is "$age
вызывать его с помощью:
echo -e "Foobar\n14\n" | ./namenage.sh
-e - включить escape-последовательности, такие как \n ewline.
Foobar
14
Your name is Foobar and your age is 14
Обратите внимание, как магически, bash не выводит приглашение для чтения.
Однако для более сложных случаев существует программа, называемая expect для обработки интерактивных программ CLI, где вам нужно дождаться следующего приглашения, прежде чем вводить второе значение, и я думаю, вы можете даже ветвь в условиях.
если вы пишете сценарий, то просто воспользуйтесь команде getopts так как аргументы передаются в скрипт и затем вы можете использовать эти аргументы, как вы хотите? Это то, что вы ищете?
http://wiki.bash-hackers.org/howto/getopts_tutorial
Вы можете передать параметры, но это не сработает, вам также придется модифицировать скрипт bash, чтобы принимать параметры из командной строки.
Я понимаю, что вы не хотите изменять myscript.
Что касается второго решения, которое вы запрашиваете, вы можете использовать printf:
printf '%s\n' text1 text2 text3 text4 | myscript
, чтобы, определяя псевдоним для SOMEPROGRAM как:
alias SOMEPROGRAM="printf '%s\n'"
, вы могли бы эффективно вызвать
SOMEPROGRAM text1 text2 text3 text4 | myscript
Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что она не " t знать, где начинаются параметры параметров myscript и текстовые параметры, если myscript не будет эффективно вызываться без каких-либо параметров. В этом случае вы можете использовать функцию:
SOMEPROGRAM() {
myscript="$1"
shift
printf '%s\n' "$@" | "$myscript"
}
, чтобы вы могли эффективно называть
SOMEPROGRAM myscript text1 text2 text3 text4
в bash, вы можете сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\
Итак, в основном, вы хотите передать каждый аргумент как строку дочерней программе. Ниже приведен скрипт, который перебирает все аргументы, переданные ti SOMEPROGRAM, и печатает их как строку. Вы можете передать пустую строку («введите без ввода чего-либо раньше»), передав пустой аргумент, как в SOMEPROGRAM yes '' | myscript.
#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
echo "$arg"
done
Если вам всегда нужно ответить «да» на ваш сценарий, используйте coreutil yes:
yes | myscript
Если вам нужно передать какое-то другое значение, скажите «нет»:
yes 'no' | myscript
Я почти уверен, что вы ожидаете.
изменить: пример добавлен
#!/bin/bash
USER="root"
HOST="192.168.1.111"
PASS="secret"
expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
interact
"
- из ожидать блог
Для простых случаев способ, которым enzotib описывает его с помощью stdin из файла, кажется разумным. Рассмотрим этот скрипт:
#!/bin/bash
read -p "What's your name?" name
echo $name
read -p "Age?" age
echo $age
echo "Your name is " $name " and your age is "$age
вызывать его с помощью:
echo -e "Foobar\n14\n" | ./namenage.sh
-e - включить escape-последовательности, такие как \n ewline.
Foobar
14
Your name is Foobar and your age is 14
Обратите внимание, как магически, bash не выводит приглашение для чтения.
Однако для более сложных случаев существует программа, называемая expect для обработки интерактивных программ CLI, где вам нужно дождаться следующего приглашения, прежде чем вводить второе значение, и я думаю, вы можете даже ветвь в условиях.
Если вы пишете скрипт, просто используйте getopts, чтобы аргументы были переданы скриптам, а затем вы можете использовать эти аргументы, как хотите? Это то, что вы ищете?
http://wiki.bash-hackers.org/howto/getopts_tutorial
Вы можете передать параметры, но это не сработает, вам также придется модифицировать скрипт bash, чтобы принимать параметры из командной строки.
Я понимаю, что вы не хотите изменять myscript.
Что касается второго решения, которое вы запрашиваете, вы можете использовать printf:
printf '%s\n' text1 text2 text3 text4 | myscript
, чтобы, определяя псевдоним для SOMEPROGRAM как:
alias SOMEPROGRAM="printf '%s\n'"
, вы могли бы эффективно вызвать
SOMEPROGRAM text1 text2 text3 text4 | myscript
Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что она не " t знать, где начинаются параметры параметров myscript и текстовые параметры, если myscript не будет эффективно вызываться без каких-либо параметров. В этом случае вы можете использовать функцию:
SOMEPROGRAM() {
myscript="$1"
shift
printf '%s\n' "$@" | "$myscript"
}
, чтобы вы могли эффективно называть
SOMEPROGRAM myscript text1 text2 text3 text4
С помощью bash вы можете сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\