shell腳本

t01c8d0a587f7a91802

編程基礎:

程序:指令+數據

程序編程風格;

面向過程:以指令為中心,數據服務于指令

面對對象:以數據為中心,指令服務于數據

高級:

編譯:高級語言—>編譯器—>目標代碼

Java、C#

解釋:高級語言—>解釋器—>機器代碼

shell、Perl、Python

編程邏輯處理方式:

順序執行

循環執行

選擇執行

shell編程:過程式、解釋執行

編程語言的基本結構:

各種系統命令的組合

數據存儲:變量、數組

表達式:a + b

語句:if

格式要求:首行shebang機制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

大批量重復的程序可以寫成腳本

腳本格式

shebang要求必須寫

添加注釋

注釋用#開頭

運行腳本給執行權限

腳本命令沒有關聯時前面的命令報錯不影響后面的命令;如有關聯時反之。

bash -n [腳本] #測試腳本

bash -x [腳本] #調試執行

+表示執行的命令

++表示嵌套的執行命令

變量:命名空間的數據

變量定義命令時加反向單引號

調用變量時要加$

變量引用文件,顯示時加雙引號保留其格式

例如:fdtab=`cat /etc/fdtab`

echo “fdtab”

bash變量不分類型,直接賦值即可(都是字符,不支持浮點數)

關鍵字不能當變量

例如:if for ls hostname等

變量不能用數字或數字打頭

見名知意

統一命名規則:駝峰命名法

例如:HostName、hostName

bash變量的種類

局部變量:特定場合有效,當前進程有效,其子進程無效,其父進程也無效

pstree -p #查看進程樹附屬關系

環境(全局)變量:當前shell進程及其子進程有效,子進程可以更改賦值但不能父進程的賦值不更改

export #賦值全局變量

unset [變量] #刪除變量,不加$

set 顯示所有變量以及函數

printenv:同上

export:同上

declare -x:同上

declare -r:顯示“常量”

位置變量

定義10以上的變量加{}系統才能識別數字變量

$1,$2…..$n:對應第1、第2等參數($10)使用時用大括號擴起來${10}

$*:把所有參數合并成一個整體,用雙引號引起等同于$@

$0:如果是軟連接,顯示其軟鏈接的文件名

$@:每個參數為獨立字符

$#:傳遞給腳本的參數的個數

shift:移動輸入參數,默認移動一位(換位)

set–:刪除所有位置變量

特殊變量

$_:上一個命令的參數

$*:把所有參數合并成一個整體,用雙引號引起等同于$@

$0:如果是軟連接,顯示其軟鏈接的文件名

$@:每個參數為獨立字符

$#:傳遞給腳本的參數的個數

$$:當前進程的ID

$?變量保存最近命令退出狀態

shift:移動輸入參數,默認移動一位

set–:刪除所有位置變量

 

 

bash內建的環境變量:

$PATH

$SHELL

$USER

$UID

$HOME

$PWD

$SHLVL:shell嵌套深度

$LANG

$$:當前進程ID

$PPID:父進程ID

$MAIL

$HOSTNAME

$HISTSIZE

—:上一個命令的最后一個字符串

聲明只讀變量(常量):

readonly name:只能調用不能更改不能刪除,生命周期=當前進程的有效生命周期

declare -r name:

命令加小括號:相當于開啟了一個臨時的子進程但不是子進程,執行完命令后回到當前進程

例如:(cd /etc ; rm -rf ) #執行完回到當前目錄

聲明變量加小括號:臨時聲明執行,只執行一次后刪除

例如:(name=wang;echo $name)

小括號開啟子shell不影響當前shell

x=1;echo “pid=$$”;(echo “subpid=$$”;echo “subx=$x”;x=2;echo “subx2=$x”);echo x=$x

pid=2887

subpid=2887

subx=1

subx2=2

x=1

大括號開啟子shell影響當前shell

退出狀態

0表示成功,1-255表示失敗

語法錯誤$?不為零,命令錯誤$?由最后一條命令決定

腳本中exit可以定義$?返回的值

ping -c# [IP地址] #指定ping幾次

算術運算:

+,-,*,/,%取余,**乘方

let 變量=算術表達式

變量=$[算術表達式]

