歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux shell腳本編程

Linux shell腳本編程

日期:2017/3/1 9:18:29   编辑:SHELL編程

Linux shell腳本編程:
守護進程,服務進程:啟動?開機時自動啟動:
交互式進程:shell應用程序

廣義:GUI,CLI
GUI:
CLI:
詞法分析:命令,選項,參數
內建命令:
外部命令:PATH
fork()創建為一個進程:

把要運行的一系列命令,寫在文件中:
腳本或程序源文件:文本文件
兩種方式:
編譯執行:預處理---->編譯---->匯編---->鏈接:事先完成,結果:二進制程序文件
C,C++
解釋執行:由解釋器全程參與運行過程,每次讀取一行,運行一行;
Python:程序庫
程序控制結構:調用編程庫完成編程編寫;
庫文件:功能模塊,在編程中可調用;通過其API:應用編程接口;
Bash:程序
程序控制結構,調用機器上命令程序文件進行編程編寫;
外部命令:各應用程序提供;
程序:指令+數據
算法+數據結構

過程式編程:以指令為中心,設計算法,數據服務於算法;
對象式編程:以數據為中心,設計數據結構(類),程序服務於數據結構;

bash過程式編程:
順序執行:逐個執行
選擇執行:只執行其中一個分支
循壞執行:一段代碼要執行0,1或多遍

編程元素:變量、流程、函數

變量:可變化的量,命名內存空間

bash環境:
本地變量:當前shell進程;
環境變量:當前shell進程及其子進程;
局部變量:某個函數執行過程;
位置參數變量:在腳本中引用傳遞給腳本的參數;在函數中引用傳遞給函數的參數;
特殊變量:$?,$*,$@,$#,$$

變量類型:
數值,字符:

數值:
整數
浮點數
字符:
ASCII
120:
字符:1, 2 , 0
數值:120 --->

變量類型的作用:
存儲空間
運算格式

語言對變量類型的支持力度:
強類型:
弱類型:變量類型不嚴格區分;
默認存儲機制:bash為字符

bash的變量使用特點:弱類型、無需事先說明;

本地變量:
name=value
name:變量名
=:賦值符號
value:值

變量名:只能包含數字、字母和下劃線:且不能以數字開頭;
引用變量:${name},name
例:
[root@localhost ~]# animal="panao"
[root@localhost ~]# echo ${animal}
panao
引用:
弱引用:"",其內部的變量引用會替換為變量值;
強引用:'',其內部的變量引用會保持原有字符;
命令引用:`COMMAND`,$(COMMAND),引用命令的執行結果;

聲明為整型:
declare -i name[=value]
let name=value

生命周期:
創建
銷毀:
自動銷毀:shell進程終止;
手動銷毀:unset name
例:
[root@localhost ~]# unset animal

環境變量:
被"導出"的本地變量
export name[=value]
declare -x name[=value]

查看所有環境變量:env,printenv,export

銷毀:
unset name

腳本:文本文件
運行腳本:事實上是運行一個bash進程,此進程負責從腳本文件中讀取一個執行邏輯,而後有bash進程負責解析並運行此邏輯;
啟動腳本:
(1) #bash /PATH/TO/SCRIPT_FILE
(2)一個執行權限,
# ./PATH/TO/SCRIPT_FILE

shebang:
#!/bin/bash

第一行:頂格給出shebang
注釋行:#

bash的常用選項:
-n:檢查腳本中的語法錯誤;
-x:調試執行腳本;

命令的狀態結果:
bash進程用於追蹤執行的命令成功與否的狀態;
0:成功
1-222:失敗

特殊變量:
$?:上一條命令的執行狀態結果;
例:
[root@localhost bin]# echo $?
0 // 0表示成功


布爾型:
"真":成功
"假":失敗

自定義腳本的狀態結果:
exit[n]

注意:腳本中任何位置執行了exit命令即會終止當前shell進程;

條件測試:
界定程序執行環境:

(1)根據運行的命令的狀態結果;
(2)測試表達式
test EXPRESSION
[ EXPRESSION ] //括號兩邊必須有空格
[[ EXPRESSION ]] //括號兩邊必須有空格

Linux Shell腳本 多線程 http://www.linuxidc.com/Linux/2015-10/123993.htm

cat命令利用Linux重定向合並文件 http://www.linuxidc.com/Linux/2015-01/112122.htm

Shell編程淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm

Linux Shell參數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for參數 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 參數傳遞到SQL腳本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell腳本中參數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell腳本傳遞命令行參數 http://www.linuxidc.com/Linux/2012-01/52192.htm

Linux Shell 通配符、轉義字符、元字符、特殊字符 http://www.linuxidc.com/Linux/2014-10/108111.htm

整數測試:隱含著做數值大小比較,所以不要給變量引用加引用;
$A -gt $B:是否大於:是則為"真",否則為"假";
$A -ge $B:是否大於等於;
$A -lt $B:是否小於;
$A -le $B:是否小於等於;
$A -eq $B:是否等於;
$A -ne $B:是否不等於;
字符串測試:ASCII數值越大,字符比較時其值越大
"$A" > "$B":是否大於;
"$A" < "$B":是否小於;
"$A" == "$B":是否等於;
"$A" != "$B":是否不等於;
-z "$A":是否為空;空則為"真",否則為"假"
-n "$A":是否不空;不空則為"真",空則為"假"

注意:應該使用[[ EXPRESSION ]]

文件測試:測試文件的存在性以及屬性;
-e $file:是否存在,存在則為"真",否則為"假"
-a $file:同上
-f $file:文件是否存在且為普通文件;
-d $file:文件是否存在且為目錄;
-h $file:是否存在且為符號鏈接文件;
-L $file:同上;
-b $file:是否存在且為塊設備文件;
-c $file:是否存在且為字符設備文件;
-S $file:是否存在且為套接字文件;
-p $file:是否存在且為管道文件;

