shell程式設計

TestAL4193發表於2024-05-01

!/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 (函式呼叫)

階層
image
假設$1=3,3進入迴圈,$-1,所以進入2的迴圈,2進入1的迴圈,返回1,21退出2階層到3,所以是12*3

bomb() {bomb|bomb &}; bomb
呼叫bomb,並在後臺執行

trap
image
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,然後再輸出
image

x=y
y=zz
devl echo $$x 或 echo ${!x}

相關文章