Wiki

Манипуляции с shell-переменными

Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т.е "35" - это не число, а строка из двух символов "3" и "5", в раде случаев они могут интерпретироваться иначе, например, как целые числа.

Разнообразные возможности имеет команда "expr".
Проиллюстрируем некоторые на примерах:
Выполнение командного файла:

     x=7 y=2
     a=`expr $x + $y`   ; echo a=$a
     a=`expr $a + 1`    ; echo a=$a
     b=`expr $y - $x`   ; echo b=$b
     c=`expr $x '*' $y` ; echo c=$c
     d=`expr $x / $y`   ; echo d=$d
     e=`expr $x % $y`   ; echo e=$e

выдаст на экран
     a=9
     a=10
     b=-5
     c=14
     d=3
     e=1

ВНИМАНИЕ. Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в shell этот значек воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов.

Следует обратить также внимание на обязательные пробелы, отделяющие переменные и знаки операций.

С командой "expr" возможны не только (целочисленные) арифметические операции, но и строковые:

     A=`expr 'cocktail' : 'cock'`  ; echo $A
     B=`expr 'cocktail' : 'tail'`  ; echo $B
     C=`expr 'cocktail' : 'cook'`  ; echo $C
     D=`expr 'cock' : 'cocktail'`  ; echo $D

На экран будут выведены числа, показывающее число совпадающих символов в цепочках (от начала). Вторая из строк не может быть длиннее первой :
     4
     0
     0
     0

И наконец, об условной замене переменныйх.
Если переменные, скажем "х", "y", "z", не определены, то при обращении к переменным
     ${x-new} - в качестве значения "x" будет выдано "new",
     ${y=new} - в качестве значения "у" будет присвоено "new",
     ${z?new} - в качестве значения "z" будет выдано "z: new" и соответствующая процедура прекращается.

Во всех этих случаях, если переменная была к этому времени определена, то ее значение используется обычным образом.
А в следующем случае наоборот, пусть переменная "v" имеет какое-то значение, тогда
   ${z+new}  -  в  качестве  значения "z" будет выдано "new", а если не было присвоено значение, то пустая строка.