腳本編程基礎環境設置

?程序:指令+數據
?程序編程風格:
過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
?shell程序:提供了編程能力,解釋執行

?計算機:運行二進制指令
?編程語言:
低級:匯編
高級:
編譯:高級語言–>編譯器–>目標代碼
java,C#
解釋:高級語言–>解釋器–>機器代碼
shell, perl, python

?編程邏輯處理方式:
順序執行
循環執行
選擇執行
?shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式: a + b
語句:if

shell腳本基礎
?shell腳本:
包含一些命令或聲明,并符合一定格式的文本文件
?格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
?shell腳本的用途有:
? 自動化常用命令
? 執行系統管理和故障排除
? 創建簡單的應用程序
? 處理文本或文件
創建shell腳本
?第一步:使用文本編輯器來創建文本文件
?第一行必須包括shell聲明序列:#!
#!/bin/bash
?添加注釋
注釋以#開頭
?第二步:運行腳本
?給予執行權限,在命令行上指定腳本的絕對或相對路徑
?直接運行解釋器,將腳本作為解釋器程序的參數運行

腳本規范
?腳本代碼開頭約定
1、第一行一般為調用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關信息
6、該程序的作用,及注意事項
7、最后是各版本的更新簡要說明

腳本的基本結構
?腳本的基本結構
#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
shell腳本示例
#!/bin/bash
# ——————————————
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: wang
# Email: wang@gmail.com
# Website: www.magedu.com
# Description: This is the first script
# ——————————————
# Copyright: 2017 wang
# License: GPL
echo “hello world”

腳本調試
?檢測腳本中的語法錯誤
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、統一命名規則:駝峰命名法

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}
?顯示所有環境變量:
env
printenv
export
declare -x
?刪除變量:
unset name

環境變量
?bash內建的環境變量:
?PATH
?SHELL
?USER
?UID
?HOME
?PWD

?SHLVL
?LANG
?MAIL
?HOSTNAME
?HISTSIZE
?—
只讀和位置變量
? 只讀變量:只能聲明,但不能修改和刪除
? 聲明只讀變量:
readonly name
declare -r name
? 查看只讀變量:
readonly –p
? 位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1, $2, …:對應第1、第2等參數,shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
退出狀態
?進程使用退出狀態來報告成功或失敗
? 0 代表成功,1-255代表失敗
? $? 變量保存最近的命令退出狀態
?例如:
ping -c1 -W1 hostdown &> /dev/null
echo $?

退出狀態碼
?bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命
令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行
的最后一條命令的狀態碼

算術運算
?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(0-32767)
echo $[$RANDOM%50] :0-49之間隨機數
賦值
?增強型賦值:
+=, -=, *=, /=, %=
?let varOPERvalue
例如:let count+=3
自加3后自賦值
?自增,自減:
let var+=1
let var++
let var-=1
let var–

邏輯運算
?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,第二個必須要參與運算
短路或
第一個為1,結果必定為1
第一個為0,第二個必須要參與運算
?異或:^
異或的兩個值,相同為假,不同為真
條件測試
?判斷某需求是否滿足,需要由測試機制來實現
專用的測試表達式需要由測試命令輔助完成測試過程
?評估布爾聲明,以便用在條件性執行中
? 若真,則返回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的數值測試
?-v VAR
變量VAR是否設置
?數值測試:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
bash的字符串測試
?字符串測試:
= 是否等于
> ascii碼是否大于ascii碼
< 是否小于
!= 是否不等于
=~ 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]]中;擴展的正則表達式
-z “STRING“ 字符串是否為空,空為真,不空為假
-n “STRING“ 字符串是否不空,不空為真,空為假
? 注意:用于字符串比較時的用到的操作數都應該使用引號

Bash的文件測試
?存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假
?存在性及類別測試
-b FILE:是否存在且為塊設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件
Bash的文件權限測試
?文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
?文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
Bash的文件屬性測試
?文件大小測試:
-s FILE: 是否存在且非空
?文件是否打開:
-t fd: fd 文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取之后是否被修改過
-O FILE:當前有效用戶是否為文件屬主
-G FILE:當前有效用戶是否為文件屬組
Bash的文件屬性測試
?雙目測試:
FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊于FILE2
Bash的組合測試條件
?第一種方式:
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來把輸入值分配給一個或多個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)執行腳本
(4)任何其它的bash實例
執行順序: ~/.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時運行
?用于
? 創建自動備份
? 清除臨時文件
$-變量
?h:hashall,打開這個選項后,Shell 會將命令所在的路徑hash下來,避免每次
都要查詢。通過set +h將h選項關閉
?i:interactive-comments,包含這個選項說明當前的 shell 是一個交互式的
shell。所謂的交互式shell,在腳本中,i選項是關閉的。
?m:monitor,打開監控模式,就可以通過Job control來控制進程的停止、繼
續,后臺或者前臺執行等。
?B:braceexpand,大括號擴展
?H:history,H選項打開,可以展開歷史列表中的命令,可以通過!感嘆號來完
成,例如“!!”返回上最近的一個歷史u命令,“!n”返回第 n 個歷史命令

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96148

(0)
你的命字你的命字
上一篇 2018-04-15
下一篇 2018-04-15

相關推薦

  • 搭建本地yum倉庫

    一、首先準備兩臺Centos虛擬機,一臺搭建yum源服務器,一臺作為客戶端進行訪問及安裝、更新軟件。(1)、yum源服務器版本是Centos7.4(2)、客戶端版本是centos6.9二、自動掛載光驅(1)、準備centos6.9的虛擬光盤和centos7.4的虛擬光盤,掛載至centos7.4系統上(2)、安裝autofs包,實現自動掛載方法1、cd /m…

    2018-04-22
  • bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示

    在 Linux 下,任意一個命令執行結束之后,bash都會返回0-255之間的數值以表示命令執行成功與否;其返回值保存于bash的特殊變量$?中 [root@yinwei tmp]# uptime 15:13:27 up 18 min, 1 user, load average: 0.07, 0.03, 0.05 [root@yinwei tmp]# ech…

    Linux筆記 2018-05-18
  • selinux 和 awk的使用

    selinux 和 awk的使用

    Linux筆記 2018-05-15
  • linux操作系統啟動流程 & grub簡述

    linux操作系統啟動流程 & grub簡述

    Linux筆記 2018-06-03
  • 馬哥網絡班第31期——第一周作業

    1、描述計算機的組成及其功能。
    2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別。
    3、描述Linux的哲學思想,并按照自己的理解對其進行解釋性描述。
    4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例來闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分的。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及功用規定

    Linux筆記 2018-07-06
  • Linux-基礎操作

    Linux From Scratch? 自制Linux 官網:http://www.linuxfromscratch.org 中文版LFS-ver7.7:https://linux.cn/lfs/LFS-BOOK-7.7-systemd/   設置開機自動登錄: vim /etc/gdm/custom.conf [daemon] Automatic…

    2018-03-30
欧美性久久久久