Являются <=,> =, <,>, ==,! =, && и || используется для арифметических выражений или условных выражений?

непроверено из-за отсутствия входных данных:

gawk '
    BEGIN {FS = OFS = "\t"}
    BEGINFILE {match(FILENAME, /inputfile_([0-9]+).assoc.logistic/, m)}
    FNR == 1 {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7"_"m[1] OFS $8"_"m[1] OFS $9"_"m[1]
        next
    }
    {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7 OFS $8 OFS $9
    }
    END {
        for (key in data) {
            print key data[key]
        }
    }
' inputfile_*.assoc.logistic > outputfile

Так как я перебираю хеш-ключи для вывода данных, вывод будет отображаться в случайном порядке заказ

1
18.03.2016, 06:56
2 ответа

«Условное выражение» - это то, что используется внутри теста [ или [[] команды.

Итак, оба ваших вопроса 1 и 2 означают одно и то же:

  1. могут ли они использоваться в условных выражениях ?: Да.
  2. могут ли они использоваться в тестовых командах ?: Да.

Однако они не означают то, что вы думаете:

$ if [[ 1 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ 10 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ e < è ]]; then echo yes; else echo no; fi
yes

Это сравнение, как указано в руководстве:

True if string1 sorts before string2 lexicographically.

То есть: в порядке словаря (и зависит от переменной LC_COLLATE)

Тест с простым [ перенаправит вывод в файлы:

$ if [ e < è ]; then echo h; else echo b; fi
bash: è: No such file or directory
b

Чтобы заставить его работать, вам нужно использовать обратную косую черту (процитируйте <и>):

$ if [ e \< è ]; then echo h; else echo b; fi
h

Но я не рекомендую использовать <в тесте .


В другом месте, где могут использоваться <, <=,>,> =, находятся внутри арифметических тестов, которые могут быть частью теста if:

$ if (( 12 <= 15 )); then echo "yes"; fi
yes

Что, да, эквивалентно:

$ if [[ 12 -le 15 ]]; then echo "yes"; fi
yes

И вполне аналогично:

$ if [ 12 -le 15 ]; then echo "yes"; fi
yes

Итак, да, все это:

<= >= < >     comparison
== !=         equality and inequality 
&&            logical AND
||            logical OR

Используются для условных выражений внутри арифметических выражений:

$ if (( ( ((2<3)&&(3>7)) * 18 ) == 0 )); then echo "yes"; fi
yes

Это не те же условные выражения, что и внутри команды test .

0
27.01.2020, 23:13

Все очень просто. Вы просто должны понять [], [[]] и (()) как совершенно разных зверей.

[ выражение ] - это просто вызов программы [ (просто другое название для test), которая принимает выражение в качестве аргументов, как и все вызовы команд в bash. Это означает, что вы должны использовать пробелы между аргументами, особенно после [ и перед ], ключевые слова и специальные символы должны быть экранированы или заключены в кавычки, а переменные расширяются обычным образом.

Внутри выражения, -gt, -lt и related используются для числового сравнения, а >, < и sort - для сравнения строк. Считайте, что [ не имеет никакого отношения к bash, а просто вызывает команду, которая оценивает выражения и возвращает 0 (true) или ненулевое значение (false), как это делают все программы.

Булевы операторы && и || не могут быть использованы здесь, потому что они интерпретируются bash и не передаются в test в качестве аргументов. Вместо них используются -a и -o. Но вы всегда можете сделать [ test1 ] && [ test2 ] || [ test3 ], которые представляют собой три вызова теста, объединенные обычными булевыми операторами bash (то есть, если первый не сработал, второй пропускается).

Обратите внимание, что bash все еще поставляется с собственной реализацией [ (builtin), но это не меняет синтаксической трактовки.

[[ ]] и (( )) - это не встроенные замены команд, а части специального синтаксиса, поэтому к ним применяются другие правила. Подробнее о том, как там обрабатываются имена переменных с подстановочными знаками, см. страницу man. Булевы операторы && и || имеют обычное значение.

[[ ]] ориентирован на строки: все сравнения для строк (но более "современные", локально-зависимые, чем в [, хотя test может быть платформо-зависимым). Он также обрабатывает тесты файлов, regex и т.д.

Символ (( )) предназначен для арифметических выражений. Имена переменных там не требуют $, и вы можете в основном просто писать там математические выражения - это, конечно, включает сравнения (которые являются числовыми). Сравнение в этом случае ничем не отличается от любого другого арифметического выражения, true - 1, false - 0, и вы можете написать что-то вроде (( x=y*(z>4) )). При использовании в условном выражении ненулевое значение будет истинным, а нулевое - ложным. Результат также можно представить в виде $(( )).

Итак:

  • [[ ]] строковые условия, сопоставление шаблонов и тесты файлов
  • (( )) арифметические выражения и условия
  • [ ] тест команда: обрабатывает оба, специальный нестандартный синтаксис для булевых операторов и операторов сравнения
7
27.01.2020, 23:13

Теги

Похожие вопросы