-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1_common.sh
More file actions
424 lines (270 loc) · 14.2 KB
/
1_common.sh
File metadata and controls
424 lines (270 loc) · 14.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
sha-bang
#! /bin/bash
#! /bin/sh
#! /bin/bin/python
#!/bin/rm
# Самоуничтожающийся сценарий.
: - синоним true
Бесконечный цикл
while :
do
operation-1
operation-2
...
operation-n
done
# То же самое:
# while true
# do
# ...
# done
if condition
then : # Никаких действий не производится и управление передается дальше
else
take-some-action
fi
Использование неэкранированных или неокавыченных пробелов
внутри фигурных скобок недопустимо.
echo {file1,file2}\ :{\ A," B",' C'}
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D
# Неинициализированные переменные
a= # пустая строка. Не ноль!
let "a += 5"
echo $a # 5
unset a
echo $a # пустая строка
# Присваивание
for a in 7 8 9 11
do
echo -n "$a "
done
# При использовании инструкции 'read' (тоже одна из разновидностей присваивания)
echo -n "Введите значение переменной \"a\" "
read a
echo "Значение переменной \"a\" теперь стало равным: $a."
Присваивание переменных с использованием $(...)
более современный метод, по сравнению с обратными кавычками
a=`ls -l` # В переменную 'a' записывается результат работы команды 'ls -l'
echo $a # Кавычки отсутствуют, удаляются лишние пробелы и пустые строки.
echo
echo "$a" # Красивенька, как в терминале
# В баше нет типа данных
a="BB12"
b=${a/BB/77}
$b # 7712
let "b += 1"
$b # 7713
declare -i a # Явное указание типа здесь не поможет.
# datetime
$(date +"%d_%m_%Y")
19_01_2017
# check dir existing
[ ! -d "$BAK" ] && mkdir -p "$BAK"
# \v - vertical tabulation
echo -e "a\ta"
echo -e "\v"
echo -e "a"
ABC=$'\101\102\103\010'
echo $ABC # ABC
# Встроенный документ
cat <<EOF
\z
EOF # \z
Глава 6. Завершение и код завершения
------------------------------------------------------------------------------
#!/bin/bash
echo hello
echo $? # код возврата = 0, поскольку команда выполнилась успешно.
lskdf # Несуществующая команда.
echo $? # Ненулевой код возврата, поскольку команду выполнить не удалось.
echo
exit 113 # Явное указание кода возврата 113.
# Проверить можно, если набрать в командной строке "echo $?"
# после выполнения этого примера.
Глава 7. Проверка условий
------------------------------------------------------------------------------
Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата.
if cmp a b &> /dev/null # Подавление вывода.
then echo "Файлы a и b идентичны."
else echo "Файлы a и b имеют различия."
fi
Возвращает true если...
-e файл существует
-f обычный файл (не каталог и не файл устройства)
-s ненулевой размер файла
-d файл является каталогом
-b файл является блочным устройством (floppy, cdrom и т.п.)
-c файл является символьным устройством (клавиатура, модем, звуковая
карта и т.п.)
-p файл является каналом
-h файл является символической ссылкой
-L файл является символической ссылкой
-S файл является сокетом
-t файл (дескриптор) связан с терминальным устройством
Этот ключ может использоваться для проверки -- является ли файл
стандартным устройством ввода stdin ([ -t 0 ]) или стандартным
устройством вывода stdout ([ -t 1 ]).
-r файл доступен для чтения (пользователю, запустившему сценарий)
-w файл доступен для записи (пользователю, запустившему сценарий)
-x файл доступен для исполнения (пользователю, запустившему сценарий)
-g set-group-id (sgid) флаг для файла или каталога установлен
Если для каталога установлен флаг sgid, то файлы, создаваемые
в таком каталоге, наследуют идентификатор группы каталога, который
может не совпадать с идентификатором группы, к которой принадлежит
пользователь, создавший файл. Это может быть полезно для каталогов,
в которых хранятся файлы, общедоступные для группы пользователей.
-u set-user-id (suid) флаг для файла установлен
Установленный флаг suid приводит к изменению привилегий запущенного
процесса на привилегии владельца исполняемого файла. Исполняемые файлы,
владельцем которых является root, с установленным флагом set-user-id
запускаются с привилегиями root, даже если их запускает обычный пользователь.
[1] Это может оказаться полезным для некоторых программ (таких как pppd и
cdrecord), которые осуществляют доступ к аппаратной части компьютера.
В случае отсутствия флага suid, программы не смогут быть запущены рядовым
пользователем, не обладающим привилегиями root.
-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd
Файл с установленным флагом suid отображается с включенным флагом s в поле
прав доступа.
-k флаг sticky bit (бит фиксации) установлен
Общеизвестно, что флаг "sticky bit" -- это специальный тип прав доступа к
файлам. Программы с установленным флагом "sticky bit" остаются в системном
кэше после своего завершения, обеспечивая тем самым более быстрый запуск
программы. [2] Если флаг установлен для каталога, то это приводит к
ограничению прав на запись. Установленный флаг "sticky bit" отображается
в виде символа t в поле прав доступа.
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/
Если пользователь не является владельцем каталога, с установленным
"sticky bit", но имеет право на запись в каталог, то он может удалять
только те файлы в каталоге, владельцем которых он является.
Это предотвращает удаление и перезапись "чужих" файлов в общедоступных
каталогах, таких как /tmp.
-O вы являетесь владельцем файла
-G вы принадлежите к той же группе, что и файл
-N файл был модифицирован с момента последнего чтения
f1 -nt f2 файл f1 более новый, чем f2
f1 -ot f2 файл f1 более старый, чем f2
f1 -ef f2 файлы f1 и f2 являются "жесткими" ссылками на один и тот же файл
! "НЕ" -- логическое отрицание (инверсия).
------------------------------------------------------------------------------
Операции сравнения
сравнение целых чисел
[ "$a" -eq "$b" ]
(("$a" < "$b"))
AND OR
Они похожи на операторы Bash && и ||
[[ condition1 && condition2 ]]
Операторы -o и -a употребляются совместно с командой test
или внутри одинарных квадратных скобок.
if [ "$exp1" -a "$exp2" ]
------------------------------------------------------------------------------
Глава 8. Операции и смежные темы
------------------------------------------------------------------------------
let "var += 5"
-=
*=
/=
%=
**= - ERROR
"expr 10 < 9" # 0
"expr 10 > 9" # 1
if [ $condition1 ] && [ $condition2 ]
# То же самое, что: if [ $condition1 -a $condition2 ]
# Возвращает true если оба операнда condition1 и condition2 истинны...
if [[ $condition1 && $condition2 ]] # То же верно
# Обратите внимание: оператор && не должен использоваться внутри [ ... ].
# Запятая
let "t2 = ((a = 9, 15 / 3))"
echo "t2 = $t2 a = $a" # t2 = 5 a = 9
0 - восьмеричные (oct)
0х - шестнадцатиричные (hex)
ОСНОВА#ЧИСЛО.
$# Количество аргументов командной строки
$* Все аргументы в виде одной строки (слова)
$@ То же самое, что и $*, но при этом каждый параметр
представлен как отдельная строка (слово)
9.2. Работа со строками
------------------------------------------------------------------------------
stringZ=abcABC123ABCabc
echo ${#stringZ} # 15
echo `expr length $stringZ` # 15
echo `expr "$stringZ" : '.*'` # 15
echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
echo `expr index "$stringZ" C12` # 6
echo `expr index "$stringZ" 1c` # 3
# символ 'c' (в #3 позиции) совпал раньше, чем '1'.
stringZ=abcABC123ABCabc
# |----|
# |----------|
echo ${stringZ#a*C} # 123ABCabc
# Удаление самой короткой подстроки.
echo ${stringZ##a*C} # abc
# Удаление самой длинной подстроки.
stringZ=abcABC123ABCabc
# ||
# |------------|
echo ${stringZ%b*c} # abcABC123ABCa
echo ${stringZ%%b*c} # a
------------------------------------------------------------------------------
echo "username1 = ${username1-`whoami`}" # default value if exist
echo "username2 = ${username2:-`whoami`}" # default value anyway
$ q=
$ ${q?err_msg}
$ ${q:?err_msg}
bash: q: err_msg
$ ${w?}
bash: w: parameter null or not set
$ ${w}
$
# Удаление из переменной
# ${var#Pattern}, ${var##Pattern} - с начала строки
# ${var%Pattern}, ${var%%Pattern} - с конца строки
echo `basename $PWD` # Имя текущего рабочего каталога.
echo "${PWD##*/}" # Имя текущего рабочего каталога.
echo
echo `basename $0` # Имя файла-сценария.
echo $0 # Имя файла-сценария.
echo "${0##*/}" # Имя файла-сценария.
echo
filename=test.data
echo "${filename##*.}" # data
# Расширение файла.
____________________________________________________
Изменение расширений в именах файлов:
#!/bin/bash
# Изменение расширений в именах файлов.
#
# rfe old_extension new_extension
#
# Пример:
# Изменить все расширения *.gif в именах файлов на *.jpg, в текущем каталоге
# rfe gif jpg
ARGS=2
E_BADARGS=65
if [ $# -ne "$ARGS" ]
then
echo "Порядок использования: `basename $0` old_file_suffix new_file_suffix"
exit $E_BADARGS
fi
for filename in *.$1
# Цикл прохода по списку имен файлов, имеющих расширение равное первому аргументу.
do
mv $filename ${filename%$1}$2
# Удалить первое расширение и добавить второе,
done
exit 0
____________________________________________________
Поиск по шаблону всех, ранее объявленных переменных,
имена которых начинаются c "H"
$ echo ${!H*}
$ echo ${!H@}
${var/#Pattern/Replacement}
Если в переменной var найдено совпадение с Pattern,
причем совпадающая подстрока расположена в начале
строки (префикс), то оно заменяется на Replacement.
${var/%Pattern/Replacement}
Если в переменной var найдено совпадение с Pattern,
причем совпадающая подстрока расположена в конце
строки (суффикс), то оно заменяется на Replacement.