在 bash 中,heredoc 内部函数 returns 语法错误
in bash, heredoc inside function returns syntax error
我有以下功能:
#!/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
似乎有效。在错误消息的中间,我得到了 dbname
,但仍然 returns 语法错误。
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: `}'
如果我完全删除函数调用,我会得到没有错误的结果:
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
我需要做什么才能让它在函数中工作?
编辑:
以下建议在 EOF 标记后放置方括号并添加函数关键字:
> 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
)'
./test.sh:第 10 行:`)'
你的函数声明是错误的:
get_instance{
应该是
之一
function get_instance {
get_instance() {
将右括号放在不同的行上:
dbname=$(sqlplus -s / as sysdba<<EOF
...
EOF
)
heredoc 的终止词应该是该行中唯一的字符(使用 <<-
时制表符除外)。演示:
$ x=$(cat <<END
> one
> two
> END)
bash: warning: here-document at line 5 delimited by end-of-file (wanted `END')
$ echo "$x"
one
two
所以它意外地起作用了。更好的做法是:
$ y=$(cat <<END
> 1
> 2
> END
> )
$ echo "$y"
1
2
我有以下功能:
#!/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
似乎有效。在错误消息的中间,我得到了 dbname
,但仍然 returns 语法错误。
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: `}'
如果我完全删除函数调用,我会得到没有错误的结果:
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
我需要做什么才能让它在函数中工作?
编辑:
以下建议在 EOF 标记后放置方括号并添加函数关键字:
> 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
)'
./test.sh:第 10 行:`)'
你的函数声明是错误的:
get_instance{
应该是
之一function get_instance {
get_instance() {
将右括号放在不同的行上:
dbname=$(sqlplus -s / as sysdba<<EOF
...
EOF
)
heredoc 的终止词应该是该行中唯一的字符(使用 <<-
时制表符除外)。演示:
$ x=$(cat <<END
> one
> two
> END)
bash: warning: here-document at line 5 delimited by end-of-file (wanted `END')
$ echo "$x"
one
two
所以它意外地起作用了。更好的做法是:
$ y=$(cat <<END
> 1
> 2
> END
> )
$ echo "$y"
1
2