Понимание -f в выражении bash if - PullRequest
0 голосов
/ 08 июня 2019

У меня есть следующий код bash, и он отлично работает, когда я меняю значение 'ca':

ca=4

if  [ -f $(($(($ca > 2)) && $(($ca < 1)))) ] ; then 
    echo  "I can't reach here"
else
    if  [ -f  $(($(($ca == 4)) && ($((4 == $ca))))) ] ; then 
         echo  "It is 4"
    else
         echo  "Else works wonders"
    fi
fi

, но если я удаляю "-f" из if - заявление, все выводит неправильно.Насколько я искал, -f для файлов, но я не понимаю, как это работает в приведенном выше случае.Кроме того, любые предложения об альтернативных способах написания этих сложных выражений в if -составлениях в bash также будут полезны.

Примечание. Приведенный выше код выглядит странно, поскольку он не написан от руки и преобразован из JS с использованием транспилятора , над которым я работаю.Ниже приведен исходный код JS:

let ca = 4;
if (ca > 2 && ca<1) {
  console.log("I can't reach here");
} else if(ca == 4 && (4 == ca)){
    console.log("It is 4")
}else {
  console.log("Else works wonders");
}

Дальнейшее редактирование / решение:

Теперь я могу правильно перенести вышеприведенные и другие выражения, используя Diego Torres Milano * Рекомендация 1023 * .

Ниже приведен пример ввода и вывода транспилятора, чтобы любой, кто сталкивался с подобными проблемами, мог получить некоторые идеи.

Вход JS / TS:

let ca = 3;
if (ca > 2 && ca<4) {
  console.log("3!!");
} else if(ca == 4 && (4 == ca)){
    console.log("It is 4")
}else {
  console.log("Else works wonders");
}

var cb = true
let cc :any = false //"any" is used for calming the TS compiler

if(cb==cc){
    console.log("I will never be logged")
}else{
    console.log("Expect me!")
}

if(!cc){
    console.log("Negation?")
}

Выход Bash:

ca=3

if  ((  $(($(($ca > 2)) && $(($ca < 4)))) )) ; then 
  echo  "3!!"
else
  if  ((  $(($(($ca == 4)) && ($((4 == $ca))))) )) ; then 
    echo  "It is 4"
  else
    echo  "Else works wonders"
  fi
fi

cb=1
cc=0

if  ((  $(($cb == $cc)) )) ; then 
  echo  "I will never be logged"
else
 echo  "Expect me!"
fi

if  ((   ! $cc )) ; then 
 echo  "Negation?"
fi

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вы можете использовать арифметическую оценку

ca=4
if (( ca > 2 && ca < 1 ))
then
   ...

То, что вы оцениваете с [ без -f, это если STRING не пусто.

0 голосов
/ 08 июня 2019

Некоторые примечания по коду JS:

let ca = 4;
if (ca > 2 && ca<1) {
  console.log("I can't reach here");
} else if(ca == 4 && (4 == ca)){
    console.log("It is 4")
}else {
  console.log("Else works wonders");
}

Принимая их по порядку:

  1. Код: let ca = 4 переводится как ca=4.

  2. И ...

    if (ca > 2 && ca<1) {
      console.log("I can't reach here");
    } else 
    

    ... так как ca не может быть больше 2 и меньше чем 1, этот код не нужен и его следует опускать. Если бы необходимо (и существовала какая-то программа или функция с именем console.log), это было бы переведено так:

    if [ $ca -gt 2 && $ca -lt 1 ]; then
      console.log "I can't reach here"
    else
    
  3. Этот код:

    if(ca == 4 && (4 == ca)){
        console.log("It is 4")
    }else {
      console.log("Else works wonders");
    }
    

    ... имеет избыточный тест ca, который следует пропустить. Может быть переведено на

    if [ $ca = 4 ] ; then
        console.log "It is 4"
    else
        console.log "Else works wonders"
    fi
    

В целом получаем:

ca=4
if [ $ca -gt 2 && $ca -lt 1 ]; then
  console.log "I can't reach here"
else
    if [ $ca = 4 ] ; then
        console.log "It is 4"
    else
        console.log "Else works wonders"
    fi
fi

... или с пропущенным ненужным кодом:

ca=4
if [ $ca = 4 ] ; then
    console.log "It is 4"
else
    console.log "Else works wonders"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...