我在以下脚本中收到语法错误unexpected token fi
:Permission denied
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql" >> reset.log 2> reset.log
if su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql; then
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> resset.log
else
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> reset_error.log
fi
答案1
不平衡报价
你所看到的是一个不平衡引号的混乱例子。
每对单引号和双引号都必须平衡,这意味着,每当您有一个开盘报价时,您必须稍后在同一个语句中拥有一个收盘报价,和它们必须正确嵌套。 (例如,echo "foo 'bar' baz"
有效,但echo "foo 'bar baz"'
无效。
因此,在您的情况下sh
(或您似乎使用的任何 Bourne shell),解释引号仿佛它们是平衡的,这会导致脚本的某些部分被“引用”,这是您不希望的,即大部分构造if .. else .. fi
。
您的脚本中的另一个(缩写)示例:su "psql -d "Dhruva" blah.sql"
.在该示例中,该字符串Dhruva
实际上是外部引号,这可能不是您想要的。
本质上,您的问题是报价不平衡。我会进一步分析你的脚本,看看我是否无法弄清楚你想要做什么,并建议一个固定版本,但我承认我不太明白你对脚本的意图。
“固定”脚本
我已将“固定”放入恐吓语录因为即使我可以告诉您如何修复脚本的语法,我仍然有一些担忧,我将在本答案的末尾列举这些担忧。
一些重构,并修复引号
首先,你有一些很长的行,其中包含可以轻松重构的重复元素,这已经使我们的“修复”工作变得更加容易:
#!/bin/sh
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
db="Dhruva"
file="/home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql"
cmd="psql -d $db -f $file"
su postgres -c "$cmd" >> reset.log 2> reset.log
if su postgres -c "$cmd"; then
printf su postgres -c "$cmd" >> resset.log
else
printf su postgres -c "$cmd" >> reset_error.log
fi
虽然上面的语法现在是有效的,但我确实还有一些问题:
- 有必要跑
$cmd
那么多次吗?输出是否改变(即查询是否有副作用?)或者您可以保存结果并单独附加到日志文件吗? - 是
resset.log
拼写错误,还是你真的有三个不同的日志? printf ...
在这里不会做你(可能)想做的事。printf
第一个参数是格式字符串(在本例中为"su"
),因此,它将打印su
。