我正在编写一个 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 即可将参数传递给脚本,然后您就可以根据需要使用这些参数了?这是您要找的东西吗?