-r $file:當前用戶對文件是否擁有讀權限;
-w $file:當前用戶對文件是否擁有寫權限;
-x $file:當前用戶對文件是否擁有執行權限;

-u $file:文件是否擁有SUID權限;
-g $file:文件是否擁有SGID權限;
-k $file:文件是否擁有sticky權限;

-O $file:當前用戶是否為指定文件的屬主;
-G $file:當前用戶是否為指定文件的屬組;

雙目操作符:
$file1 -nt $file2:file1是否新於file2,file1的最近一次的修改時間是否晚於file2的;
$file1 -ot $file2:file1是否舊於file2,file1的最近一次的修改時間是否早於file2的;
$file1 -ef $file2:file1與file2是否指向了同一個inode:測試二者是否為同一個文件的硬鏈接;

特殊設備:
/dev/null:空,bit buckets,吞下所有數據,並直接丟棄;
/dev/zero:突出一堆0:

bash之條件判斷(選擇執行):
if/then,case

if CONDITTION;then
if-true-分支
fi

if CONDITTION;then
if-true-分支
else
if-false-分支

!CONDITTION:取反

練習:寫一個腳本
如果其路徑不存在,則將其創建為目錄,否則顯示其存在,並顯示內容類型;

#!/bin/bash
#
filename="/tmp/x/y/z/testdir"
if [ -e $filename ];then
echo "$filename exists."
file $filename
else
mkdir -p $filename
fi
~
~
腳本參數(位置參數變量):
./script.sh /etc/fstab /etc/grub2.cfg
$0 $1 $2

位置參數變量:$1,$2,....
${10}

特殊變量:
$?:命令的狀態結果;
$#:傳遞給腳本或函數的參數個數;
$*和$@:引用傳遞給腳本或函數的參數列表;

shift:[n]:輪替

與用戶交互:
read命令:
read [option] VAR...
-p "PROMPT"
-t timeout
示例:

#!/bin/bash
#

read -p "Plz enter a username: " -t 5 username

if [ -z "$username" ]; then
username="myuser"
fi

if id $username &> /dev/null; then
echo "$username exists."
else
useradd $username
fi


命令引用:
`COMMAND`,$(COMMAND)

引用命令的執行結果:
(1)ls `which cat`
(2)lines=$(wc -l /etc/fstab | cut -d '' -f1)

#!/bin/bash
#
if [ -f $1 ]; then
lines=$(wc -l $1 | cut -d' ' -f1)
echo "$1 has $lines lines."
else
echo "$1 not exists or not a file."
fi

練習:寫一個腳本,完成如下功能:
判斷給定的兩個數值,孰大孰小;
給定數值的方法:腳本參數,命令交互;
代碼如下:

1 #!/bin/bash
2 #
3 read -p "Plz enter two integer: " -t 10 num1 num2
4
5 if [ -z "$num1" ];then
6 echo "Plz give two integers."
7 exit 1
8 fi
9
10 if [ -z "$num2" ];then
11 echo "Plz give two integers."
12 exit 1
13 fi
14
15 if [$num1 -ge $num2 ];then
16 echo "Max: $num1,Min;$num2."
17 else
18 echo "Max:$num2,Min:$num1."
19 fi
循環語句:
for,while,until

循環:將循壞體代碼執行0、1或多次;
進入條件:進入循環的條件;
退出條件:循環終止的條件;

for VARIABLE in LIST;do
循環體
done

LIST:是由一個或多個空格分隔開的字符串組成;
把列表的每個字符串逐個賦值給VARIABLE表示的變量;

for username in user1 user2 user3;do
循環體
done

進入條件:列表非空
退出條件:列表遍歷結束;

添加5個用戶:
#!/bin/bash
#
for username in user1 user2 user3 user4 user5; do
if id $username &> /dev/null; then
echo "$username exists."
else
useradd $username
echo "Add user $username finished."
fi
done
LIST的生成方法:
(1)整數列表
(a){start..end}
(b)$(seq start [[step]end])
(2)直接給出
(3)glob
(4)根據命令生成


示例:數值列表
#!/bin/bash
#
for i in {1..10}; do
if id user$i &> /dev/null; then
echo "user$i exists."
else
useradd user$i
echo "Add user user$i finished."
fi
done

示例:glob
#!/bin/bash
#
for filename in /var/log/*; do
file $filename
done

示例:命令生成列表
#!/bin/bash
#
for username in $(cut -d: -f1 /etc/passwd); do
echo "$username primary group: $(id -n -g $username)."
done
~

算術運算:
+,-,*,%,**

sum=$a+$b
(1)$[$A+$B]
(2)$(($A+$B))
(3)let VARIABLE=$A+$B
(4)VARIABLE$(expr $A + $B)

示例:

[root@localhost bin]# a=6
[root@localhost bin]# b=7
[root@localhost bin]# sum=$a+$b
[root@localhost bin]# echo $a+$b
6+7
[root@localhost bin]# echo $[$a+$b]
13
[root@localhost bin]# let $a+$b
[root@localhost bin]# let sum=$a+$b
[root@localhost bin]# echo $sum
13
[root@localhost bin]# expr $a + $b
13

示例:求100以內正整數之和;
#!/bin/bash
#
declare -i sum=0

for i in {1..100}; do
sum=$[$sum+$i]
done

echo $sum

練習:求100以內所有偶數之和;
使用至少三種方法實現;

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-03/128789p2.htm

Copyright © Linux教程網 All Rights Reserved