Linux shell脚本编程(一)
生活随笔
收集整理的這篇文章主要介紹了
Linux shell脚本编程(一)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
--------------------------------------------------------------------
注:如果你對(duì)python感興趣,我這有個(gè)學(xué)習(xí)Python基地,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895817687
--------------------------------------------------------------------1 Linux shell腳本編程:2 守護(hù)進(jìn)程,服務(wù)進(jìn)程:啟動(dòng)?開機(jī)時(shí)自動(dòng)啟動(dòng):3 交互式進(jìn)程:shell應(yīng)用程序4 5 廣義:GUI,CLI6 GUI:7 CLI:8 詞法分析:命令,選項(xiàng),參數(shù)9 內(nèi)建命令:10 外部命令:PATH11 fork()創(chuàng)建為一個(gè)進(jìn)程:12 13 把要運(yùn)行的一系列命令,寫在文件中:14 腳本或程序源文件:文本文件15 兩種方式:16 編譯執(zhí)行:預(yù)處理---->編譯---->匯編---->鏈接:事先完成,結(jié)果:二進(jìn)制程序文件17 C,C++18 解釋執(zhí)行:由解釋器全程參與運(yùn)行過程,每次讀取一行,運(yùn)行一行;19 Python:程序庫20 程序控制結(jié)構(gòu):調(diào)用編程庫完成編程編寫;21 庫文件:功能模塊,在編程中可調(diào)用;通過其API:應(yīng)用編程接口;22 Bash:程序23 程序控制結(jié)構(gòu),調(diào)用機(jī)器上命令程序文件進(jìn)行編程編寫;24 外部命令:各應(yīng)用程序提供;25 程序:指令+數(shù)據(jù)26 算法+數(shù)據(jù)結(jié)構(gòu)27 28 過程式編程:以指令為中心,設(shè)計(jì)算法,數(shù)據(jù)服務(wù)于算法;29 對(duì)象式編程:以數(shù)據(jù)為中心,設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)(類),程序服務(wù)于數(shù)據(jù)結(jié)構(gòu);30 31 bash過程式編程:32 順序執(zhí)行:逐個(gè)執(zhí)行33 選擇執(zhí)行:只執(zhí)行其中一個(gè)分支34 循壞執(zhí)行:一段代碼要執(zhí)行0,1或多遍 35 36 編程元素:變量、流程、函數(shù)37 38 變量:可變化的量,命名內(nèi)存空間39 40 bash環(huán)境:41 本地變量:當(dāng)前shell進(jìn)程;42 環(huán)境變量:當(dāng)前shell進(jìn)程及其子進(jìn)程;43 局部變量:某個(gè)函數(shù)執(zhí)行過程;44 位置參數(shù)變量:在腳本中引用傳遞給腳本的參數(shù);在函數(shù)中引用傳遞給函數(shù)的參數(shù);45 特殊變量:$?,$*,$@,$#,$$46 47 變量類型:48 數(shù)值,字符:49 50 數(shù)值:51 整數(shù)52 浮點(diǎn)數(shù)53 字符:54 ASCII55 120:56 字符:1, 2 , 057 數(shù)值:120 --->58 59 變量類型的作用:60 存儲(chǔ)空間61 運(yùn)算格式62 63 語言對(duì)變量類型的支持力度:64 強(qiáng)類型:65 弱類型:變量類型不嚴(yán)格區(qū)分;66 默認(rèn)存儲(chǔ)機(jī)制:bash為字符67 68 bash的變量使用特點(diǎn):弱類型、無需事先說明;69 70 本地變量:71 name=value72 name:變量名73 =:賦值符號(hào)74 value:值75 76 變量名:只能包含數(shù)字、字母和下劃線:且不能以數(shù)字開頭;77 引用變量:${name},name78 例:79 [root@localhost ~]# animal="panao"80 [root@localhost ~]# echo ${animal}81 panao82 引用:83 弱引用:"",其內(nèi)部的變量引用會(huì)替換為變量值;84 強(qiáng)引用:'',其內(nèi)部的變量引用會(huì)保持原有字符;85 命令引用:`COMMAND`,$(COMMAND),引用命令的執(zhí)行結(jié)果;86 87 聲明為整型:88 declare -i name[=value]89 let name=value90 91 生命周期:92 創(chuàng)建93 銷毀:94 自動(dòng)銷毀:shell進(jìn)程終止;95 手動(dòng)銷毀:unset name96 例:97 [root@localhost ~]# unset animal98 99 環(huán)境變量:
100 被"導(dǎo)出"的本地變量
101 export name[=value]
102 declare -x name[=value]
103
104 查看所有環(huán)境變量:env,printenv,export
105
106 銷毀:
107 unset name
108
109 腳本:文本文件
110 運(yùn)行腳本:事實(shí)上是運(yùn)行一個(gè)bash進(jìn)程,此進(jìn)程負(fù)責(zé)從腳本文件中讀取一個(gè)執(zhí)行邏輯,而后有bash進(jìn)程負(fù)責(zé)解析并運(yùn)行此邏輯;
111 啟動(dòng)腳本:
112 (1) #bash /PATH/TO/SCRIPT_FILE
113 (2)一個(gè)執(zhí)行權(quán)限,
114 # ./PATH/TO/SCRIPT_FILE
115
116 shebang:
117 #!/bin/bash
118
119 第一行:頂格給出shebang
120 注釋行:#
121
122 bash的常用選項(xiàng):
123 -n:檢查腳本中的語法錯(cuò)誤;
124 -x:調(diào)試執(zhí)行腳本;
125
126 命令的狀態(tài)結(jié)果:
127 bash進(jìn)程用于追蹤執(zhí)行的命令成功與否的狀態(tài);
128 0:成功
129 1-222:失敗
130
131 特殊變量:
132 $?:上一條命令的執(zhí)行狀態(tài)結(jié)果;
133 例:
134 [root@localhost bin]# echo $?
135 0 // 0表示成功
136
137
138 布爾型:
139 "真":成功
140 "假":失敗
141
142 自定義腳本的狀態(tài)結(jié)果:
143 exit[n]
144
145 注意:腳本中任何位置執(zhí)行了exit命令即會(huì)終止當(dāng)前shell進(jìn)程;
146
147 條件測試:
148 界定程序執(zhí)行環(huán)境:
149
150 (1)根據(jù)運(yùn)行的命令的狀態(tài)結(jié)果;
151 (2)測試表達(dá)式
152 test EXPRESSION
153 [ EXPRESSION ] //括號(hào)兩邊必須有空格
154 [[ EXPRESSION ]] //括號(hào)兩邊必須有空格
155
156 整數(shù)測試:隱含著做數(shù)值大小比較,所以不要給變量引用加引用;
157 $A -gt $B:是否大于:是則為"真",否則為"假";
158 $A -ge $B:是否大于等于;
159 $A -lt $B:是否小于;
160 $A -le $B:是否小于等于;
161 $A -eq $B:是否等于;
162 $A -ne $B:是否不等于;
163 字符串測試:ASCII數(shù)值越大,字符比較時(shí)其值越大
164 "$A" > "$B":是否大于;
165 "$A" < "$B":是否小于;
166 "$A" == "$B":是否等于;
167 "$A" != "$B":是否不等于;
168 -z "$A":是否為空;空則為"真",否則為"假"
169 -n "$A":是否不空;不空則為"真",空則為"假"
170
171 注意:應(yīng)該使用[[ EXPRESSION ]]
172
173 文件測試:測試文件的存在性以及屬性;
174 -e $file:是否存在,存在則為"真",否則為"假"
175 -a $file:同上
176 -f $file:文件是否存在且為普通文件;
177 -d $file:文件是否存在且為目錄;
178 -h $file:是否存在且為符號(hào)鏈接文件;
179 -L $file:同上;
180 -b $file:是否存在且為塊設(shè)備文件;
181 -c $file:是否存在且為字符設(shè)備文件;
182 -S $file:是否存在且為套接字文件;
183 -p $file:是否存在且為管道文件;
184
185 -r $file:當(dāng)前用戶對(duì)文件是否擁有讀權(quán)限;
186 -w $file:當(dāng)前用戶對(duì)文件是否擁有寫權(quán)限;
187 -x $file:當(dāng)前用戶對(duì)文件是否擁有執(zhí)行權(quán)限;
188
189 -u $file:文件是否擁有SUID權(quán)限;
190 -g $file:文件是否擁有SGID權(quán)限;
191 -k $file:文件是否擁有sticky權(quán)限;
192
193 -O $file:當(dāng)前用戶是否為指定文件的屬主;
194 -G $file:當(dāng)前用戶是否為指定文件的屬組;
195
196 雙目操作符:
197 $file1 -nt $file2:file1是否新于file2,file1的最近一次的修改時(shí)間是否晚于file2的;
198 $file1 -ot $file2:file1是否舊于file2,file1的最近一次的修改時(shí)間是否早于file2的;
199 $file1 -ef $file2:file1與file2是否指向了同一個(gè)inode:測試二者是否為同一個(gè)文件的硬鏈接;
200
201
202
203 特殊設(shè)備:
204 /dev/null:空,bit buckets,吞下所有數(shù)據(jù),并直接丟棄;
205 /dev/zero:突出一堆0:
206
207 bash之條件判斷(選擇執(zhí)行):
208 if/then,case
209
210 if CONDITTION;then
211 if-true-分支
212 fi
213
214 if CONDITTION;then
215 if-true-分支
216 else
217 if-false-分支
218
219 !CONDITTION:取反
220
221 練習(xí):寫一個(gè)腳本
222 如果其路徑不存在,則將其創(chuàng)建為目錄,否則顯示其存在,并顯示內(nèi)容類型;
223
224 #!/bin/bash
225 #
226 filename="/tmp/x/y/z/testdir"
227 if [ -e $filename ];then
228 echo "$filename exists."
229 file $filename
230 else
231 mkdir -p $filename
232 fi
233 ~
234 ~
235 腳本參數(shù)(位置參數(shù)變量):
236 ./script.sh /etc/fstab /etc/grub2.cfg
237 $0 $1 $2
238
239 位置參數(shù)變量:$1,$2,....
240 ${10}
241
242 特殊變量:
243 $?:命令的狀態(tài)結(jié)果;
244 $#:傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù);
245 $*和$@:引用傳遞給腳本或函數(shù)的參數(shù)列表;
246
247 shift:[n]:輪替
248
249 與用戶交互:
250 read命令:
251 read [option] VAR...
252 -p "PROMPT"
253 -t timeout
254 示例:
255
256 #!/bin/bash
257 #
258
259 read -p "Plz enter a username: " -t 5 username
260
261 if [ -z "$username" ]; then
262 username="myuser"
263 fi
264
265 if id $username &> /dev/null; then
266 echo "$username exists."
267 else
268 useradd $username
269 fi
270
271
272
273 命令引用:
274 `COMMAND`,$(COMMAND)
275
276 引用命令的執(zhí)行結(jié)果:
277 (1)ls `which cat`
278 (2)lines=$(wc -l /etc/fstab | cut -d '' -f1)
279
280 #!/bin/bash
281 #
282 if [ -f $1 ]; then
283 lines=$(wc -l $1 | cut -d' ' -f1)
284 echo "$1 has $lines lines."
285 else
286 echo "$1 not exists or not a file."
287 fi
288
289 練習(xí):寫一個(gè)腳本,完成如下功能:
290 判斷給定的兩個(gè)數(shù)值,孰大孰小;
291 給定數(shù)值的方法:腳本參數(shù),命令交互;
292 代碼如下:
293
294 1 #!/bin/bash
295 2 #
296 3 read -p "Plz enter two integer: " -t 10 num1 num2
297 4
298 5 if [ -z "$num1" ];then
299 6 echo "Plz give two integers."
300 7 exit 1
301 8 fi
302 9
303 10 if [ -z "$num2" ];then
304 11 echo "Plz give two integers."
305 12 exit 1
306 13 fi
307 14
308 15 if [$num1 -ge $num2 ];then
309 16 echo "Max: $num1,Min;$num2."
310 17 else
311 18 echo "Max:$num2,Min:$num1."
312 19 fi
313 循環(huán)語句:
314 for,while,until
315
316 循環(huán):將循壞體代碼執(zhí)行0、1或多次;
317 進(jìn)入條件:進(jìn)入循環(huán)的條件;
318 退出條件:循環(huán)終止的條件;
319
320 for VARIABLE in LIST;do
321 循環(huán)體
322 done
323
324 LIST:是由一個(gè)或多個(gè)空格分隔開的字符串組成;
325 把列表的每個(gè)字符串逐個(gè)賦值給VARIABLE表示的變量;
326
327 for username in user1 user2 user3;do
328 循環(huán)體
329 done
330
331 進(jìn)入條件:列表非空
332 退出條件:列表遍歷結(jié)束;
333
334 添加5個(gè)用戶:
335 #!/bin/bash
336 #
337 for username in user1 user2 user3 user4 user5; do
338 if id $username &> /dev/null; then
339 echo "$username exists."
340 else
341 useradd $username
342 echo "Add user $username finished."
343 fi
344 done
345 LIST的生成方法:
346 (1)整數(shù)列表
347 (a){start..end}
348 (b)$(seq start [[step]end])
349 (2)直接給出
350 (3)glob
351 (4)根據(jù)命令生成
352
353
354 示例:數(shù)值列表
355 #!/bin/bash
356 #
357 for i in {1..10}; do
358 if id user$i &> /dev/null; then
359 echo "user$i exists."
360 else
361 useradd user$i
362 echo "Add user user$i finished."
363 fi
364 done
365
366 示例:glob
367 #!/bin/bash
368 #
369 for filename in /var/log/*; do
370 file $filename
371 done
372
373 示例:命令生成列表
374 #!/bin/bash
375 #
376 for username in $(cut -d: -f1 /etc/passwd); do
377 echo "$username primary group: $(id -n -g $username)."
378 done
379 ~
380
381 算術(shù)運(yùn)算:
382 +,-,*,%,**
383
384 sum=$a+$b
385 (1)$[$A+$B]
386 (2)$(($A+$B))
387 (3)let VARIABLE=$A+$B
388 (4)VARIABLE$(expr $A + $B)
389
390 示例:
391
392 [root@localhost bin]# a=6
393 [root@localhost bin]# b=7
394 [root@localhost bin]# sum=$a+$b
395 [root@localhost bin]# echo $a+$b
396 6+7
397 [root@localhost bin]# echo $[$a+$b]
398 13
399 [root@localhost bin]# let $a+$b
400 [root@localhost bin]# let sum=$a+$b
401 [root@localhost bin]# echo $sum
402 13
403 [root@localhost bin]# expr $a + $b
404 13
405
406 示例:求100以內(nèi)正整數(shù)之和;
407 #!/bin/bash
408 #
409 declare -i sum=0
410
411 for i in {1..100}; do
412 sum=$[$sum+$i]
413 done
414
415 echo $sum
416
417 練習(xí):求100以內(nèi)所有偶數(shù)之和;
418 使用至少三種方法實(shí)現(xiàn);
總結(jié)
以上是生活随笔為你收集整理的Linux shell脚本编程(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx下载服务器配置文件
- 下一篇: Linux shell脚本编程(二)