Shell一些例子


Shell一些例子
 
bash不分区字符串和数值,如需计算数值可用$((.....)),但得到的结果不是数值.
函数内接受不了外面的变量传值.  www.2cto.com  
正则表达式在匹配时是偷懒和正确匹配的和资源开销的一种权衡.
$# 脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号  www.2cto.com  
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$0 脚本名称
$1..$9 第N个参数
函数基本使用:
function functname{ 
      shell commands 
or 
functname(){ 
     shell commands 
bash的算术运算比较运算符\字符串比较运算符\文件比较运算符:
煮酒品茶:这个是比较全的.查一般的,请点这里.
  1、算术运算比较运算符(bash自身不能比较浮点数)
 
-eq 等于          [ $num1 -eq $num2 ] 
-ne 不等于       [ 100   -ne $num1 ] 
-lt 小于          [ 100   -lt `expr $num1 + $num2` ] 
-le 小于或等于   [ 100   -le `expr $num1 \* $num2` ] 
-gt 大于          [ 100   -gt `expr $num1 / $num2` ] 
-ge 大于或等于   [ 100   -ge `expr $num1 % $num2` ] 
 
2、字符串比较运算符   
 
-z string  如果 string 长度为零,则为真 [ -z "`ps aux | grep mysql`" ] 
-n string  如果 string 长度非零,则为真  [ -n "$string" ] 
              【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2  如果 string1 与 string2 不同,则为真  [ "$str1" != "Snail" ] 
string1 == string2  如果 string1 与 string2 相同,则为真 [ "$str1" == "$str2" ]
                    (上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1  string2   如果 string1 按字典顺序比较大于 string2,则为真
 
3、文件比较运算符  
 
-a filename  如果 filename 存在,则为真                   [ -e $HOME/.bashrc ]
-e filename  (同上)
-b filename  如果 filename 存在,并且是块文件,则为真    [ -e /dev/loop0 ]
-c filename  如果 filename 存在,并且是字符文件,则为真   [ -e /dev/ttyS0 ]
-d filename  如果 filename 存在,并且为目录,则为真       [ -d /home/snail ] 
-f filename  如果 filename 存在,并且为常规文件,则为真   [ -f /dev/ttyS0 ]
-g filename  如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename  如果 filename 存在,并且为符号连接,则为真   [ -h /bin/vi ]
-L filename  (同上)
-k filename  如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename  如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename  如果 filename 存在,并且可读,则为真         [ -r /etc/passwd ]
-s filename  如果 filename 存在,并且大小不为零,为真    [ -s ./none-zero ]
-u filename  如果 filename 存在,并且为set-user-id,为真  [ -f $HOME/ak47 ]       
-w filename  如果 filename 存在,并且可写,则为真         [ -w /var/log/mail ] 
-x filename  如果 filename 存在,并且可执行,则为真       [ -x ./start.sh ] 
 
下面这些不常用的:
 
-t fd        如果文件描述符被打开并指向一个终端,则为真   [ -t /proc/1/fd/10 ] 
              【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename  如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename  如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename  如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename  如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname   如果 shell 选项 optname 被开启,则为真 
              【提示】使用 set -o 来查看
file1 -nt file2  如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2  如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2  如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真 
              【提示】查看文件的索引节点可以用 ls -i 选项
元字符
描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^
匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
*
匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n}
n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}
n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m}
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?
当 该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而 默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
.点
匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。
(pattern)
匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
(?:pattern)
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern)
正 向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从 包含预查的字符之后开始。
(?!pattern)
正 向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?<=pattern)
反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?
反向否定预查,与正向否定预查类似,只是方向相反。例如“(?
x|y
匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz]
字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B
匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx
匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d
匹配一个数字字符。等价于[0-9]。
\D
匹配一个非数字字符。等价于[^0-9]。
\f
匹配一个换页符。等价于\x0c和\cL。
\n
匹配一个换行符。等价于\x0a和\cJ。
\r
匹配一个回车符。等价于\x0d和\cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于\x09和\cI。
\v
匹配一个垂直制表符。等价于\x0b和\cK。
\w
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn
匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。
\num
匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm
标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml
如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un
匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。
 
 
while基本用法:
while [ condition ] 
do 
   command1 
   command2 
   command3 
