1、shell編程:過程式、解釋執行 2、shell腳本基礎 2.1shell腳本: 包含一些命令或聲明,并符合一定格式的文本文件 2.2格式要求:首行shebang機制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl 2.3shell腳本的用途有: 自動化常用命令 執行系統管理和故障排除 創建簡單的應用程序 處理文本或文件 ? 3、創建shell腳本 3.1第一步:使用文本編輯器來創建文本文件 第一行必須包括shell聲明序列:#! #!/bin/bash 添加注釋,注釋以#開頭 3.2第二步:運行腳本 給予執行權限,在命令行上指定腳本的絕對或相對路徑 直接運行解釋器,將腳本作為解釋器程序的參數運行 4、腳本代碼開頭約定 4.1第一行一般為調用使用的語言 4.2程序名,避免更改文件名為無法找到正確的文件 4.3版本號 4.4更改后的時間 4.5作者相關信息 4.6該程序的作用,及注意事項 4.7最后是各版本的更新簡要說明 5、腳本測試 5.1檢測腳本中的語法錯誤 bash -n /path/to/some_script 5.2調試執行 bash -x /path/to/some_script6、變量 6.1強類型:變量不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。一般定義變量時必 須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤 如 java,c# 6.2弱類型:語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運算會自動進 行隱式類型轉換;變量無須事先定義可直接調用 如:bash不支持浮點數,php 6.3變量命名法則: 6.3.1不能使程序中的保留字:例如if, for 6.3.2只能使用數字、字母及下劃線,且不能以數字開頭 6.3.3見名知義 6.4統一命名規則:駝峰命名法 7、bash中變量的種類 根據變量的生效范圍等標準劃分下面變量類型: 7.1局部變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的 shell進程均無效
>>------------------------------------------------------------------------------------ 變量賦值:name=‘value’ 可以使用引用value: (1) 可以是直接字串; name=“root" (2) 變量引用:name="$USER" (3) 命令引用:name=`COMMAND` name=$(COMMAND) 變量引用:${name} $name "":弱引用,其中的變量引用會被替換為變量值 '':強引用,其中的變量引用不會被替換為變量值,而保持原字符串
顯示已定義的所有變量:set
刪除變量:unset name 注:name=$name和name="$name"有區別,如果name值為多行字符,后者可保持原字符格式,不自動合并
<<------------------------------------------------------------------------------------ 7.2環境(全局)變量:生效范圍為當前shell進程及其子進程 >>------------------------------------------------------------------------------------ 變量聲明、賦值: export name=VALUE declare -x name=VALUE
---->pstree命令可查看當前進程位置
![]()
變量引用:$name, ${name} 顯示所有環境變量: env printenv export declare -x
刪除變量: unset name <<----------------------------------------------------------------------------------- 7.3本地變量:生效范圍為當前shell進程中某代碼片斷,通常指函數 7.4位置變量:$1, $2, ...來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數 >>------------------------------------------------------------------------------------ 只讀變量:只能聲明,但不能修改和刪除 聲明只讀變量: readonly name declare -r name
查看只讀變量: readonly –p
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數 $1, $2, ...:對應第1、第2等參數,shift [n]換位置 $0: 命令本身 $*: 傳遞給腳本的所有參數,全部參數合為一個字符串 $@: 傳遞給腳本的所有參數,每個參數為獨立字符串 $#: 傳遞給腳本的參數的個數 $@ $* 只在被雙引號包起來的時候才會有差異 set -- 清空所有位置變量 <<------------------------------------------------------------------------------------ 7.5特殊變量:$?, $0, $*, $@, $#,$$ $_ $$:當前進程PID $_:上一條命令最有一個參數 注:(list)表示在小括號里創建當前進程子進程,運行結束退出,無顯示信息 { list; }只影響當前進程
---->x=1;echo $$;(echo $$;echo "subx=$x";x=2;echo "subx2=$x");echo "x=$x"
注:subshell中的$$取到的仍然是父進程bash的pid,如果想要取到subshell的pid,可以使用BASHPID變 量 8、退出狀態 進程使用退出狀態來報告成功或失敗 0 代表成功,1-255代表失敗 $? 變量保存最近的命令退出狀態 例如: ping -c1 -W1 hostdown &> /dev/null echo $?? ---->ping命令,通過icmp包協議探測對方主機是否在線,一般局域網使用 -c :表示ping次數,也就是icmp包個數 -W:timeout, 9、退出狀態碼 bash自定義退出狀態碼 exit [n]:自定義退出狀態碼 注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字 注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行最后一條命令的狀態碼 10、算術運算 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-- 11、bash的數值測試 -v VAR :變量VAR是否設置 數值測試: -gt 是否大于 -ge 是否大于等于 -eq 是否等于 -ne 是否不等于 -lt 是否小于 -le 是否小于等于? 12、字符串測試: == 是否等于 > ascii碼是否大于ascii碼 < 是否小于 != 是否不等于 =~ 左側字符串是否能夠被右側的PATTERN所匹配 注意: 此表達式一般用于[[ ]]中;擴展的正則表達式 -z "STRING“ 字符串是否為空,空為真,不空為假 -n "STRING“ 字符串是否不空,不空為真,空為假 注意:用于字符串比較時的用到的操作數都應該使用引號? 13、Bash的文件測試 存在性測試 -a FILE:同-e -e FILE: 文件存在性測試,存在為真,否則為假 存在性及類別測試 -b FILE:是否存在且為塊設備文件 -c FILE:是否存在且為字符設備文件 -d FILE:是否存在且為目錄文件 -f FILE:是否存在且為普通文件 -h FILE 或 -L FILE:存在且為符號鏈接文件 -p FILE:是否存在且為命名管道文件 -S FILE:是否存在且為套接字文件 -s FILE:是否存在且不是空文件 14、文件權限測試: -r FILE:是否存在且可讀 -w FILE: 是否存在且可寫 -x FILE: 是否存在且可執行 文件特殊權限測試: -u FILE:是否存在且擁有suid權限 -g FILE:是否存在且擁有sgid權限 -k FILE:是否存在且擁有sticky權限 ? ?15、文件大小測試: -s FILE: 是否存在且非空 文件是否打開: -t fd: fd 文件描述符是否在某終端已經打開 -N FILE:文件自從上一次被讀取之后是否被修改過 -O FILE:當前有效用戶是否為文件屬主 -G FILE:當前有效用戶是否為文件屬組? 16、雙目測試: FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接 FILE1 -nt FILE2: FILE1是否新于FILE2(mtime) FILE1 -ot FILE2: FILE1是否舊于FILE2 17、bash的組合測試條件 第一種方式: COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND 非 如:[[ -r FILE ]] && [[ -w FILE ]] 第二種方式: EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 注:必須使用測試命令進行 ? 18、使用read命令來接受輸入 使用read來把輸入值分配給一個或多個shell變量 -p 指定要顯示的提示 -s 靜默輸入,一般用于密碼 -n N 指定輸入的字符長度N -d ‘字符’ 輸入結束符 -t N TIMEOUT為N秒 read 從標準輸入中讀取值,給每個單詞分配一個變量 所有剩余單詞都被分配給最后一個變量 read -p “Enter a filename: “ FILE?
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95621