1. 程式人生 > 其它 >shell指令碼程式設計進階字串切片和高階變數

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