我有一个关于 Linux 上的 shell 脚本的问题。我正在尝试运行这个:
$ sh << EOF
#!/bin/sh
function test {
echo test
echo test2
}
test
EOF
结果是:
test
test2
但是,如果我想使用参数运行脚本而不将其保存到文件中怎么办?
$ sh $1 test1 test2 << EOF
#!/bin/sh
function test {
echo $2
echo $3
}
test
EOF
我怎样才能做到这一点?
答案1
如果您使用 shell 的选项启动 shell,shell 将从标准输入读取脚本并执行-s
。这将阻止它相信第一个选项是脚本文件的名称。
所以使用bash -s "$1" test1 test2
.
请注意,如果脚本(或从脚本内调用的任何实用程序)正在从标准输入流读取,它将消耗脚本本身。因此,这不适合需要标准输入流的脚本。另请注意,我使用了bash
而不是sh
.这是使用非标准function
关键字创建函数所必需的。
假设该函数(我将其重命名mytest
为test
内置命令的名称)应输出脚本的第二个和第三个命令行参数,这些参数需要在调用时传递给该函数。
你可以通过传递来做到这一点全部函数的参数使用
mytest "$@"
...或者,您可以只传递您需要的两个(并将函数更改为输出,"$1"
而"$2"
不是它是两个第一个参数):
mytest "$2" "$3"
您还需要引用所有扩展,例如$1
命令行上的 以及$2
脚本$3
本身中的 。看什么时候需要双引号?
该脚本需要使用引here-document 或脚本中的扩展将由调用 shell 执行,而不是由bash
您正在启动的 shell 执行。您可以通过引用初始此处文档分隔符的任何部分来引用此处文档。
考虑到所有这些因素,您可能需要使用以下内容:
bash -s "$1" test1 test2 <<'END_SCRIPT'
function mytest {
echo "$2"
echo "$3"
}
mytest "$@"
END_SCRIPT
或者,与sh
:
sh -s "$1" test1 test2 <<'END_SCRIPT'
mytest () {
echo "$2"
echo "$3"
}
mytest "$@"
END_SCRIPT