在控制台会话中运行 shell 脚本而不将其保存到文件

在控制台会话中运行 shell 脚本而不将其保存到文件

我有一个关于 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关键字创建函数所必需的。

假设该函数(我将其重命名mytesttest内置命令的名称)应输出脚本的第二个和第三个命令行参数,这些参数需要在调用时传递给该函数。

你可以通过传递来做到这一点全部函数的参数使用

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

相关内容