done 
#!/bin/bash 
sudo find  -type f -name '*.log' |while read mvname 
do 
mv $mvname ${mvname/.log/.LOG} 
done 
#!/bin/bash 
#查找当前目录下*.log并把值赋于mvname参与循环. 
sudo find  -type f -name '*.log' |while read mvname 
do 
#移动,并把结尾的.log替换成.LOG /*Ubuntu 下好像不行*/
mv $mvname ${mvname/.log/.LOG} 
done 
例:上面是一例批量替换文件名的bash
简单PD文件类型,可按照上面文件类形表来写:
#!/bin/bash 
if [ $# -ne 0 ]; then 
 
        if [ -d $1 ]; then 
        echo $1 is a Mulu 
        else 
        echo $0 D1 D2 
        fi 
 
        if [ -d $2 ]; then 
        echo $2 is a mulu 
        else 
        echo $0 D1 D2 
        fi 
fi 
 
#!/bin/bash 
#如果个数不为空的话 
if [ $# -ne 0 ]; then  
        #如果$1第一个参数是目录的话 
        if [ -d $1 ]; then 
        echo $1 is a Mulu 
        else 
        echo $0 D1 D2 
        fi 
 
        if [ -d $2 ]; then 
        echo $2 is a mulu 
        else 
        echo $0 D1 D2 
        fi 
fi 
程序只是例子,中间有很多BUG,例如如果有三个参数?
使之变成函数来表达:
#!/bin/bash 
set -x 
isd1(){ 
        echo $0 D1 D2  
 
if [ $# -eq 2 ]; then 
 
        if [ -d $1 ]; then 
        echo $1 is a Mulu 
        fi 
 
        if [ -d $2 ]; then 
        echo $2 is a mulu 
        fi 
else 
        isd1 
fi 
计算数值变化:
cwtea@CN:/bash$ cat nubmer.sh  
#!/bin/bash 
a=1 
b=2 
echo $a+$b 
echo $(($a+$b)) 
 
cwtea@CN:/bash$ sudo sh nubmer.sh  
1+2 
 
nagios监控LVS脚本:
煮酒品茶:ly_cyz应该也是混51CTO的,明天问下他,$(())里是不是有些多余?没联系上自己改下脚本再尝试一下.
#!/bin/bash  
#Author: ly_cyz  
ACT_COUNT=0  
Inactive_count=0  
stat1=`sudo ipvsadm | grep http | grep Masq|wc -l`  
if [ $stat1 -ne 0 ];then  
for NUM in `sudo ipvsadm | grep http | grep Masq | awk '{print $5}'`  
do  
ACT_COUNT=$(($ACT_COUNT+ $NUM))  
done  
 
for NUM in `sudo ipvsadm | grep http | grep Masq | awk '{print $6}'`  
do  
Inactive_count=$(($Inactive_count+ $NUM))  
done  
else  
echo "LVS CRITICAL, "LVS is Down""  
exit 2  
fi  
 
if [ $ACT_COUNT == 0 ];then  
echo "LVS ok, "0 active connection""  
exit 1  
else  
echo "LVS OK - LVS is running (conn: $ACT_COUNT active, $Inactive_count inactive)|active=$ACT_COUNT;69999;99999;0; inactive=$Inactive_count;69999;99999;0;"  
fi 
 编辑后:
 
#!/bin/bash  
#Author: ly_cyz cwtea v2.0  
#去除多一个管道,这个你懂得。减少两个赋值。 
stat1=`sudo ipvsadm | grep http |wc -l`  
 
if [ $stat1 -ne 0 ];then 
        for NUM in `sudo ipvsadm | grep http  | awk '{print $5}'` 
                do 
#取消其数值运算。 
                ACT_COUNT=$NUM 
        done 
 
        for NUM in `sudo ipvsadm | grep http  | awk '{print $6}'` 
                do 
                Inactive_count=$NUM 
        done 
 
else 
        echo "LVS CRITICAL, "LVS is Down""  
        exit 2 
fi 
 
if [ $ACT_COUNT -eq 0 ];then 
        echo "LVS ok, "0 active connection""  
        exit 1 
else 
echo "LVS OK - LVS is running (conn: $ACT_COUNT active, $Inactive_count inactive)|active=$ACT_COUNT;69999;99999;0; inactive=$Inactive_count;69999;99999;0;"  
fi 
 

相关内容

    暂无相关文章