★ 編程基礎
★ 腳本基本格式
★ 變量
★ 運算
★ 條件測試
★ 配置用戶環境
一.編程基礎
程序:指令+數據
程序編程風格:
過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
shell程序:提供了編程能力,解釋執行
1.程序的執行方式
計算機:運行二進制指令
編程語言:
低級:匯編
高級:
編譯:高級語言–編譯器–目標代碼
java,C#
解釋:高級語言–解釋器–機器代碼
shell,perl,python
2. 編程的基本概念
? 編程邏輯處理方式:
順序執行
循環執行
選擇執行
? shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a + b
語句:if
二.腳本基本格式
? shell腳本基礎
shell 腳本:包含一些命令或聲明,并符合一定格式的文本文件
格式要求:首行shebang 機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell 腳本的用途有:
1.自動化常用命令
2.執行系統管理和故障排除
3.創建簡單的應用程序
4.處理文本或文件
? 創建shell腳本
第一步:使用文本編輯器來創建文本文件
? 第一行必須包括shell 聲明序列:#!
#!/bin/bas
? 添加注釋
注釋以# 開頭
第二步:運行腳本
? 給予執行權限,在命令行上指定腳本的絕對或相對路徑
? 直接運行解釋器,將腳本作為解釋器程序的參數運行
? shell腳本示例
#!/bin/bash
#Author: wang
#Version: 1.0
#Date: 2016-05-01
#Description:The script displays system information
echo “Greetings. The date and time are $(date)”
echo “Your working directory is: $(pwd)”
? 腳本調試
? 檢測腳本中的語法錯誤
bash -n /path/to/some_script
? 調試執行
bash -x /path/to/some_script
三 變量
? 變量:命名的內存空間
數據存儲方式:
字符:
數值:整型,浮點型
? 變量:變量類型
作用:
1、數據存儲格式
2、參與的運算
3、表示的數據范圍
類型:
字符
數值:整型、浮點型
? 強類型:定義變量時必須指定類型、參與運算必須符合類型
? 要求:調用未聲明變量會產生錯誤
如 java,c
? 弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
如:bash 不支持浮點數,python
變量命名法則:
1、不能使程序中的保留字:例如if, for
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義
4、統一命名 規則:駝峰命名
? bash中變量的種類
根據變量的生效范圍等標準:
本地變量:生效范圍為當前shell 進程;對當前shell 之外的其它shell 進程,包括當前shell 的子shell 進程無效
環境變量:生效范圍為當前shell 進程及其子進程
局部變量:生效范圍為當前shell 進程中某代碼片斷( 通常指函數)
位置變量:$1, $2, … 來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$?, $0, $*, $@, $#,$$
? 本地變量
變量賦值:name=‘value’
可以使用引用value:
(1)可以是直接字串;name=“root”
(2)變量引用:name=”$USER”
(3)命令引用:name=COMMAND
name =$(COMMAND)
變量引用:${name} $name
“” :弱引用,其中的變量引用會被替換為變量值
” :強引用,其中的變量引用不會被替換為變量值,而保持原字符串
顯示已定義的所有變量:set
刪除變量:unset name
? 環境變量
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name, ${name}
顯示所有環境變量:
export
env
printenv
刪除:unset name
bash 有許多內 建的環境變量:PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE
? 只讀和位置變量
只讀變量:只能聲明, 但不能修改和刪除
聲明只讀變量:
readonly name
declare -r name
查看只讀變量:
readonly –p
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1, $2, … :對應第1、2第2 等參數,shift [n] 換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
四 算術運算
bash 中的算術運算:help let
+, -, *, /, % 取模(取余), ** (乘方)
實現算術運算:
(1) let var= 算術表達式
(2) var=$[ 算術表達式]
(3) var=$(( 算術表達式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var = 數值
(6) echo‘算術表達式’| bc
乘法符號有些場景中需要轉義 ,如 如
bash 有內建的隨機數生成器:$RANDOM (1-32767) )
echo $[$RANDOM%50]:0-49之間隨機數
? 增強型賦值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3 后自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var–
? 邏輯運算
非:!
!1=0
!0=1
短路運算:
短路與:
第一個為0,結果必定為0
第一個為1,第二個必須要參與運算
短路或:
第一個為1,結果必定為1
第一個位0,第二個必須要參與運算
異或:^
異或的兩個值,相同為假,不停同為真
? 退出狀態碼
bash 自定義退出狀態碼
exit [n] :自定義退出 狀態碼
注意:腳本中一旦遇到exit 命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼
五 條件測試
判斷某需求是否滿足,需要由測試機制 來實現
專用的測試表達式需要由測試命令輔助完成 測試過程
評估布爾聲明,以便用在條件性執行中
? 若真,則返回0
? 若假,則返回1
測試命令:
? test EXPRESSION
? [ EXPRESSION ]
? [[ EXPRESSION ]]
注意:EXPRESSION 前后必須有空白字符
? 條件性的執行操作符
根據退出狀態而定,命令可以有條件地運行
? && 代表條件性的AND THEN
? || 代表條件性的OR ELSE
例如:
$ grep -q no_such_user /etc/passwd || echo ‘No such user’
No such user
$ ping -c1 -W2 station1 &> /dev/null && echo “station1 is up” || (echo ‘station1 is unreachable’; exit 1)
station1 is up
? test 命令
長格式的例子:
$ test “$A” == “$B” && echo “Strings are equal”
$ test “$A” -eq “$B” && echo “Integers are equal”
簡寫格式的例子:
$ [ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” -eq “$B” ] && echo “Integers are equal”
? bash類型的測試
數值測試
-gt: 是否大于
-ge: 是否 大于等于
-eq: 是否等于
-ne: 是否 不等于
-lt: 是否小于
-le: 是否 小于等于
字符串測試:
==:是否等于;
>: ascii 碼是否大于ascii碼
<: 是否小于
!=: 是否不等于
=~: 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]] 中;擴展的正則表達式
-z “STRING” :字符串是否為空,空為真,不空為假
-n “STRING” :字符串是否不空,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
? 文件測試
存在性測試
-a FILE :同-e
-e FILE: 文件存在性測試,存在為真,否則 為假
存在性及類別測試
-b FILE :是否存在且為塊 設備文件
-c FILE :是否存在且為字符 設備文件
-d FILE :是否存在且為 目錄文件
-f FILE :是否存在且為 普通文件
-h FILE 或 或 -L FILE :存在且為符號 鏈接文件
-p FILE :是否存在且為命名 管道文件
-S FILE :是否存在且為套接
文件權限測試:
-r FILE :是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-u FILE :是否存在且擁有suid 權限
-g FILE :是否存在且擁有sgid 權限
-k FILE :是否存在且擁有sticky
文件大小測試:
-s FILE: 是否存 在 且 非空
文件是否打開:
-t fd: fd 表示文件描述符是否已經打開且與某終端相關
-N FILE :文件自動上一次被讀取之后是否被修改過
-O FILE :當前有效用戶是否為文件屬主
-G FILE
雙目測試:
FILE1 -ef FILE2: FILE1 與FILE2 是否指向同一個設備上的相同inode
FILE1 -nt FILE2: FILE1 是否新于 于FILE2
FILE1 -ot FILE2: FILE1 是否舊于 于FILE2
? 組合測試條件
第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非 非
如:[[ -r FILE ]] && [[ -w FILE ]]
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令 進行;
示例:
# [ -z “$HOSTNAME” -o $HOSTNAME “==”localhost.localdomain” ] && hostname www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
六 配置用戶環境
? 使用read命令來接受輸入
使用read 來把輸入值分配給一個或多個shell 變量:
-p 指定要顯示的提示
-s 靜默輸入
-n N 指定輸入的字符長度N
-d ‘字符’ 輸入結束符
-t N TIMEOUT 為N秒 秒
read 從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE
? bash如何展開命令行
?把命令行分成單個命令詞
?展開別名
?展開大括號種的聲明({}) )
?展開波浪符聲明(~) )
?命令替換$() 和 “)
?再次把命令行分成命令詞
?展開文件通配( 、? 、[abc] 等等)
?準備I/0 重導向(< 、>) )
?運行命令
? 防止擴展
反斜線(\ )會使隨后的字符按原意解釋
$ echo Your cost: \$5.00
Your cost: $5.00
加引號來防止擴展
? 單引號(’ )防止所有擴展
? 雙引號(” )也防止所有擴展,但是以下情況例外:
$(美元符號) - 變量擴展
`(反引號) - 命令替換
\(反斜線) - 禁止單個字符擴展
!(嘆號) - 歷史命令替換
? bash的配置文件
按生效范圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
? shell登錄兩種方式
交互式登錄:
(1) 直接通過終端輸入賬號密碼登錄;
(2) 使用“su – UserName” 切換的用戶
執行順序:
/etc/profile –> /etc/profile.d/.sh –>/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登錄:
(1)su UserName
(2) 圖形界面下打開的終端
(3) 執行腳本
執行順序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/.sh
? Profile類
按功能劃分,存在兩類:
profile 類和bashrc類
? profile 類:為交互式登錄的shell 提供配置
全局:/etc/profile, /etc/profile.d/.sh
個人:~/.bash_profile
功用:
(1)用于定義環境變量
(2)運行命令或腳本
? Bashrc類
bashrc 類:為非交互式和交互式登錄的shell 提供配置
全局:/etc/bashrc
個人:~/.bashrc
功用:
(1)定義命令別名和函數
(2)定義本地變量
? 編輯配置文件生效
修改profile 和bashrc 文件后需生效
兩種 方法:
1 重新啟動shell 進程
2 .或source
例:
. ~/.bashrc
? Bash 退出任務
保存在~/.bash_logout 文件中(用戶)
在退出登錄shell 時運行
用于
? 創建自動備份
? 清除臨時文件
原創文章,作者:xialingfeng,如若轉載,請注明出處:http://www.www58058.com/72047