如何通过参数将答案传递给 CLI 脚本?

如何通过参数将答案传递给 CLI 脚本?

我正在编写一个 CLI 脚本,在执行某些操作之前会询问一系列问题。我如何将它们作为参数传递,以便每次测试脚本时都不必反复输入它们?

基本上,它应该自动将 4 个项目传递给 STDIN,例如“text1[ENTER]text2[ENTER]text3[ENTER]text4[ENTER]”。

是的,我可以修改我的脚本来实际读取 shell 参数,但我不想那样做,因为它应该更像一个向导。

寻找类似的东西

SOMEPROGRAM myscript arg1 arg2 arg3 arg4

或者

SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript

或者类似的东西。有这样的程序吗?

答案1

我了解,您不想修改myscript

关于您要求的第二种解决方案,您可以使用printf

printf '%s\n' text1 text2 text3 text4 | myscript

因此,为 SOMEPROGRAM 定义一个别名如下:

alias SOMEPROGRAM="printf '%s\n'" 

你可以有效地调用

SOMEPROGRAM text1 text2 text3 text4 | myscript

第一种形式是不明确的(从 SOMEPROGRAM 的角度来看),因为它不知道myscript选项在哪里结束以及文本参数在哪里开始,除非myscript在没有任何选项的情况下有效调用。在这种情况下,您可以使用一个函数:

SOMEPROGRAM() {
  myscript="$1"
  shift
  printf '%s\n' "$@" | "$myscript"
}

这样你就可以有效地调用

SOMEPROGRAM myscript text1 text2 text3 text4

答案2

因此,基本上,您希望将每个参数作为一行传递给子程序。下面是一个脚本,它循环遍历传递的所有参数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

答案3

使用 bash,您可以执行以下操作:

myscript << END
arg1 
arg2
arg3
arg4
END

或者

myscript <<< $'arg1\narg2\narg3\narg4\

答案4

如果您正在编写脚本,那么只需使用 getopts 即可将参数传递给脚本,然后您就可以根据需要使用这些参数了?这是您要找的东西吗?

http://wiki.bash-hackers.org/howto/getopts_tutorial

相关内容