正則表達式符號
. 任意的一個字符
* 前邊字符重復任意次
(cui)* 前邊單詞重復任意次
X+ 加號前邊字符重復1次以上
X{1,} 表1次
X{1,8} 最少一次最多8次
X{,n} 最多幾次
X?表0次
X{m} 精確匹配多少次
^ 行首(中括號外)
$ 行尾
\< \b 單詞的詞首
\> \b 單詞的詞尾
[wang] w a n g 中括號里面的任意一個字符
[^.] 中括號里面 ^ 表示除了 除了. 的任意字符
a|buy a或buy
(a|b)uy auy或buy
(epr) (epr2) \1 \2 匹配完的結果 第一個 第二個
執行權限
執行腳本: 【hello.sh】
①有執行權限 chmod +x hello.sh
相對路徑 ./hello.sh
②沒有執行權限也想執行
bash hello.sh
cat hello.sh |bsah
③直接執行 hello.sh 即可
echo $PATH --把文件放到任何PATH目錄下即可
[root@localhost date]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost date]#chmod +x hello.sh
[root@localhost date]# mkdir /root/bin
[root@localhost date]# mv hello.sh /root/bin/
[root@localhost date]# hello.sh
[root@localhost date]# hash
執行后腳本文件會 hash到內存里面,一旦將PATH下的文件換個目錄,重新執行hello.sh 將找不到文件;
需要刪除hash文件路徑:hash -d hello.sh ;即可
腳本調試:
檢測腳本中的語法錯誤:bash -n f1.sh -n 只檢測語法
bash -x f1.sh 跟蹤執行邏輯問題
變量的使用
定義變量若值等於命令如:hostname,使用反引號引用。
例:① name=`hostname` ②name=`cat/etc/fstab`
echo $name 數據多的話格式會有問題,所有數據都在一行
echo "$name" 保留格式
變量:字符串、數字
shell里可以直接賦值,無需指定數據類型。
變量名不能使用數字作為開頭。
變量:$ 帶$則是變量名
引用變量需要加 $
echo $PATH
bash中變量的種類:
局部變量:當前session有效
echo $$ 當前進程的進程編號
echo $PPID 當前進程的父進程編號
pstree -p 查進程樹 centos最小安裝不能直接使用該命令,需安裝psmisc
局部變量只在當前bash運行
$SHLVL 查看shell嵌套了幾層
環境變量:全局變量
name=hello
echo $name
export name 向子進程聲明環境變量 or exoport name=hello
export\env 可以查看系統里的環境變量
unset name 刪除變量名釋放內存
env-->export :查看系統里的環境變量
變量的分類
只讀變量-->常量聲明
readonly name =hello 只能使用不能修改,不可unset exit 退出程序常量消失
declare -r =readonly -p 系統自帶常量
() 命令放小括號里,一次性任務,開啟子shell,可以定義一次性變量,結束后不影響環境
{}大括號影響當前shell環境
位置變量
$1 $2 $3 表示 $*為多個參數
執行腳本后邊跟的$1 $2 $3 等
scp 遠程復制文件 scp f1 wang@192.168.8.12:/root/bin ps:非root用戶,目標路徑的所有者為wang用戶
復制當前目錄下的文件,到對方主機wang用戶@對方地址:、對方目錄
將對方主機、用戶、路徑寫入腳本scp.sh,需要傳輸的文件作為變量.
!#/bin/bash
echo "start copy......"
scp $1 root@192.168.8.12:/root/bin
echo "copy is finished"
執行腳本:scp.sh /etc/aaa --$1的位置參數 $* 后邊可以跟多個文件
位置參數$* 跟 $@ 的區別:使用時需要用""引號引起來。
$*:傳遞給腳本的所有參數,全部參數合為一個字符串。
$@:傳遞給腳本的所有參數,每個參數為獨立字符串。
$0:命令本身
$#:傳遞給腳本的參數個數。
ln -s scp.sh link.sh 創建scp.sh 的軟連接為link.sh 執行link.sh $0 顯示為link.sh
使用軟連接做到同一個腳本,不同功能。
例如:
[root@localhost ~]# which pidof
/usr/sbin/pidof
[root@localhost ~]# ll /usr/sbin/pidof
lrwxrwxrwx. 1 root root 18 Nov 13 19:06 /usr/sbin/pidof -> /usr/sbin/killall5
[root@localhost ~]# /usr/sbin/pidof bash --軟連接執行bash 返回的結果
2005 621
[root@localhost ~]# /usr/sbin/killall5 bash --源文件執行bash返回的結果
killall5: only one argument, a signal number, allowed
執行結果不一致也就是$0為不同結果時,可以實現不同效果,不同值可以做不同功能。
算數運算
算數的使用方法
①let z=x+y echo $z ② z =$[x+y] ③z = $((x+y)) ④expr 3 + 4 *expr是個命令
echo $? 值為0是真,值為1是假
& 並且 | 或者
&& 短路 與 【邏輯關系:如果 cmd1 && cmd2 ,cmd1為假,cmd2不需要執行,反之cmd1為真,需要cmd2執行】
|| 短路 或 【邏輯關系:如果cmd1 || cmd2 ,cmd1為真cmd2不需要執行,反之cmd1 為假,需要cmd2執行】
小練習:編寫腳本 /root/bin/sumid.sh 計算/etc/passwd 文件中第十個用戶和第20個用戶的ID之和
#!/bin/bash
a="`head -n10 /etc/passwd | tail -n1 | cut -d: -f3`"
b="`head -n20 /etc/passwd | tail -n1 | cut -d: -f3`"
let c=a+b