在 bash 中,heredoc 内部函数返回语法错误

Nic*_*nay 4 variables bash sqlplus heredoc solaris-10

我有以下功能:

#!/bin/bash

get_instance{
dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF)

echo $dbname

}

get_instance
Run Code Online (Sandbox Code Playgroud)

它似乎工作。在错误消息的中间,我得到了我的dbname,但仍然返回一个语法错误。

 oracle@testdb01:db01:/home/oracle/
 > ./test.sh
 ./test.sh: line 3: get_instance{: command not found
 DB01
 ./test.sh: line 11: syntax error near unexpected token `}'
 ./test.sh: line 11: `}'
Run Code Online (Sandbox Code Playgroud)

如果我完全删除函数调用,我会得到没有错误的结果:

dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF)
echo $dbname

oracle@testdb01:db01:/home/oracle
> ./test.sh
DB01
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能让它在函数中工作?

编辑:

以下建议在 EOF 标签后放置括号并添加 function 关键字:

 > vi test.sh
 "test.sh" 12 lines, 160 characters

#!/bin/bash
# updated file
function get_instance{
dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF
)
echo $dbname
}

get_instance

oracle@testdb01:db01:/home/oracle
> ./test.sh
./test.sh: line 10: syntax error near unexpected token `dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF
)'
Run Code Online (Sandbox Code Playgroud)

./test.sh: 第 10 行:`)'

gle*_*man 5

你的函数声明是错误的:

get_instance{
Run Code Online (Sandbox Code Playgroud)

应该是其中之一

function get_instance {
get_instance() {
Run Code Online (Sandbox Code Playgroud)

将右括号放在不同的行上:

dbname=$(sqlplus -s / as sysdba<<EOF
...
EOF
)
Run Code Online (Sandbox Code Playgroud)

继承人的终止词应该是该行中唯一的字符(使用时的制表符除外<<-)。演示:

$ x=$(cat <<END
> one
> two
> END)
bash: warning: here-document at line 5 delimited by end-of-file (wanted `END')
$ echo "$x"
one
two
Run Code Online (Sandbox Code Playgroud)

所以它起作用了,不小心。更好的做法是:

$ y=$(cat <<END
> 1
> 2
> END
> )
$ echo "$y"
1
2
Run Code Online (Sandbox Code Playgroud)