#!/bin/bash
VALUE=10
if [[ VALUE -eq 10 ]]
then
echo "Yes"
fi
K mému překvapení z toho vychází „Ano“. Očekával bych, že to bude vyžadovat [[ $VALUE -eq 10 ]]
. Naskenoval jsem CONDITIONAL EXPRESSIONS
sekce man bash
, ale nenašel jsem nic, co by toto chování vysvětlilo.
Přijatá odpověď:
[[
je bash vyhrazené slovo, proto se použijí speciální pravidla rozšíření, jako je aritmetické rozšíření, ne jako v případě [
. Také aritmetický binární operátor -eq
se používá. Shell proto hledá celočíselný výraz a pokud je u první položky nalezen text, snaží se jej rozšířit jako parametr. Říká se tomu aritmetická expanze a je přítomna v man bash
.
RESERVED WORDS
Reserved words are words that have a special meaning to the shell.
The following words are recognized as reserved
…
[[ ]]
[[ expression ]]
Return a status of 0 or 1 depending on the evaluation of
the conditional expression expression. Expressions are
composed of the primaries described below under CONDITIONAL
EXPRESSIONS. Word splitting and pathname expansion are not
performed on the words between the [[ and ]]; tilde
expansion, parameter and variable expansion, >>>_arithmetic
expansion_<<<, command substitution, process substitution, and
quote removal are performed.
Arithmetic Expansion
…
The evaluation is performed according to the rules listed below
under ARITHMETIC EVALUATION.
ARITHMETIC EVALUATION
…
Within an expression, shell variables may also be referenced
by name without using the parameter expansion syntax.
Takže například:
[[ hdjakshdka -eq fkshdfwuefy ]]
vrátí vždy true
Ale toto vrátí chybu
$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")
K dispozici je také rekurze:
$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
Podezřelý vstup do Crontabu běží „xribfa4“ každých 15 minut?
Tisknout řádky, pokud daný sloupec začíná velkým písmenem?