變量=$((算術表達式))

變量=$(expr arg1 arg2 arg3 …)

declare –i var = 數值 #把變量聲明成數值

echo ‘算術表達式’ | bc

賦值

增強型賦值:

+=, -=, *=, /=, %=

邏輯運算

&:與

0&0=0

0&1=0

1&0=0

1&1=1

0為false假

1為true真

|:或

0|0=0

0|1=1

1|0=1

1|1=1

^:異或

相同為假,不同為真

0^0=0

0^1=1

1^0=1

1^1=0

例如:

替換a和b的賦值

a=6

b=4

a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b

&&:短路與,

例如:cmd1&&cmd2

命令一為假,命令二則不執行,命令一為真,執行命令二

||:短路或,

例如:cmd1||cmd2

命令一為真,命令二則不執行,命令一為假,執行命令二

?。悍?/p>

test #判斷變量

[ -n 變量 ] 判斷變量是否為非空0為非空1為空 相當于[ 變量 ]

[ -z 變量 ] 判斷變量是否為空1為非空0為空

[[]] 使用正則表達式時使用

數值測試

-v 變量 :查看變量是否賦值

數值測試:

-gt ?是否大于

-ge ?是否大于等于

-eq ?是否等于

-ne ?是否不等于

-lt ?是否小于

-le ?是否小于等于

字符串測試:

== ?是否等于

> ?ascii碼是否大于ascii碼

< ?是否小于

!= ?是否不等于

=~ ?左側字符串是否能夠被右側的擴展正則所匹配,需要配合[[]]使用

bash的文件測試

bash [腳本]:開啟一個子進程相當于(./腳本)

read :把標準輸入賦值給一個或者多個變量用空格分隔開

-p:指定要顯示的提示

-s:靜默輸入

read x y z <<< “i j k”:批量賦值

.和source以及bash執行的區別

bash [腳本]和./[腳本]執行結果相同,在腳本的子進程中運行

source [腳本]和. [腳本]:在當前shell運行

腳本中不支持命令別名;也不支持定義別名

變量$-

h:開啟hash緩存表功能

i:表示當前shell是交互式shell

m:打開監控模式

B:大括號擴展

H:打開history的H選項

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

(0)
老司機丨快上車老司機丨快上車
上一篇 2018-04-11 19:35
下一篇 2018-04-11

相關推薦

  • shell腳本編寫的整理(1)

    1、shell腳本的特點及用途
    2、全局變量、局部變量、本地變量
    3、位置變量、特殊變量、只讀變量
    4、退出狀態、算數運算、賦值
    5、邏輯運算、條件測試、數值測試
    6、文件測試、文件權限測試、文件屬性測試
    7、read命令、bash的配置

    2018-04-14
  • 路由

    地址分類有類的 固定的網絡ID 是多少位就是多少位A 前8位是網絡ID0-127.x.x.x其中0.x.x.x是未知地址,不能用127.x.x.x是回環地址,不能用所以有1-126個網段可用公式:網絡(網段)數量=2^可變網絡ID位數一個網絡的主機數量=2^主機ID位數-2所以一個A類網絡主機數有1600萬netmask:255.0.0.0 B類128-19…

    Linux筆記 2018-05-06
  • rm 和 inode

    mv和inode :  

    Linux筆記 2018-04-01
  • 正則表達式、linux文件處理三劍客:grep、sed、awk

    基本的正則表達式元字符:默認工作于貪婪模式; 字符匹配: .:匹配任意單個字符; []:匹配指定范圍內的任意單個字符; [^]:匹配范圍外的任意單個字符; [:digit:]數字、[:lower:]小寫字母、[:upper:]大寫字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母數字、[:punct:]標點符號 匹配次數: *…

    Linux筆記 2018-03-28
  • Linux的tail 與head 命令

    head命令是用來查看具體文件的前面幾行的內容,具體格式如下: head <filename>: 你可以通過head命令查看具體文件最初的幾行內容,該命令默認是前10行內容,如果你想查看前面更多內容,你可以通過一個數字選項來設置,例如 head -20 install.log 通過上面命令你可以查看install.log這個文件前面20行的內容 …

    2018-04-16
欧美性久久久久