不平衡报价

不平衡报价

我在以下脚本中收到语法错误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

答案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

相关内容