【问题标题】:bash shell scripting: conditional string concatenationbash shell 脚本:条件字符串连接
【发布时间】:2021-12-31 23:11:32
【问题描述】:

我想有条件地将文本提交到另一个 shell 脚本中。这意味着我想在 deb=1 的情况下将“WARNING”替换为“INFO”:

#!/usr/bin/env bash
...
if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]]
then 
    ./discord.sh --webhook-url=$url --text "WARNING: $abc"
fi

我还想避免另一个完整的 IF 语句。我希望有类似的东西

deb=1 ? "INFO" : "WARNING"

这行得通吗?如果是,完整的陈述会是什么样子? “--文字...”

提前谢谢你。

【问题讨论】:

    标签: bash scripting raspberry-pi debian


    【解决方案1】:

    可以使用数组索引来匹配带有名称字符串的数字日志级别:

    #!/usr/bin/env bash
    
    url=https://example.com/hook
    
    logLevel=(WARNING INFO)
    
    for abc in 97 98; do
      for deb in 0 1; do
        printf 'abc=%d, deb=%d:\n' $abc $deb
        (((i = 1 == deb) || 98 > abc)) &&
          echo ./discord.sh --webhook-url=$url --text "${logLevel[i]}: $abc"
      done
    done
    

    输出:

    abc=97, deb=0:
    ./discord.sh --webhook-url=https://example.com/hook --text WARNING: 97
    abc=97, deb=1:
    ./discord.sh --webhook-url=https://example.com/hook --text INFO: 97
    abc=98, deb=0:
    abc=98, deb=1:
    ./discord.sh --webhook-url=https://example.com/hook --text INFO: 98
    

    【讨论】:

    • 嗯,很酷的主意。非常感谢
    • abc==100deb==1 时,if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]] 为真。修复后删除echo
    【解决方案2】:

    你的意思是这样的?

     [[ $abc -lt 98 ]] && {
       ./discord.sh --webhook-url=$url --text "$([[ $deb -eq 1 ]] && echo "INFO" || echo "WARNING"): $abc"
     }
    

    将其视为if then else fi 的替代品(大括号仅在您有更多命令时才需要,但我还是喜欢使用它,以提高可读性(在某些情况下) .

    基本上是这样的

    [[ condition ]] && { commands if true } || { commands if false }

    【讨论】:

    • abc==100deb==1你也想打电话给discord.sh
    • 是的,这个对我有用:$([[ $deb -eq 1 ]] && echo 'INFO' || echo 'WARNING')
    • 非常感谢
    【解决方案3】:

    请你试试:

    if (( abc < 98 || deb == 1 )); then
        loglevel=$( (( deb == 1 )) && echo "INFO" || echo "WARNING" )
        ./discord.sh --webhook-url=$url --text "$loglevel: $abc"
    fi
    

    【讨论】:

    • 看起来很不错,谢谢!
    • 出于测试目的,我忘记删除echo 命令。现已修复。
    • 非常感谢
    【解决方案4】:

    恕我直言,@tshiono 的答案是最好的。但是,它变得难以阅读/调试。
    为什么不使用详细的解决方案?
    当这两个条件都为真时,您想使用 INFO 进行日志记录。

    if ((deb==1 )); then 
      ./discord.sh --webhook-url="$url" --text "INFO: $abc"
    elif ((abc < 98)); then
      ./discord.sh --webhook-url="$url" --text "WARNING: $abc"
    fi
    

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      相关资源
      最近更新 更多