意外标记“fi”附近的语法错误

raj*_*rma -1 shell-script

我收到语法错误unexpected token fiPermission 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)

typ*_*ast 6

不平衡报价

你所拥有的是一个不平衡引号的混乱例子。

每对单引号和双引号都必须是平衡的,这意味着,无论何时您有一个开引号,您都必须在同一语句中稍后有一个结束引号,并且它们必须正确嵌套。(因此,例如,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 ...不会做你(可能)想要的,在这里。printfs 第一个参数是格式字符串(在本例中为"su"),因此,它将打印su