變數的分類
本地變數: 只對本地有效,對子shell無效 // /bin/bash 開啟子shell
環境變數: 對本地和子shell都有效
export A=3
或
A
export A
export //查看當前系統內容變數
## exprot部分顯示結果 declare -x DISPLAYE=“” //指定輸出顯示器 declare -x HISTSIZE="1000" //history能儲存的命令條數 declare -x HOME="/root" //目前使用者家目錄 declare -x HOSTNAME="server45.example.com" //當前主機名稱 declare -x LANG="zh_CN.gbk" //所使用的語言 declare -x LOGNAME="root" //登入使用者的名稱 declare -x OLDPWD="/tmp" //上一個路徑 declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" declare -x PWD="/tmp/scripts" //當前路徑
printenv //類似export
env //顯示當前環境變數
特殊變數:$?
ehco $? //上一個命令是否執行成功 0代表成功 1-255失敗
[root@server45 ~]# llsss-bash: llsss: command not found[root@server45 ~]# echo $?127
位置參數變數: 需要使用者通過命令引用,很有用的變數
$1,$2,$3 超過10時建議加{} ${11}
算數運算:
$[] //echo “$[$A+$B]”
$(( )) //echo "(($A+$B))"
#!/bin/bash#echo "$1+$2 is $[$1+$2]"echo "$1-$2 is $[$1-$2]"echo "$1*$2 is $[$1*$2]"echo "$1/$2 is $[$1/$2]"
寫一個指令碼,完成以下功能:
1、傳遞兩個整數給指令碼,讓指令碼分別計算並顯示這兩個整數的和、差、積、商。
\ //避免展開變數 echo "Your Salary : \$1" //該命令並不會顯示$1的值,而是顯示$1
[root@server45 ~]# echo "Your Salary : \$1" Your Salary : $1
BASH的命令別名
alias
例如將cls設定為lear方便使用
alias cls=clear
unlias cls
alias cdnet='cd /etc/sysconfig/network' //有空格用''
全域變數:/etc/profile, /etc/profild.d/*, /etc/bashrc 對所有使用者都作用
/etc/bashrc //可設定alias對所有使用者有效
/etc/profild.d/* //將profile分成片便於管理
/etc/profild //設定全域有效變數,永久有效
export DFSF=dfsf //需登出才生效
source /etc/profile //重讀profile,可立刻生效,不建議
局部變數: ~/.bash_profile, ~/.bashrc ~/.bash_logout 只對目前使用者有效
profile類:
1.設定環境變數
2.運行使用者登入時要執行的一些命令
bashrc類
1.設定別名
2.設定本地變數
-------------------------------------------------------------------------------------------------
shell分類:
1.互動式登入式shell
使用者登入進去輸入命令
過程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> /etc/bashrc
2.非登入式shell
指令碼執行過程中,系統自動運行,不需要使用者登入輸入命令
過程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/×
——————————————————————————————————————————————————
輸入/輸出重新導向 ,管道 輸出資料流
I/O重新導向分為:
標準輸入 :/dev/stdin, 0, KEYBOARD,< //平常可以不輸入
標準輸出 :/dev/stdout, 1, MONITOR, > //命令正常執行 cat > /tmp/ls1.out
錯誤輸出 :/dev/stderr, 2, MONITOR, 2> //命令錯誤執行 cat 2> /tmp/ls2.out
//lessss &> /tmp/ls3.out //&> 合并>和2>
例如
ls /var >> /tmp/var.out 2>> /tmp/var.err //正確的資訊存在var.out,錯誤的在var.err
其他的重新導向
> //覆蓋輸出重新導向
>> //追加輸出重新導向
set -C //開啟避面覆蓋重新導向
set +C //關閉
>| //強制覆蓋
自訂輸出重新導向
exec 3> /tmp/myout.out //實現多次重新導向到一個檔案,避免多次開啟關閉一個檔案,提升指令碼執行效率
>> //追加
< //讀入
ls /var >&3
exec 3>&- //關閉檔案
寫一個指令碼:
1、設定變數FILE的值為/etc/passwd
2、使用迴圈讀取檔案/etc/passwd的第2,4,6,10,13,15行,並顯示其內容;(提示:LINE=`head -2 /etc/passwd | tail -1`可以取得第2行)
3、把這些行儲存至/tmp/mypasswd檔案中
#!/bin/bash#FILE=/etc/passwdexec 3>> /tmp/mypasswd //開啟for N in 2 4 6 10 13 15 ; do LINE=`head -$N $FILE | tail -1` echo $LINE echo $LINE >&1doneexec 3>&- //關閉 unset FILE LINE
————————————————————————————————————————————————————————————————————————
管道 | : 把第一個命令的輸出送到第二個命令處理
echo "123456" | passwd --stdin rehat //這個命令將123456交給passwd來處理,--stdin參數會使123456立刻生效成為使用者redhat的密碼
ls /etc | tee /tmp/ls.out | less //tee可以把輸出資料流儲存到指定檔案 並交給下一個命令處理
多個命令的輸出都需要儲存至同一個檔案
command >> a.out
command >> a.out
/dev/null null 指空檔案,任何被放到Null的資料都被刪除,在linux裡是一個常用的命令,可以輕鬆去除輸出結果,不過要小心使用
比如: ls /var/ttt &> /dev/null //無論結果如何,都輸出到null裡,不會顯示結果
——————————————————————————————————————————————————
程式執行流
分類:
順序執行
選擇分支
迴圈執行 //這一次只學習for迴圈
for I in LIST ; do //LIST是這個迴圈的條件,也叫做列表,可以是字元,數字,運算式
statement1
statement2
done
列表分類:
簡單列表: 1 2 3 4
複雜列表: This is TOM`s cat
命令 : `ls /var`
萬用字元 : for I in /var/*
例如:
for LINE in `cat /etc/passwd`: dao
而外說明
IFS=$'\n' //for 迴圈只是別分行符號
寫一個指令碼:添加10個使用者user1-10
#!/bin/bash# for I in 1 2 3 4 5 6 7 8 9 10 ;do //或者for I in `seq 1 10` usradd user$I echo user$I | passwd --stdin user$I done## seq 1 10 //代表 1~10 ## 也可以使用{1..10}
文本處理類命令cut -d: -d""
//指定分隔字元:或"" -f //指定第幾段
[root@server45 scripts]# tail -1 /etc/passwd | cut -d: -f6 /home/dean
grep與Regex
grep: 全面搜尋Regex並列印出來
grep,egrep,fgrep
grep [options] "PATTERN“ file... //grep的用法
-i //不區分大小寫
-v //顯示沒有匹配到模式的行
-n //顯示匹配的行在原文中所處的行號
-An //顯示後n行
-Bn //顯示前n行
-Cn //上下文,顯示上線n行
--color //把匹配的高亮顯示
模式
Regex,元字元 re
^ //錨定行首 ^love love必須在行首
$ //錨定行尾
. //用於匹配任意單個字元
* //root* *前的t可以出現0次或任意次
?
[] //匹配一組字元中任意一個
\
\< //詞首定位器
\> //詞尾定位器
x\(m)\ //x精確出現m次
x\(m,)\ //x至少出現m次
x\(m,n) //x至少出現m次,最多m次
\(...)\ //任意長度的任一字元
grep -E = egrep
+ 相當於\{1,\}
? 相當於\{0,1}\
| 或
’love|hate‘ e或h誰出現都行
grep練習
1、顯示/proc/meminfo檔案中以不區分大小的s開頭的行;
grep -i s /proc/meninfo //使用-i 不區分大小寫2、顯示/etc/passwd中以nologin結尾的行; grep nologin$ /etc/passwd //$符號錨定結尾3、顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字元,而後又跟了任一字元的行; grep --color ^#[[:sapce:]]\{1,}\ /etc/inittab //^符號錨定開頭,[[:space:]].*用來匹配多個連續空白字元4、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行; grep :[0-9]: /etc/inittab 5、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行; grep ^[[:space:]]\{1,\}.*" /boot/grub/grub.conf grep -E --color "^[[:space:]]{1,}.*" /boot/grub/grub.conf //egrep解法,注意與grep區別{} 6、顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行; grep "^\([0-9]\).*\1" /etc/inittab //使用\(\) \1 來做前後匹配 注意使用“” .*用以匹配任意個連續字元 7、ifconfig命令可以顯示當前主機的IP地址相關的資訊等,如果使用grep等文本處理命令取出原生各IP地址,要求不包括127.0.0.1; ifcofig | grep "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d "" f1 //grep與cut的混合使用8、顯示/etc/sysconfig/network-scripts/ifcfg-eth0檔案中的包含了類似IP地址點分十進位數字格式的行; grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0
grep "[0-9]\{1,3\}\."\{3\}\.[0-9]\{1,3\} /etc/sysconfig/network-scripts/ifcfg-eth0 //注意egrep和grep的區別
————————————————————————————————————————————————————————————————————————
短路操作符
&& //與運算,當你需要判斷使用兩條命令是,使用&&: 如果第一個運行結果錯誤,那麼繼續運行第二個命令,結果為第二個命令,
如果第一個命令正確,那麼將不會在運行第二個命令
1 && ? = ?
0 && ? = 0
|| //或運算,使用|| : 如果第一個命令結果錯誤,那麼結果直接為第一個命令,
如果第一個命令結果正確,那麼結果為第二個命令
1 || ? = 1
0 || ? = ?
## 結合/dev/null的使用,將會發揮很重要的效果
例如 cat /tmp/aaa >> /tmp bbb || cat /tmp/aaa &>/dev/null
##這個命令,如果aaa不存在的話,將會直接將結果輸出到/dev/null下,而不會佔用系統資源輸出錯誤資訊
寫一個指令碼:
1、添加10個使用者user1到user10,但要求只有使用者不存在的情況下才能添加;
#!/bin/bash#for I in {1..10} ; do grep user$I /etc/passwd &> /dev/null || useradd user$I //如果使用者存在,直接輸出到/dev/null,負責增加使用者user$Idoneunset I
程式設計語言:
指令碼語言:bash,perl(語言學家),python(靈活,簡潔),ruby,php
以來源程式的方式存在,執行前不需要編譯,而是靠一個解譯器執行
維護簡便
執行效率差
編譯型語言:
編輯-->編譯-->連結-->運行
指令碼:命令的堆砌
#!/bin/bash //第一行標準 shebang
#
nano myscript.sh
chmod +x myscript.sh
./myscript.sh //執行指令碼