!/bin/bash
set -u -e 安全
export 環境變數 cat /porc/$PID/export
位置變數
$0: 表示指令碼或命令本身的名稱。
$1, $2, $3, ...: 表示第一個、第二個、第三個等引數的值。
$* 或 $@: 表示所有位置引數的列表。
$#: 表示傳遞給指令碼或命令的位置引數的個數。
echo $[12^4] =8 異或
條件 | 表示式 | 描述 |
---|---|---|
可讀 | [[ -r "$file" ]] | 檢查檔案是否可讀。 |
可寫 | [[ -w "$file" ]] | 檢查檔案是否可寫。 |
可執行 | [[ -x "$file" ]] | 檢查檔案是否可執行。 |
存在 | [[ -e "$file" ]] | 檢查檔案是否存在。 |
目錄 | [[ -d "$file" ]] | 檢查檔案是否是目錄。 |
檔案 | [[ -f "$file" ]] | 檢查檔案是否是普通檔案(非目錄、非裝置檔案等)。 |
符號連結 | [[ -L "$file" ]] | 檢查檔案是否是符號連結。 |
以某使用者為所有者 | [[ -O "$file" ]] | 檢查檔案是否以某使用者為所有者。 |
以某使用者為所屬組 | [[ -G "$file" ]] | 檢查檔案是否以某使用者為所屬組。 |
檔案大小是否大於零 | [[ -s "$file" ]] | 檢查檔案大小是否大於零。 |
條件 | 表示式 |
---|---|
相等 | [[ $a == $b ]] |
不相等 | [[ $a != $b ]] |
大於 | [[ $a -gt $b ]] |
大於等於 | [[ $a -ge $b ]] |
小於 | [[ $a -lt $b ]] |
小於等於 | [[ $a -le $b ]] |
邏輯與 | [[ $a && $b ]] |
邏輯或 | [[ $a |
: | 死迴圈 |
(cd /data; umask 666; touch 2.txt) 再下個程序執行,不影響當前環境
{} 反之,在當前環境下執行
num ="zz yy yy" 定為一行
echo $num
num ="
ll
zz
l1
"
echo "$num"
nums="echo {1..10}"
for迴圈
for i in {xxx};
do
迴圈
done
例子:for i in {1..100};
do let sum+=i;
done;
for ((sum=0;i<100;i++));
do
let sum+=i;
done
while迴圈
迴圈控制中斷迴圈 conuntion
迴圈控制退出迴圈 break
while CONDITION
do
迴圈體
done
例子:while true do
迴圈體
done
while read url;do
crul $url &>/dev/null |echo "$url is faild"
done <url.txt
df | sed -En '/^/dev//s#.* ([0-9]+)%.*#\1 \2#p'|while read DISK USE; do
迴圈體
done
until迴圈 while的反
until commant ;do commant done
until false ;do commant done
位置引數
bash test.sh bb zz bb ee
選擇迴圈
selcet menu in bb zz ll ; do echo $menu;done
$ps1:影響顏色
$ps3:用於select迴圈中的提示符
funtion 函式呼叫
local 變數 本地變數,將變數定在了函式體內
return 返回會退出函式
exit 直接退出指令碼
func1 () {
函式體
}
func1 (函式呼叫)
階層
假設$1=3,3進入迴圈,$-1,所以進入2的迴圈,2進入1的迴圈,返回1,21退出2階層到3,所以是12*3
bomb() {bomb|bomb &}; bomb
呼叫bomb,並在後臺執行
trap
trap "finish" exit 當出現exit時,確保執行finish
陣列
定義:
emp[0]=zz
emp[1]=zz1
emp[2]=zz2
title=("e" e1 e2)
num=({1..10})
關聯陣列(自定義陣列)
declare -A 陣列 使用關聯陣列需要先定義
emp[frist]=l1
emp[second]=l2
刪除
unset num[2]
呼叫
echo ${title[]} 顯示全部 @顯示陣列下標 ${#num[@]} 加#顯示下標總數
echo ${num[@]:3:4} 跳過3個輸出4個
echo ${url#/} #懶惰模式 找到第一個/輸出 ##貪婪模式
echo ${url%/} %反向檢索 %%貪婪模式
echo ${url/33/44} 替換
echo ${url/33} 刪除
遍歷陣列
for i in ${emp[*]};do echo $i ;done
基於偏移量取字串
返回字串變數var的字元的長度,一個漢字算一個字元
${#var}
返回字串變數var中從第offset個字元後(不包括第offset個字元)的字元開始,到最後的部分,
offset的取值在0 到 ${#var}-1 之間(bash4.2後,允許為負值)
${var:offset}
返回字串變數var中從第offset個字元後(不包括第offset個字元)的字元開始,長度為number的部分
${var:offset:number}
取字串的最右側幾個字元,取字串的最右側幾個字元, 注意:冒號後必須有一空白字元
${var: -length}
從最左側跳過offset字元,一直向右取到距離最右側lengh個字元之前的內容,即:掐頭去尾
${var:offset:-length}
先從最右側向左取到length個字元開始,再向右取到距離最右側offset個字元之間的內容,注意:-length
前空格,並且length必須大於offset
${var: -length:-offset}
基於模式取子串
其中word可以是指定的任意字元,自左而右,查詢var變數所儲存的字串中,第一次出現的word, 刪除字
符串開頭至第一次出現word字串(含)之間的所有字元,即懶惰模式,以第一個word為界刪左留右
${var#*word}
從var變數的值中刪除以word開頭的部分
${var#word}
同上,貪婪模式,不同的是,刪除的是字串開頭至最後一次由word指定的字元之間的所有內容,即貪婪模
式,以最後一個word為界刪左留右
${var##*word}
${var##word}
##################################################################################
其中word可以是指定的任意字元,功能:自右而左,查詢var變數所儲存的字串中,第一次出現的word,
刪除字串最後一個字元向左至第一次出現word字串(含)之間的所有字元,即懶惰模式,以從右向左的第一
個word為界刪右留左
${var%word*}
${var%word}
同上,只不過刪除字串最右側的字元向左至最後一次出現word字元之間的所有字元,即貪婪模式,以從右向
左的最後一個word為界刪右留左
${var%%word*}
${var%%word}
高階變數
高階變數用法-有型別變數
- Shell變數一般是無型別的,但是bash Shell提供了declare和typeset兩個命令用於指定變數的型別,兩個命令是等價的
- declare [選項] 變數名
-r 宣告或顯示只讀變數
-i 將變數定義為整型數
-a 將變數定義為陣列
-A 將變數定義為關聯陣列
-f 顯示已定義的所有函式名及其內容
-F 僅顯示已定義的所有函式名
-x 宣告或顯示環境變數和函式
-l 宣告變數為小寫字母 declare –l var=UPPER
-u 宣告變數為大寫字母 declare –u var=lower
eval 間接引用
eval會進行兩次掃描,先替換$n,然後再輸出
x=y
y=zz
devl echo $$x 或 echo ${!x}