巴什for循环具有从Ruby脚本运行,只有当语法错误(Bash for loop has synta

2019-10-20 15:54发布

我有一个Ruby脚本,编排了一些其他的脚本。 其中的bash脚本的拉从服务器日志数据,然后Ruby脚本解析他们。

我的bash脚本看起来是这样的:

#pullLogs.sh
for ((x = $2; x <= $3; x++)); do
    # creates a subdirectory for each server number
    rsync --progress -rvze ssh name@$ARCHIVE_SERVER:/path/to/log/$logDate.gz $x/
done
for ((x = $2; x <= $3; x++)); do
     cd $x
     for z in *.gz; do gunzip $z; done
     cd ..
done
cd ..

这是什么脚本是从给定日期拉原木,从指定的服务器。 通常有十台服务器,因此该脚本将拉动从服务器1,然后从服务器2,等等等等。

该脚本完美的作品,如果我指定的命令行所需的日期

./pullLogs.sh desired_date 1 10

成功地提取所有从所有十台服务器所需日期的日志。

不过,我想向所有从今天的日期原木拉到一些过去的日期,并解析各一个。 所以我用这个Ruby脚本:

while upload_day != $DESIRED_DATE do
    args = "#{year}#{month}#{day} 1 10"
    `bash -c ./#{path_to_pullLogs_sh} #{args}`
    `ruby #{name_of_followup_ruby_script}`
    upload_day = upload_day.prev_day 
end

通过正确的天Ruby脚本进行迭代,并调用正确的bash脚本(一个上面给出)。 然而,在运行bash脚本后,它会产生一个错误:

./pullLogs.sh: line 15: ((: x = : syntax error: operand expected (error token is "= ")
./pullLogs.sh: line 21: ((: x = : syntax error: operand expected (error token is "= ")

所以,当我从控制台运行它,循环变量1和10是很好的,但是当我从Ruby脚本运行它,它会发现一个问题,我的语法

怎样才能使这项工作?

Answer 1:

-c从您的来电bash 。 这将导致./#{path_to_pullLogs_sh}用作运行命令,下面的参数作为外壳参数传递开始$0 ,没有$1 ,这意味着你的脚本是短暂的一个参数。

`bash ./#{path_to_pullLogs_sh} #{args}`

(这适用于同样的原因Z1MM32M4N的评论,它会导致bash治疗./pullLogs.sh作为脚本来运行,而不是包含的shell代码片段执行字符串)。



文章来源: Bash for loop has syntax error only when run from a ruby script