【问题标题】:Script executes but fails to increment脚本执行但未能递增
【发布时间】:2021-11-07 00:55:02
【问题描述】:

所以我有这个 shell 脚本,我认为它应该运行给定次数,休眠然后恢复,并将结果输出到日志文件

#!/bin/bash

log=/path/to/file/info.log
a=$(COMMAND1 | cut -d : -f 2)
b=$(COMMAND2 | grep VALUE| cut -c 7,8)

for i in {1..4}
 do
         echo "Test" $i  >> $log
         date >> $log
         echo $a >> $log
         echo "$((-113 + (($b * 2)))) VALUE" >> $log
         sleep 60
 done

当我运行ps -ef | grep scriptname.sh 时,脚本似乎确实运行了。执行一次然后 PID 消失,就像运行完成一样。

我已经测试了脚本并且知道它正在运行并捕获我想要的数据。但我不明白为什么它不递增,也不知道为什么它的结束比预期的要早。

info.log 输出样本

Test {1..4}
DATE IN UTC
EXPECTED VALUE OF a
EXPECTED VALUE OF b

请注意,正如我所料,输出实际上是“Test {1..4}”而不是“Test 1”“Test 2”Test 3”等等。

我以./scriptname.sh &/path/to/file/scriptname.sh & 运行脚本

我已经读到使用shbash 运行脚本是有区别的,尽管我不完全理解这会对脚本产生什么影响。我根本不是软件人。

如果我关闭终端,我尝试使用nohup 运行脚本以使其在后台运行。我还认为命令中的& 应该让脚本在后台运行。脚本似乎仍然没有继续运行

我之前问过这个问题,它被关闭了,理由是它类似于一篇关于 sh 和 bash 之间区别的帖子......但这不是我的主要问题。

echo "$BASH_VERSION" 也没有返回任何内容,一个空行。 echo "$-" 返回 smi,我不知道这意味着什么。但bash --version 返回:

BusyBox v1.17.1 (2019-11-26 10:41:00 PST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

所以我的问题是:

  1. 如果使用 sh 运行脚本 - 是否使用 ./scriptname.sh & 完成并使用 bash 运行脚本是 /path/to/file/scriptname.sh &...如果是这样,这对脚本代码的处理方式有什么影响?即 - 使用shbash。我不完全理解两者之间的区别

  2. 为什么当我关闭终端时脚本不能继续运行?这是我最关心的问题。我想在一段时间内每小时运行一次这个脚本。每次我尝试某事并返回时,我都会在日志中获得一个实例。

【问题讨论】:

  • 你没有运行 Bash,你的 /bin/bash 指向 ash,一个最小的 POSIX 兼容 shell。并且ash不支持大括号展开;你必须改用for i in 1 2 3 4 之类的东西。
  • @BenjaminW。是正确的。如果重复次数需要是动态的,你也可以去for i in $(seq 1 4),比如max=5; for i in $(seq 1 $max)
  • 回答您的问题:1) 根据 BenjaminW,您既没有运行 sh 也没有运行 bash,因为您的系统正在用 ash 替换这些命令。这是你问题的核心。使用相对路径还是绝对路径来调用脚本并不重要。 2) ash 不理解 {1..4} 语法,因此它将其视为单个参数并使用完整的“{1..4}”字符串而不是您想要的数字运行一次。使用上面的建议,它会像你期望的那样循环多次;如果您在后台使用& 启动它,它应该会在您注销后继续运行。
  • @BenjaminW。因此,要保持此脚本运行,我需要做的就是更改我的“for”语句以省略大括号?所以像'i in 1 2'之类的,直到我希望它运行的次数?
  • 那个,或者根据 Jeff 的建议使用seqseq 包含在busybox 中。

标签: bash for-loop sh pid


【解决方案1】:

大括号扩展和seq 都不是 POSIX 规范的一部分。使用while 循环。

log=/path/to/file/info.log
a=$(COMMAND1 | cut -d : -f 2)
b=$(COMMAND2 | grep VALUE| cut -c 7,8)

i=1
while [ "$i" -le 4 ]; do
    printf 'Test %s\n' "$i"
    date
    printf '%s\n' "$a"
    printf '%s\n' "$((-113 + (($b * 2)))) VALUE"
    sleep 60 
    i=$((i+1))
done >> "$log"

(我怀疑您也想在循环内将分配移动到 ab;现在,您只是在每次迭代时将相同的文件写入日志。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2017-04-22
    • 2019-05-22
    • 2017-01-18
    • 2012-09-18
    相关资源
    最近更新 更多