shell腳本基礎之變量使用


正則表達式符號
. 任意的一個字符
* 前邊字符重復任意次
(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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM