程序:指令+數據 程序: 算法+數據結構 數據:是程序的核心 數據結構:數據在計算機中的類型和組織方式 算法: 處理數據的方式 程序編程風格: 過程式 :以指令爲中心,數據服務於指令 對象式 : 以數據爲中心,指定服務於數據 shell程序: 提供了編程能力,解釋執行
計算機:運行二進制指令 編程語言:人與計算機之間交互的語言 低級編程語言: 機器:二進制的0和1的序列 低級:彙編 高級編程語言: 編譯:高級語言---編譯器---機器代碼---執行 c, c++ 解釋:高級語言--執行--×××--機器代碼 shell python java
編程邏輯處理方式: 順序執行 循環執行 選擇執行 shell編程:過程式,解釋執行 編程語言的基本結構 各類系統命令的組合 數據存儲:變量,數組 表達式:a+b shell腳本基礎
shell腳本:
包含一些命令或聲明,並符合必定格式文本文件
格式要求:首行shebang機制
#! /bin /bash
#!/usr /bin/pythonphp
自動化經常使用命令 建立簡單的應用程序 處理文本或文件 執行系統管理和故障排除
第一步:使用文本編輯器來建立文本文件 第一行必須包括shell聲明序列 :#! #! /bin/bash 添加註釋 註釋以#開頭 第二步:運行腳本 給予執行權限,在命令行上指定腳本的絕對或相對路徑 直接運行解釋器,將腳本做爲解釋器程序的參數運行
1:第一行通常爲調用的語言 2:程序名,避免更改文件名爲沒法找到的文件 3:版本號 4:更改後的時間 5:做者相關信息 6:該程序的做用,及注意事項 7:最後是個版本的更新簡要說明
檢測腳本中的語法錯誤 bash -n /path/to/some_script 調試執行 bash -x /path/to/some_script
變量:命令的內存空間 數據存儲方式 字符 數值:整型,浮點型 變量:變量類型 做用: 1:數據存儲格式 2:參與的運算 3:表示的數據範圍 類型: 字符 數值:整型,浮點型
強類型:變量不通過強制轉換,它永遠是這個數據類型,不容許隱式的類型轉 換。通常定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明 變量會產生錯誤 如 java,c# 弱類型:語言的運行時會隱式作數據類型轉換。無須指定類型,默認均爲字符 型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用 如:bash 不支持浮點數,php
1:不能使用程序中的保留字:例如if,for 2: 只能使用數字 3:見名知義 4:統一命令規則:駝峯命名法
根據變量的生效範圍等標準劃分下面變量類型: 局部變量:生效範圍爲當前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 變量引用:${name} $name " ":弱引用,其中的變量引用會被替換爲變量值 ’ ‘:強引用,,其中的變量引用不會被替換爲變量值,而保持原字符串 顯示已定義的全部變量:set 刪除變量:unset name
環境變量 當前能夠使用,子進程也能使用 父進程不能使用 加上export 例如:export name=`hostname` export [只看環境變量] set[全部變量都在裏面] unset name [取消刪除變量] 變量聲明 、賦值: export name=VALUE declare -x name=VALUE 變量引用:$name, ${name}
env printenv export declare -x 刪除變量: unset name bash內建的環境變量: PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE
只讀變量:只能聲明,但不能修改和刪除 【例:readonly name=dang 這就是隻讀變量 不能刪除可是exit退出來只讀變量就沒有了】 查看已讀變量:readonly -p 位置變量::在腳本代碼中調用經過命令行傳遞給腳本的參數 $1, $2, ...:對應第一、第2等參數,shift [n]換位置 $0: 命令自己 $*: 傳遞給腳本的全部參數,所有參數合爲一個字符串 $@: 傳遞給腳本的全部參數,每一個參數爲獨立字符串 $#: 傳遞給腳本的參數的個數 $@ $* 只在被雙引號包起來的時候纔會有差別 set -- 清空全部位置變量
進程使用退出狀態來報告成功或失敗 0 表明成功 1-255表明失敗 $?變量保存最近的命令退出狀態 例如: ping -c1 -W1 hostname &>/dev/null echo $?
bash自定製退出狀態碼 exit [n] :自定義退出狀態碼 注意: 腳本中一旦遇到exit命令,腳本會馬上終止;終止退出狀取決於exit命令後面的數字 注意::若是未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行 的最後一條命令的狀態碼
true【真】,false【假】 1,0 與: 1 與 1 = 1 1 與 0 = 0 &【表明與】 0 與 1 = 0 0 與 0 = 0 或: 1 或 1 = 1 1 或 0 = 1 0 或 1 = 1 |【表明或】 0 或 0 = 0 邏輯運算 非: ! !1=0 !0=1
短路與 第一個爲0 ,結果一定爲0 &&【表明短路與】 第一個爲1 ,第二個必需要參與運算 例: ls dng &>/dev/null && chmod +x dang 【意思: 若是前面命令存在就給他加執行權限】 短路或 第一個爲1 ,結果一定爲1 ||【表明短路或】 第一個爲0, 第二個一定要參與運算 例:id dang &>/dev/unll || useradd dang 【意思: 若是前面沒有這個目錄就建立】
異或:^ 異或的兩個值,相同爲假,不一樣爲真 同或: 相同爲1 ,不一樣爲0 條件性的執行操做符 根據退出狀態而定,命令能夠有條件地運行 && 表明條件性的AND THEN || 表明條件性的OR ELSE
-v VAR 變量VAR是否設置 數值測試: -gt 是否大於 -ge 是否大於等於 -eq 是否等於 -ne 是否不等於 -lt 是否小於 -le 是否小於等於
字符串測試: = 是否等於 > ascii碼是否大於ascii碼 < 是否小於 =~ 左側字符串是否可以被右側的PATTERN所匹配 【相似於包含】 注意: 此表達式通常用於[[ ]]中;擴展的正則表達式
[[ ]]
==相同,字符串不加「」 支持通配符
=~ 匹配,字符串不要加「」支持擴展正則表達式java
存在性測試 -a 而且 -o 或者 -e 文件存在性測試,存在爲真不存在爲假 -b 文件 :是否存在且爲塊設備文件 -c 文件 :是否存在且爲字符設備文件 -d 是否 目錄文件 -f 普通文件 -h或-l 連接文件 -p 命令管道文件 -S 套接字文件 -w 可寫文件 -o 當前有效用戶是否爲文件屬組 -G 當前有效用戶是否爲文件屬組 -r 存在且 可讀文件 -w 存在且可寫文件 -x 存在且可執行
[ -f "/etc/issue" ] && echo shi || echo bushi
[ -b "/dev/sda" ] && echo shi || echo bushi
file=f1; [ -f "$file" -a -x "$file" ] && chmod +r "$file"|| echo bushi
file=f1; [ ! -x "$file" ] && chmod +w "$file"|| echo bushi
把 buyunxuputongyonghudengru >/etc/nologin 【把前面字符寫入,etc/nologin中 每當普通用戶登入時會顯示前面的字符】
使用read來把輸入值分配給一個或多個shell變量 -p 指定要顯示的提示 read -p "please input your passwd " passwd 【會顯示提示 ,後面的passwd是賦值 就是把前面輸入的只賦給passwd】 -s 靜默輸入,通常用於密碼 -n N 指定輸入的字符長度N -d ‘字符’ 輸入結束符 -t N TIMEOUT爲N秒 read 從標準輸入中讀取值,給每一個單詞分配一個變量 全部剩餘單詞都被分配給最後一個變量 read -p 「Enter a filename: 「 FILE read能夠同時給幾個變量賦值 例:read z x c <<< "aa ss dd" 【三個<號】