我在shell脚本中有以下代码。 只有在函数中不时,这似乎才有效。 有问题的行是包含“<<”的行。 错误消息是
“./ run:第210行:语法错误: 意外的文件结尾“
如何在函数中正确编写?
init_database()
{
cd ../cfg
db.sh << ENDC
$DB_ADMIN
0
y
n
ENDC
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -
}
答案 0 :(得分:5)
有很多方法可以解决这个问题。
1 /取消此处的文档结束标记,例如:
cat <<EOF
hello
$PWD
EOF
但这会让你的代码看起来很难看。
2 /“缩进”此处的文档开始标记:
cat <<' EOF'
hello
$PWD
EOF
其中第一个EOF之前的位与第二个之前的位完全相同(制表符,四个空格,两个制表符,等等)。这允许你保持好的缩进,虽然它不会扩展here-document中的变量($PWD
不会改变)。
3 /允许从输入行和结束标记的开头剥离制表符。
cat <<-EOF
hello
$PWD
EOF
但是没有办法看到行的开头。
4 /为了您的目的,您还可以使用:
( echo "$DB_ADMIN";
echo "" ;
echo "0" ;
echo "y" ;
echo "n"
) | db.sh
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -
我相信4号是您的最佳选择。它允许在行中的任何位置和变量扩展中很好地排列输入,制表符和空格。
答案 1 :(得分:1)
你的“Here document”的结尾需要不缩进,我很害怕。
答案 2 :(得分:1)
ENDC
标签必须在没有前导/尾随空格的行中单独存在。