shell指令碼程式設計進階字串切片和高階變數
1.字串切片
1)字串變數var的長度(字元個數)
${#var}
例:
[root@centos7 ~]# name=魏藍 [root@centos7 ~]# echo ${#name} 2 [root@centos7 ~]# str=`echo {a..z} | tr -d ' '` [root@centos7 ~]# echo ${#str} 26
2)切片
例:
[root@centos8 ~]# echo ${str:3} defghijklmnopqrstuvwxyz [root@centos8 ~]# echo ${str:3:4} defg
3)取字串的最右側n個字元,注意:冒號後必須有一個空白字元
${var: -length}
例:
[root@centos8 ~]# echo ${str: -5} vwxyz
4)拋頭去尾
${var:offset: -length}
例:
[root@centos8 ~]# echo ${str:3: -3} defghijklmnopqrstuv
5)先從最右側向左取到length個字元開始,再向右取到距離最右側offset個字元之間的內容,注意:-length前有空格,並且length>offset
${var: -length:-offset}
例:
[root@centos8 ~]# echo ${str: -6:-3} uvw
2.基於模式取子串
1)其中word可以指定的任意字元,自左而右,查詢var變數所儲存的字串中,第一次出現的word,刪除字串開頭至第一次出現word字串(含)之間的所有字元,即懶惰模式,以第一個word為界刪左留右
例:
[root@centos8 ~]# url=https://www.cnblogs.com/weilanxuesre/p/15987297.html [root@centos8 ~]# echo ${url#*/} /www.cnblogs.com/weilanxuesre/p/15987297.html
2)貪戀模式,以最後一個word為界刪左留右
echo ${var##*word}
例:
[root@centos8 ~]# echo ${url##*/} 15987297.html
這是從左到右,下面說說從右到左
4)懶惰模式,從右向左的第一個word為界刪右留左
${var%word*}
例:
[root@centos8 ~]# echo ${url%:*} https
5)貪婪模式,以最左的一個word為界,刪左留右
${var%%word*}
例:
[root@centos8 ~]# echo ${url%%/*} https:
3.字串的查詢替換
1)查詢var所表示的字串中,第一次被pattern所匹配到的字串,以substr替換之(懶惰模式)
${var/pattern/substr}
例:
[root@centos8 ~]# line=`getent passwd root` [root@centos8 ~]# echo ${line} root:x:0:0:root:/root:/bin/bash [root@centos8 ~]# echo ${line/root/weilan} weilan:x:0:0:root:/root:/bin/bash
2)將var中所有pattern字串替換為substr(貪婪模式)
${var//pattern/substr}
例:
[root@centos8 ~]# echo ${line//root/weilan} weilan:x:0:0:weilan:/weilan:/bin/bash
3)替換行首
${var/#pattern/substr}
例:
[root@centos8 ~]# echo ${line/#root/weilan} weilan:x:0:0:root:/root:/bin/bash
4)替換行尾
${var/%pattern/substr}
例:
[root@centos8 ~]# echo ${line/%bash/haha} root:x:0:0:root:/root:/bin/haha
4.查詢並刪除
1)刪除var中第一個pattern(懶惰)
${var/pattern}
例:
[root@centos8 ~]# echo ${line/root/} :x:0:0:root:/root:/bin/bash
2)刪除var中所有pattern(貪婪)
${var//pattern}
例:
[root@centos8 ~]# echo ${line//root} :x:0:0::/:/bin/bash
3)刪除以pattern為首的字元
${var/#pattern}
例:
[root@centos8 ~]# echo ${line/#root} :x:0:0:root:/root:/bin/bash
4)刪除行尾
${var/%pattren}
例:
[root@centos8 ~]# echo ${line/%bash} root:x:0:0:root:/root:/bin/
5.字元大小寫轉換
1)大寫
${var^^}
2)小寫
${var,,}
例:
[root@centos8 ~]# line=`echo ${line^^}` [root@centos8 ~]# echo $line ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH [root@centos8 ~]# echo ${line,,} root:x:0:0:root:/root:/bin/bash
6.高階變數
1)
範例:
[root@centos8 ~]#title=ceo [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name ceo [root@centos8 ~]#title= [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name [root@centos8 ~]#unset title [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name mage
2)高階變數用法-有型別變數
shell變數一般是無型別的,但可以用declare宣告有型別的變數
declare【選項】變數名
選項:
-r 宣告或顯示只讀變數 -i 將變數定義為整型數 -a 將變數定義為陣列 -A 將變數定義為關聯陣列 -f 顯示已定義的所有函式名及其內容 -F 僅顯示已定義的所有函式名 -x 宣告或顯示環境變數和函式,相當於export -l 宣告變數為小寫字母 declare -l var=UPPER -u 宣告變數為大寫字母 declare -u var=lower -n make NAME a reference to the variable named by its value
例:轉小寫
[root@centos8 ~]# declare -l name=WEIlan [root@centos8 ~]# echo $name weilan
7.變數間接引用
1)eval命令:shell只能執行一次操作,所以我們可用eval命令執行兩次操作,eval後必須跟上命令
例:
[root@centos8 ~]# n=20; eval echo {1..$n} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
例:創鍵1-10的賬號
[root@centos8 ~]# n=10; for i in `eval echo {1..$n}`; do useradd user$i; done
例:
[root@centos8 ~]# i=a;j=1 [root@centos8 ~]# $i$j=haha bash: a1=haha: command not found... [root@centos8 ~]# eval $i$j=haha [root@centos8 ~]# echo ${a1} haha
2)間接變數引用
如果第一個變數的值是第二個變數的名字,從第一個變數引用第二個變數的值就稱為間接變數引用
方法一
例:
[root@centos8 ~]# ceo=name;name=weilan [root@centos8 ~]# eval echo '$'$ceo weilan
[root@centos8 ~]# eval echo \$$ceo weilan
方法二:
[root@centos8 ~]# eval echo ${!ceo} weilan
範例:批量建立使用者
[root@centos8 data]# vim creat_user.sh #!/bin/bash n=$# [ $n -eq 0 ]&&{ echo "Uage:`basename$0`username..."; exit 2; } for i in `eval echo {1..$n}`; do user=${!i} id $user &> /dev/null && echo $user is exist || { useradd $user; echo $user is created; } done
3)變數引用refernce
範例:
#!/bin/bash ceo=weilan title=ceo declare -n ref=$title [ -R ref ] && echo "reference" echo $ref ceo=wang echo $ref
記錄於2022-3-10-21:46