1. 程式人生 > >Day04 字符串截取&字符串初值&數組&字符串替換

Day04 字符串截取&字符串初值&數組&字符串替換

ftp user 最短匹配 我想 後退 8.4 結果 通配符 str

一、字符串截取

":"代表截取

1.1 ${var:起始位置:長度}

起始位置從0開始(為0可以省略)
x=13918581996
echo ${x::5}#只取前5位數字
13918

1.2 expr substr "$var" 起始位置 長度

起始位置從1開始
x=13918581996
expr substr "$x" 1 5
13918

1.3 cut -b 起始位置-結束位置

按照順序截取,起始位置從1開始
echo $x|cut -b 1-5
13918

1.3.1 cut -b 位置1,位置2,位置3

echo $x|cut -b 1,2,3,4,5

13918
echo $x|cut -b 5,4,3,2,1
13918

二、路徑分割

2.1 dirname "$var"

截取目錄位置
y=/etc/httpd/conf/httpd.conf
dirname $y
/etc/httpd/conf

2.2 basename "$var"

截取文件位置
y=/etc/httpd/conf/httpd.conf
basename $y
httpd.conf

三、字符串替換

"/"代表替換

3.1 echo ${var/old/new}

只替換第一個匹配結果。即只把最近的一個old替換成new,"/"符號表示替換一個。花括號裏面支持通配符

echo ${x/1/}
3918581996

3.2 echo ${var//old/new}

替換全部匹配結果。即把所有的old替換成new,"//"符號表示全部替換
echo ${x//1/}
39858996

四、字符串掐頭去尾

"#"代表掐頭;"%"代表去尾

4.1 字符串掐頭

4.1.1 從左往右刪(最長匹配刪除)

#代表從左往右刪,##表示最長匹配
我想知道root用戶使用的解釋器是哪個?
n=head -1 /etc/passwd
echo ${n##:} #""匹配所有 ":"符合也一樣會刪除
/bin/bash

4.1.2 從左往右刪(最短匹配刪除)

#代表從左往右刪,最短匹配
我想知道root用戶是否配置了密碼?
n=head -1 /etc/passwd
echo ${n#*:}
x:0:0:root:/root:/bin/bash

4.2 字符串去尾

4.2.1 從右往左刪(最長匹配刪除)

%代表從右往左刪,%%表示最長匹配
我想知道passwd的第一行用戶是誰?
n=head -1 /etc/passwd
echo ${n%%:*}
root

4.2.2 從右往左刪(最短匹配刪除)

%代表從右往左刪,最短匹配
我想把root的用戶的解釋器刪掉
n=head -1 /etc/passwd
echo ${n%:*}
root:x:0:0:root:/root

五、字符串初值判斷

5.1 echo ${var:-value}

若變量var已存在且非Null,則返回 $var的值;否則返回字串“value”
即嘗試顯示$var的值,如果之前有賦值就顯示賦值內容;如果變量不存在或未賦值,則顯示:-後面的value
echo ${pass:-123456}
123456 #此時顯示的是value
pass=8888
echo ${pass:-123456}
8888#現在顯示的是給$pass賦的值

六、數組

6.1 定義

一個變量可以存多個值,值默認為文本,用在數學運算中時,自動將其轉換為整數。數組最大的好處是如果要存的值數量很多,可以在一行裏面定義完成
6.2數組賦值格式

6.2.1 數組名=(值1 值2 值3 ...)

整體賦值,下標從0開始
SVRS=(www ftp mail game)
echo ${SVRS[]}
www ftp mail game
還可以對值進行修改
SVRS[3]=bbs
echo ${SVRS[
]}
www ftp mail bbs

6.2.2 數組名[下標]=值

為單個元素賦值,下標從0開始
FQDN[0]=www.tmooc.cn
FQDN[1]=www.baidu.com

6.3 輸出數組元素

6.3.1 ${數組名[下標]}

輸出單個數組元素

6.3.2 ${數組名[@]}

獲取所有數組元素

6.3.3 ${#數組名[@]}

獲取所有數組元素個數

6.3.4 ${數組名[@]:起始下標:元素個數}

獲取連續的多個數組元素

6.3.5 ${#數組名[下標]}

獲取某個元素的長度

6.3.6 ${數組名[下標]:起始下標:字符數}

截取單個數組元素的一部分(包含起始下標字符本身)

七、expect預期交互

7.1 簡介

基於TCL語言編寫的自動交互式程序,可以用在Shell腳本中,為交互式過程自動輸送預先準備的文本或者指令,而無需人工幹預。
觸發條件是預期會出現的特征提示文本,只要出現就給命令,只要出現就發文本等等

7.2 格式

#!/usr/bin/expect #指定腳本解釋器
set host #定義變量
set timeout #定義超時時間,單位為秒
spawn #創建交互式進程殼
expect {
"特征文本" {send "命令"}
} #根據特征文本執行相應命令
exp_continue #前面的exepct條件滿足後,繼續執行後面的語句
interact #expect腳本執行完畢後不退出,控制權交給expect控制臺

7.3 腳本示例

自動遠程登錄服務器執行命令後退出
bash腳本:
#!/bin/bash
host=192.168.4.7
user=root
pass="123456"
expect << EOF
spawn ssh $user@$host
expect "password" {set timeout 180;send "$pass\r"}
expect "#" {send "cat /etc/redhat-release\r"}
expect "#" {send "ls"}
EOF
interact
expect腳本:
#!/usr/bin/expect
set host 192.168.4.7
set user root
set pass "123456"
spawn ssh $user@$host
expect {
"yes" {send "yes\r" ;exp_continue}
"password" {set timeout 180;send "$pass\r";exp_continue}
"[$user\@" {send "cat /etc/redhat-release\r"}
"#" {send "ls"}
}
interact

7.4 存在問題

7.4.1 出現yes/no的情況不一定

因為有些電腦之前保存過密鑰,有些沒保存過

7.4.2 ssh連接比較慢導致expect腳本超時執行失敗

一種辦法是修改sshd的配置文件
另外一種辦法是修改expect的超時計時器時間

7.4.3 在EOF段裏面最後一條命令不會執行

Day04 字符串截取&字符串初值&數組&字符串替換