我收到语法错误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
Run Code Online (Sandbox Code Playgroud)
你所拥有的是一个不平衡引号的混乱例子。
每对单引号和双引号都必须是平衡的,这意味着,无论何时您有一个开引号,您都必须在同一语句中稍后有一个结束引号,并且它们必须正确嵌套。(因此,例如,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
Run Code Online (Sandbox Code Playgroud)
虽然上面的语法现在是有效的,但我还有一些问题:
$cmd
这么多次吗?输出是否改变(即,查询是否有副作用?)或者您可以保存结果并单独附加到您的日志文件中吗?resset.log
打字错误,还是您真的有三个不同的日志?printf ...
不会做你(可能)想要的,在这里。printf
s 第一个参数是格式字符串(在本例中为"su"
),因此,它将打印su
。 归档时间: |
|
查看次数: |
3170 次 |
最近记录: |