os_bash
.pdf[stu003@rvs shell]$ echo "$PWD" /home/stu003/work/shell [stu003@rvs shell]$ echo "‘date‘" Fri Apr 6 18:26:58 MSD 2012
[stu003@rvs shell]$ echo "I’d say: \"Go for it\"" I’d say: "Go for it"
[stu003@rvs shell]$ echo "\" > "
"
[stu003@rvs shell]$ echo "\\"
\
3.3 Расширения (shell expansion)
3.3.1Фигурных скобок
ПРИМЕР
stu003@tplatform1:~> echo sp{el,il,al}l
spell spill spall
3.3.2 Тильды
ПРИМЕР
stu003@tplatform1:~> echo ~
/home/stu003
stu003@tplatform1:~> echo ~root
21
/root
stu003@tplatform1:~> echo ~/dir1/ /home/stu003/dir1/ stu003@tplatform1:~> cd work stu003@tplatform1:~/work> cd dir1 stu003@tplatform1:~/work/dir1> cd dir2
stu003@tplatform1:~/work/dir1/dir2> cd dir3 stu003@tplatform1:~/work/dir1/dir2/dir3> echo ~+ /home/stu003/work/dir1/dir2/dir3 stu003@tplatform1:~/work/dir1/dir2/dir3> echo ~- /home/stu003/work/dir1/dir2
3.3.3 Переменной или параметра
ПРИМЕР
stu003@tplatform1:~> VAR1=1 stu003@tplatform1:~> VAR11=2 stu003@tplatform1:~> echo $VAR11 2
stu003@tplatform1:~> echo ${VAR1}1 11
stu003@tplatform1:~> VAR1=VAR11 stu003@tplatform1:~> echo ${VAR1} VAR11
stu003@tplatform1:~> echo ${!VAR1} 2
22
3.3.4 Команды
ПРИМЕР
stu003@tplatform1:~> echo $(date)
Thu Apr 19 19:01:59 MSD 2012
stu003@tplatform1:~> echo ‘date‘
Thu Apr 19 19:02:02 MSD 2012
3.3.5Арифметического выражения
Вцелых числах фиксированной разрядности.
ПРИМЕР
stu003@tplatform1:~> echo $VAR1
VAR11
stu003@tplatform1:~> echo $VAR11
2
stu003@tplatform1:~> echo $(( VAR1 + VAR11 ))
4
stu003@tplatform1:~> echo $[ 3 + 2 ]
5
23
Таблица 41: арифметические операции
Приоритет |
Операция |
Значение |
|
|
|
1 |
VAR ++, VAR -- |
пост-инкремент/декремент |
2 |
++ VAR, -- VAR |
пре-инкремент/декремент |
3 |
+, - |
унарный плюс/минус |
4 |
!, ~ |
логическое/побитовое отрицание |
5 |
** |
возведение в степень |
6 |
*, /, % |
умножение/деление/остаток |
7 |
+, - |
сложение/вычитание |
8 |
<<, >> |
левый/правый побитовый сдвиг |
9 |
<=, >=, <, > |
сравнение |
10 |
==, != |
равенство/неравенство |
11 |
& |
побитовая конъюнкция |
12 |
^ |
побитовое исключающее «или» |
13 |
| |
побитовая дизъюнкция |
14 |
&& |
логическая конъюнкция |
15 |
|| |
логическая дизъюнкция |
16 |
hвыражениеi ? hвыражениеi : |
условное вычисление |
|
hвыражениеi |
|
17 |
=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= |
присваивания |
18 |
, |
разделитель между выражениями |
ПРИМЕР
stu003@tplatform1:~> VAR1=010
stu003@tplatform1:~> echo $VAR1
010
stu003@tplatform1:~> echo $(( VAR1 ))
8
24
stu003@tplatform1:~> VAR2=0xF
stu003@tplatform1:~> echo $(( VAR2 ))
15
stu003@tplatform1:~> VAR3=2#101
stu003@tplatform1:~> echo $(( VAR3 ))
5
3.3.6Процесса
Выражение <(cmd) или >(cmd) разворачивается в имя файла, связанного с именованным каналом (/dev/fd/N), который подключается к стандартному выво-
ду (вводу) команды vrb.
ПРИМЕР
stu003@tplatform1:~> echo <(ls) /dev/fd/63
stu003@tplatform1:~/work/dir1> diff <(ls -l) <(ls -al)
3.3.7Имён файлов
a)После подстановки:
-параметров;
-команд;
-арифметических выражений
происходит разбиение на слова между пробельными символами (если не внутри «"».
25
b)Затем каждое слово ищется на *, ?, [. Есть, значит слово рассматривается как образец и заменяется на отсортированный в алфавитном порядке список
файлов, удовлетворяющих образцу.
ПРИМЕР
stu003@tplatform1:~/work/dir1> echo .*
. ..
3.4 Алгоритмические конструкции
Возвращают код возврата последней исполненной команды или 0, если ко-
манды не были выполнены.
3.4.1 Условный оператор
Упрощённый синтаксис
if hкоманды проверкиi; then hкомандыi; fi
Истина соответствует нулевому коду возврата последней команды проверки.
26
27
Таблица 43: операции проверки
Выражение |
Значение |
|
|
[ -a hфайлi ] [ -e hфайлi ] [ -f hфайлi ] [ -d hфайлi ] [ -h hфайлi ] [ -L hфайлi ] [ -p hфайлi ] [ -b hфайлi ] [ -c hфайлi ] [ -S hфайлi ]
hфайлi существует
hфайлi существует и обычный файл hфайлi существует и каталог
hфайлi существует и символическая ссылка
hфайлi существует и именованный канал hфайлi существует и блочное устройство hфайлi существует и символьное устройство hфайлi существует и сокет
[ -r hфайлi ] [ -w hфайлi ] [ -x hфайлi ]
hфайлi существует и доступен для чтения hфайлi существует и доступен для записи hфайлi существует и доступен для исполнения
[ -s hфайлi ] |
|
|
hфайлi существует и его размер больше 0 |
|||
[ -N hфайлi ] |
|
|
hфайлi существует и изменился с момента его последнего чте- |
|||
|
|
|
|
ния |
|
|
[ hфайл1i |
-nt hфайл2i |
] |
|
время последнего изменения у hфайл1i |
больше, чем у hфайл2i |
|
|
|
|
|
или hфайл1i существует, а hфайл2i не существует |
||
[ hфайл1i |
-ot hфайл2i |
] |
|
время последнего изменения у hфайл1i |
меньше, чем у hфайл2i |
|
|
|
|
|
или hфайл1i не существует, а hфайл2i |
существует |
|
[ hфайл1i |
-ef hфайл2i |
] |
|
hфайл1i |
и hфайл2i — ссылки на 1 и тот же файл |
|
[ -z hстрокаi ] |
|
|
hстрокаi пуста |
|
||
[ -n hстрокаi ] |
|
|
hстрокаi не пуста |
|
||
[ hстрокаi ] |
|
|
|
|||
|
|
|
|
|
||
[ hстрока1i |
== hстрока2i |
] |
hстрока1i |
равна hстрока2i |
|
|
[ hстрока1i |
!= hстрока2i |
] |
hстрока1i |
не равна hстрока2i |
|
|
[ hстрока1i |
< hстрока2i |
] |
|
hстрока1i лексикографически меньше, чем hстрока2i |
||
[ hстрока1i |
> hстрока2i |
] |
|
hстрока1i |
28 |
|
|
лексикографически больше, чем hстрока2i |
|||||
[ hчисло1i |
-eq hчисло2i |
] |
hчисло1i |
равно hчисло2i |
|
|
[ hчисло1i |
-ne hчисло2i |
] |
hчисло1i |
не равно hчисло2i |
|
Таблица 45
Приоритет |
Операция |
|
|
Значение |
|
|
|
|
|
|
|
||||
1 |
[ ! hвыражениеi ] |
|
истина, если hвыражениеi ложь |
||||
2 |
[ (hвыражениеi ) ] |
|
истина, если hвыражениеi истина |
||||
3 |
[ hвыражение1i |
-a hвыражение2i |
] |
истина, |
если |
оба |
hвыражение1i |
|
[ hвыражение1i |
-o hвыражение2i |
|
и hвыражение2i истина |
hвыражение1i |
||
4 |
] |
истина, |
если |
|
|||
|
|
|
|
или hвыражение2i |
истина |
|
Встроенная команда [
ПРИМЕР
stu003@tplatform1:~> if ! grep $USER /etc/passwd ; then echo "non-loc"; fi
stu003:x:1001:100::/home/stu003:/bin/bash
stu003@tplatform1:~> grep $USER /etc/passwd
stu003:x:1001:100::/home/stu003:/bin/bash
stu003@tplatform1:~> if [ $? -ne 0 ] ; then echo "non-loc"; fi
Встроенная команда [[ Отличия от [:
-После подстановки переменных нет разбиения на слова (следовательно, нет необходимости помещать $VAR в «"»).
-Шаблоны в строках не расширяются в имена файлов. Вместо этого операции сравнения строк == и != проверяют соответствие строк образцам.
29
ПРИМЕР
stu003@tplatform1:~> VAR="administration one"
stu003@tplatform1:~> if [[ $VAR == admin* ]]; then echo "You’re admin"; fi You’re admin
Полный синтаксис
if hкоманды проверкиi;
then hкомандыi;
[elif hкоманды проверкиi; then hкомандыi;
... ]
[ else hкомандыi; ]
fi
ПРИМЕР
stu003tplatform1: > year=‘date +stu003tplatform1:~> if [ $[year % 400] -eq 0 \
-o $[year % 4] -eq 0 \
-a $[year % 100] -ne 0 ]; \
then echo "yes"; else echo "no"; fi
yes
#!/bin/sh
year=‘date +%Y‘
if (( ($year % 400) == 0 || ($year % 4) == 0 && (year % 100) != 0 )); then
30