1.字符串切片
①${#var}:
返回字符串變量var的長(zhǎng)度
②${var:offset}:
返回字符串變量var中從第offset個(gè)字符后(不包括第offset個(gè)字符)的字符開(kāi)始,到最后的部分,offset的取值在0到 ${#var}-1 之間(bash4.2后这敬,允許為負(fù)值)
③${var:offset:number}:
返回字符串變量var中從第offset個(gè)字符后(不包括第offset個(gè)字符)的字符開(kāi)始鸳址,長(zhǎng)度為number的部分
④${var: -length}:
取字符串的最右側(cè)幾個(gè)字符
注意:冒號(hào)后必須有一空白字符
⑤${var:offset:-length}:
從最左側(cè)跳過(guò)offset字符餐弱,一直向右取到距離最右側(cè)lengh個(gè)字符之前的內(nèi)容
⑥${var: -length:-offset}:
先從最右側(cè)向左取到length個(gè)字符開(kāi)始窟赏,再向右取到距離最右側(cè)offset個(gè)字符之間的內(nèi)容
注意:-length前空格
2.基于模式取子串
①${var#*word}:其中word可以是指定的任意字符
功能:自左而右僧家,查找var變量所存儲(chǔ)的字符串中瞄摊,第一次出現(xiàn)的word, 刪除字符串開(kāi)頭至第一次出現(xiàn)word字符之間的所有字符
②${var##*word}:同上勋又,貪婪模式
不同的是,刪除的是字符串開(kāi)頭至最后一次由word指定的字符之間的所有內(nèi)容
③${var%word*}:其中word可以是指定的任意字符换帜;
功能:自右而左楔壤,查找var變量所存儲(chǔ)的字符串中,第一次出現(xiàn)的word, 刪除字符串最后一個(gè)字符向左至第一次出現(xiàn)word字符之間的所有字符惯驼;
④${var%%word*}:
同上蹲嚣,只不過(guò)刪除字符串最右側(cè)的字符向左至最后一次出現(xiàn)word字符之間的所有字符递瑰;
eg:
3. 查找替換
①${var/pattern/substr}:
查找var所表示的字符串中,第一次被pattern所匹配到的字符串端铛,以substr替換之
②${var//pattern/substr}:
查找var所表示的字符串中泣矛,所有能被pattern所匹配到的字符串,以substr替換之
③${var/#pattern/substr}:
查找var所表示的字符串中禾蚕,行首被pattern所匹配到的字符串您朽,以substr替換之
④${var/%pattern/substr}:
查找var所表示的字符串中,行尾被pattern所匹配到的字符串换淆,以substr替換之
4.查找并刪除
①${var/pattern}
刪除var所表示的字符串中第一次被pattern所匹配到的字符串
②${var//pattern}
刪除var所表示的字符串中所有被pattern所匹配到的字符串
③${var/#pattern}
刪除var所表示的字符串中所有以pattern為行首所匹配到的字符串
④${var/%pattern}
刪除var所表示的字符串中所有以pattern為行尾所匹配到了的字符串
![Upload Paste_Image.png failed. Please try again.]
5.字符大小寫(xiě)轉(zhuǎn)換
①${var^^}:把var中的所有小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)
②${var,,}:把var中的所有大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)
6.高級(jí)變量用法-有類型變量
Shell變量一般是無(wú)類型的哗总,但是bash Shell提供了declare和typeset兩個(gè)命令用于指定變量的類型,兩個(gè)命令是等價(jià)
(1)declare [選項(xiàng)] 變量名
-r 聲明或顯示只讀變量
-i 將變量定義為整型數(shù)
-a 將變量定義為數(shù)組
-A 將變量定義為關(guān)聯(lián)數(shù)組
-f 顯示已定義的所有函數(shù)名及其內(nèi)容
-F 僅顯示已定義的所有函數(shù)名
-x 聲明或顯示環(huán)境變量和函數(shù)
-l 聲明變量為小寫(xiě)字母 declare –l var=UPPER
-u 聲明變量為大寫(xiě)字母 declare –u var=lower
(2)eval命令
eval命令將會(huì)首先掃描命令行進(jìn)行所有的置換倍试,然后再執(zhí)行該命令讯屈。該命令適用于那些一次掃描無(wú)法實(shí)現(xiàn)其功能的變量.該命令對(duì)變量進(jìn)行兩次掃描
eg:
[root@server ~]# CMD=whoami
[root@server ~]# echo $CMD
whoami
[root@server ~]# eval $CMD
root
[root@server ~]# n=10
[root@server ~]# echo {0..$n}
{0..10}
[root@server ~]# eval echo {0..$n}
0 1 2 3 4 5 6 7 8 9 10
7.間接變量引用
(1)如果第一個(gè)變量的值是第二個(gè)變量的名字,從第一個(gè)變量引用第二個(gè)變量的值就稱為間接變量引用
(2)variable1的值是variable2县习,而variable2又是變量名涮母,
variable2的值為value,間接變量引用是指通過(guò)variable1獲得變量值value的行為
variable1=variable2
variable2=value
(3)bash Shell提供了兩種格式實(shí)現(xiàn)間接變量引用
eval tempvar=$$variable1
tempvar=${!variable1}
eg:
[root@server ~]# N=NAME
[root@server ~]# NAME=yin
[root@server ~]# N1=${!N}
[root@server ~]# echo $N1
yin
[root@server ~]# eval N2=\$$N
[root@server ~]# echo $N2
yin
8.mktemp命令:創(chuàng)建并顯示臨時(shí)文件躁愿,可避免沖突
mktemp [OPTION]... [TEMPLATE]
TEMPLATE: filename.XXX
X至少要出現(xiàn)三個(gè)
OPTION:
-d: 創(chuàng)建臨時(shí)目錄
-p DIR或--tmpdir=DIR:指明臨時(shí)文件所存放目錄位置
eg:
# mktemp /tmp/test.XXX
# tmpdir=`mktemp –d /tmp/testdir.XXX`
# mktemp --tmpdir=/testdir test.XXXXXX
9. install安裝復(fù)制文件
install [OPTION]... [-T] SOURCE DEST 單文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...創(chuàng)建空目錄
? 選項(xiàng):
-m MODE叛本,默認(rèn)755
-o OWNERsuoyouzhe
-g GROUP所屬組
eg:
# install -m 700 -o wang -g admins srcfile(源文件) desfile(目標(biāo)文件)
# install –m 700 –d /testdir/installdir
10.expect
(1)介紹
expect 是由Don Libes基于Tcl( Tool Command Language)語(yǔ)言開(kāi)發(fā),主要應(yīng)用于自動(dòng)化交互式操作的場(chǎng)景彤钟,借助Expect處理交互的命令来候,可以將交互過(guò)程如:ssh登錄,ftp登錄等寫(xiě)在一個(gè)腳本上逸雹,使之自動(dòng)化完成营搅。尤其適用于需要對(duì)多臺(tái)服務(wù)器執(zhí)行相同操作的環(huán)境中,可以大大提高系統(tǒng)管理人員的工作效率
(2)expect命令
expect [選項(xiàng)] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
選項(xiàng)
-c:從命令行執(zhí)行expect腳本梆砸,默認(rèn)expect是交互地執(zhí)行的
示例:expect -c 'expect "\n" {send "pressed enter\n"}
-d:可以輸出輸出調(diào)試信息
示例:expect -d ssh.exp
(3)expect中相關(guān)命令
spawn:?jiǎn)?dòng)新的進(jìn)程
send:用于向進(jìn)程發(fā)送字符串
expect:從進(jìn)程接收字符串
interact:允許用戶交互
exp_continue 匹配多個(gè)字符串在執(zhí)行動(dòng)作后加此命令
(4)expect最常用的語(yǔ)法(tcl語(yǔ)言:模式-動(dòng)作)
①單一分支模式語(yǔ)法:
expect “hi” {send “You said hi\n"}
匹配到hi后转质,會(huì)輸出“you said hi”,并換行
②多分支模式語(yǔ)法:
expect "hi" { send "You said hi\n" }
"hehe" { send “Hehe yourself\n" }
"bye" { send “Good bye\n" }
③匹配hi,hello,bye任意字符串時(shí)帖世,執(zhí)行相應(yīng)輸出休蟹。等同如下:
expect {
"hi" { send "You said hi\n"}
"hehe" { send "Hehe yourself\n"}
"bye" { send “Good bye\n"}
}
eg:
cat ssh1.exp
#!/usr/bin/expect
spawn ssh 192.168.8.100
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send “magedu\n" }
}
interact
#expect eof
示例:變量
cat ssh2.exp
#!/usr/bin/expect
set ip 192.168.8.100
set user root
set password magedu
set timeout 10
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
interact
示例:位置參數(shù)
vim ssh3.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
interact
#./ssh3.exp 192.168.8.100 root magedu
示例:執(zhí)行多個(gè)命令
cat ssh4.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set timeout 10
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect "]#" { send "useradd haha\n" }
expect "]#" { send "echo magedu |passwd --stdin haha\n" }
send "exit\n"
expect eof
#./ssh4.exp 192.168.8.100 root magedu
示例:shell腳本調(diào)用expect
vim ssh5.sh
#!/bin/bash
ip=$1
user=$2
password=$3
expect <<EOF
set timeout 10
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect "]#" { send "useradd hehe\n" }
expect "]#" { send "echo magedu |passwd --stdin hehe\n" }
expect "]#" { send "exit\n" }
expect eof
EOF
#./ssh5.sh 192.168.8.100 root magedu