仅当从ruby脚本运行时,Bash for循环才会出现语法错误

我有一个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脚本运行它时,它发现我的语法有问题

怎么能让这个工作?

-c从你的bash删除。 这会导致./#{path_to_pullLogs_sh}用作要运行的命令,并且以下参数作为shell参数传递,以$0开头,而不是$1 ,这意味着您的脚本是一个短参数。

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

(这与Z1MM32M4N注释的原因相同;它使bash./pullLogs.sh视为要运行的脚本,而不是包含要执行的shell代码片段的字符串。)