我如何在bash中混合或者在if语句中混合?

时间:2017-11-13 19:14:56

标签: bash

我有这个函数接受3个参数,例如,一个包含4个数字和一个大写字母,例如:“1234A” 如果第二个参数大于第三个参数且小于第一个参数,我想打印1 我写了这个函数,我在每个参数的参数和每个参数的不同参数中切出了4个数字,我开始比较 但它没有打印出来的问题!!

任何人都知道如何用一个if语句而不是两个if语句来做事情?

我做了什么:

<button id="addCust" class="addSort" onclick="appendRow('custList')">add customer</button>
<div class="custScroll">
        <table id="custListTop" contenteditable="false">
          <tr>
            <td style="border-top-left-radius: 5px;">Customers</td>
            <td style="border-top-right-radius: 5px;">Main Location</td>
          </tr>
        </table>
        <table id="custList" contenteditable="true">
          <tr>
            <td>Someone</td>
            <td>Somewhere</td>
          </tr>
        </table>
      </div>

当我在bash中测试时,我什么也得不到,我得到一个空行.. 这是我测试它的方式:

function check {
    curr_letter=`echo "$1" | cut -c5` 
    min_letter=`echo "$3" | cut -c5`
    sm_letter=`echo "$2" | cut -c5`
    curr_nums=`echo "$1" | cut -c1-4`
    min_nums=`echo "$3" | cut -c1-4`
    sm_nums=`echo "$2" | cut -c1-4`
    if [[ sm_nums -eq curr_nums && sm_letter < curr_letter ]] ; then 
      if [[ sm_nums -eq min_nums && sm_letter > min_letter ]] ; then 
        echo 1
      fi
      if [[ sm_nums > min_nums ]] ; then
        echo 1
      fi
    fi

    if [[ sm_nums < curr_nums ]] ; then
      if [[ sm_nums -eq min_nums && sm_letter > min_letter ]] ; then 
        echo 1
      fi
      if [[ sm_nums > min_nums ]] ; then
        echo 1
      fi
    fi
}

2 个答案:

答案 0 :(得分:2)

您可以在算术上下文$中省略变量名中的((...))。 在[[ ... ]]范围内,您无法省略它。

您可以使用Bash自己的语法echo ... | cut -c...轻松提取子字符串,而不是调用{var:start:length}

[[ ... ]]((...))内, 使用==代替-eq

但请注意,<>运算符按字典顺序排列在[[ ... ]]内,但在算术上下文((...))中按数字排序。 因此,字符串值变量(在您的示例中名为*_letter) 应在[[ ... ]]内进行比较,数值变量(在您的示例中名为*_nums)应在((...))内进行比较。

像这样:

function check() {
    curr_letter=${1:4:1}
    min_letter=${3:4:1}
    sm_letter=${2:4:1}
    curr_nums=${1:0:4}
    min_nums=${3:0:4}
    sm_nums=${2:0:4}

    if (( sm_nums == curr_nums )) && [[ $sm_letter < $curr_letter ]]; then 
        if (( sm_nums == min_nums )) && [[ $sm_letter > $min_letter ]] ; then 
            echo 1
        fi
        if (( sm_nums > min_nums )) ; then
            echo 1
        fi
    fi

    if (( sm_nums < curr_nums )) ; then
        if (( sm_nums == min_nums )) && [[ $sm_letter > $min_letter ]] ; then 
            echo 1
        fi
        if (( sm_nums > min_nums )) ; then
            echo 1
        fi
    fi
}

最后,而不是p=`check "1617B" "1617A" "0000A"`; echo $p, 更好的写这样:

echo $(check "1617B" "1617A" "0000A")

答案 1 :(得分:0)

为什么不只是

awk '$3 <= $2 && $2 <= $1 {print 1}'

或者如果你需要一个功能

check() { awk '$3 <= $2 && $2 <= $1 {print 1}' <<< "$@"; }

check() { awk "BEGIN{if($3 <= $2 && $2 <= $1) print 1}"; }