編程基礎:程序:指令+數據
過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
shell程序:提供了編程能力,解釋執行
編程語言:低級:匯編
高級:
編譯:高級語言–>編譯器–>目標代碼 java,c#
解釋:高級語言–>解釋器–>機器代碼 shell,perl,python
編程邏輯處理方式:
順序執行
循環執行
選擇執行
shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a + b
語句:if
shell腳本:包含一些命令或聲明,并符合一定格式的文件
格式要求:#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本的用途:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件
shell腳本的創建:
使用文本編輯來創建文本文件
第一行必須包括shell聲明序列:#!/bin/bash
#注釋行 (可以寫上時間,作者,做什么用)
寫完后運行腳本:
bash -n file 檢測腳本中的語法錯誤,但不能檢查命令錯誤
bash -x file 調試執行,可以檢查命令錯誤
chmod +x file 后 建議使用bash file 運行
變量:
字符型:
數值型:整型,浮點型
變量命名法則:
1 、不能使程序中的保留字:例如if, for
2 、只能使用數字、字母及下劃線,且不能以數字開頭
3 、見名知 義
4 、統一命名 規則:駝峰命名法
強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤 如: java,c
弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
如:bash 不支持浮點數,python
bash中的變量種類:
本地變量:生效范圍為當前shell 進程;對當前shell 之外的其它shell 進程,包括當前shell 的子shell 進程均無效
環境變量:生效范圍為當前shell進程及其子進程
局部變量:生效范圍為當前shell 進程中某代碼片斷( 通常指函數)
位置變量:$1, $2, … 來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
變量賦值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 變量引用:name=”$USER”
(3) 命令引用:name=COMMAND
name =$(COMMAND)
變量引用:$name
“” :弱引用,其中的變量引用會被替換為變量值
” :強引用,其中的變量引用不會被替換為變量值,而保
持原字符串
? 顯示已定義的所有變量:set
? 刪除變量:unset name
變量聲明、賦值: 定義環境變量
exprot name=value
declare -x name=value
顯示所有環境變量:
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 等參數,shift [n]
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
當位置參數達到10以上需要加上大括號 比如 ${10} ${11}
$0 腳本名 使用basename可以取基名
shift # 清理單獨的位置參數#清理多少個
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
自增,自減:
j=i++ 先賦值給j,然后再加1
j=++1 先加1賦值給j,
邏輯運算: || && !
異或:^ 異或的兩個值,相同為假,不同為真
進程使用退出狀態來報告成功或失敗
? 0 代表成功,1 -255 代表失敗
? $? 變量保存最近的命令退出狀態
條件測試:
判斷某需求是否滿足,需要由測試機制來實現
專用的測試表達式需要由測試命令輔助完成測試過程
評估布爾聲明,以便用在條件執行中
若真,則返回0
若假,則返回1
測試命令:
? test EXPRESSION
? [ EXPRESSION ]
? [[ EXPRESSION ]]
注意:EXPRESSION 前后必須有空白字符
$ [ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” -eq “$B” ] && echo “Integers are equal”
根據退出狀態而定,命令可以有條件地運行 && ||
數值測試:
-gt: 是否大于 -ge: 是否 大于等于
-eq: 是否等于 -ne: 是否 不等于
-lt: 是否小于 -le: 是否 小于等于
字符串測試:
== :是否等于;
>: ascii 碼是否大于ascii碼
<: 是否小于
!=: 是否不等于
=~: 左側字符串是否能夠被右側的PATTERN所 所 匹配
注意: 此表達式一般用于[[ ]] 中;擴展的正則表達式
-z “STRING” :字符串是否為空,空為真,不空為假
-n “STRING” :字符串是否不空,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
文件測試:
-e FILE: 文件存在性測試,存在為真,否則
-d FILE: 是否存在且為目錄文件
-b FILE: 是否存在且為塊設備文件
…….
文件權限測試:-r -w -x 是否存在且有權限
特殊權限測試:-u -g -k 是否存在且有特殊權限
文件大小測試:-s 是否存在且非空
文件是否打開:-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
必須使用測試命令進行
使用read命令來接受輸入:
-p 指定要顯示的提示
-s 靜默輸入
-n N 指定輸入的字符長度N
-d ‘ 字符’ 輸入結束符
-t N TIMEOUT 為N秒
read 從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE
bash如何展開命令行
把命令行分成單個命令詞
展開別名
展開大括號種的聲明({})
展開波浪符聲明(~)
命令替換$() 和 “)
再次把命令行分成命令詞
展開文件通配(* 、? 、[abc] 等等)
準備I/0 重導向(< 、>)
運行命令
防止擴展:反斜線(\ )會使隨后的字符按原意解釋
加引號來防止擴展
? 單引號(’ )防止所有擴展
? 雙引號(” )也防止所有擴展,但是以下情況例外:
$ (美元符號) - 變量擴展
` (反引號) - 命令替換
\ (反斜線) - 禁止單個字符擴展
! (嘆號) - 歷史命令替換
bash的配置文件:
按生效范圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
修改profile 和bashrc 文件后需生效
兩種方法:
1 重新啟動shell 進程
2 . 或source (使用source)
bash退出任務:
保存在~/.bash_logout 文件中(用戶)
在退出登錄shell 時運行
用于
? 創建自動備份
? 清除臨時文件
原創文章,作者:shewei,如若轉載,請注明出處:http://www.www58058.com/70357