【问题标题】:Bash if then statement for multiple, clustered conditionsBash if then 语句用于多个集群条件
【发布时间】:2021-09-14 17:46:21
【问题描述】:

我正在尝试编写一个仅在满足某些条件时才运行 R 脚本的命令。

条件聚类如下(这是假数据,但问题是一样的):

  1. 如果第一个参数 ($1) 包含 dog 并且第二个参数 ($2) > 10,则运行 old.R 脚本
  2. 如果 $1 包含 cat AND $2 > 12,则运行 old.R 脚本

我尝试了两种方法:

方法一:

if [[ $1 =~ dog ]] && [ $2 -gt 10 ]] || if [[ $1 =~ cat ]] && [ $2 -gt 12 ]]; 
then 
Rscript elderly.R
fi

方法二:

if [[ $1 =~ dog ]] && [ $2 -gt 10 ]]; 
then 
Rscript elderly.R
elif [[ $1 =~ cat ]] && [ $2 -gt 12 ]];
then
Rscript elderly.R
else
echo "parameters not in range"
fi

如何子集前 2 和后两个 if 参数?

现在,方法 1 正在读取它,好像第一个参数是 dog OR cat 并且年龄大于 10,运行 R 脚本。但是,方法 2 时不输出任何内容

./test.sh cat 13

正在运行。 (test.sh 只是脚本名称的占位符)

感谢所有帮助!

【问题讨论】:

  • 一个想法是使用括号对条件进行分组,例如:if ( [[ $1 ... ]] && [ $2 ... ] ) || ( [[ $1 ... ]] && [ $2 ... ] )
  • 现在试试 - 谢谢!您知道为什么方法 2 不起作用吗?我不确定 elif 失败的原因。
  • 我猜这与单前括号 ([) 和双尾括号 (]]) 的不匹配有关......你应该有单前导/尾随,或双领先/落后,但不是混合;您使用哪一个(单对双)取决于外壳以及您测试的方式/内容;将您的代码(使用适当的 shebang)剪切/粘贴到 shellcheck.net 中应该会突出显示语法问题
  • @markp-fuso 成功了!谢谢你的资源

标签: bash if-statement logic


【解决方案1】:

考虑编写简短的函数来帮助您:

old_dog () {
    [[ $1 == dog ]] && (($2 > 10))
}
old_cat () {
    [[ $1 == cat ]] && (($2 > 12))
}

if old_dog "$@" || old_cat "$@"; then
    Rscript elderly.R
else
    echo "parameters not in range"
fi

或者,减少重复

old_animal () {
    case $1 in
        dog) (($2 > 10)) ;;
        cat) (($2 > 12)) ;;
        *)   false ;;
    esac
}

if old_animal "$@"; then
    Rscript elderly.R
else
    echo "parameters not in range"
fi

你错过了什么:太多的 if;分组不够

if ([[ $1 =~ dog ]] && [ $2 -gt 10 ]) || ([[ $1 =~ cat ]] && [ $2 -gt 12 ]);
#  ^................................^    ^................................^ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2019-04-21
    • 2011-05-10
    • 2013-12-17
    • 2012-07-16
    相关资源
    最近更新 更多