bash - 如何在 GNU 并行 block 内的 if 语句中进行浮点比较?

标签 bash gnu-parallel

我想并行运行批处理。为此,我通过管道将列表传输到并行。当我有一个 if 语句来比较两个 float (采用 here 形式)时,代码不再运行。这怎么解决呢。

LIMIT=25

ps | parallel -j2 '   
    echo "Do stuff for {} to determine NUM"    
    NUM=33.3333 # set to demonstrate

    if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
        echo "react..."
    fi

    echo "Do stuff..."
    '

打印:

Do stuff for \ \ PID\ TTY\ \ \ \ \ \ \ \ \ \ TIME\ CMD to determine NUM
Do stuff...
(standard_in) 2: syntax error
#... snipp

最佳答案

并行 shell 内未设置 LIMIT。运行echo "$NUM > $LIMIT" | bc -l扩展到echo "123 > " | bc -l这会导致 bc 报告语法错误。您需要将其值导出/传递/放置到从内部并行运行的 shell 中。试试这个:

LIMIT=25
ps | parallel -j2 '   
    LIMIT="'"$LIMIT"'"
    echo "Do stuff for {} to determine NUM"    
    NUM=33.3333 # set to demonstrate

    if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
        echo "react..."
    fi

    echo "Do stuff..."
    '

或者更好地使用env_parallel ,专为此类问题而设计。

旁注:GNU parallel设计用于使用一台或多台计算机并行执行作业。对于在一台计算机上运行的脚本,最好坚持使用 xargs 命令,该命令更常用(因此您不需要每次将脚本移动到另一台计算机时都安装一些软件包)。

关于bash - 如何在 GNU 并行 block 内的 if 语句中进行浮点比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50659107/

相关文章:

encryption - 如何使用GnuPG和GNU并行进行大文件并行加密?

bash - 并行调用多个 bash 函数

hive - 通过 GNU 并行运行时,Beeline 卡在第二个命令上

linux - 在 GNU/Linux 中如何让程序跳过任务栏(任务列表)?

python - 在python中将文本转换为数字

bash - 如何让 fish shell 像 bash 一样删除单词

gnu-parallel - 如何引用 gnu parallel 中的每个参数?

linux - 如何使用 Nagios 监控生成随机 ID 的日志文件

linux - 计算用户登录 Linux 的时间的简单方法

bash - GNU 并行与 for 循环函数