shell  基本应用及例子

一、

    $# 脚本的参数个数

    $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

    $$ 脚本运行的当前进程ID号

    $! 后台运行的最后一个进程的进程ID号  

    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数

    $? 显示最后命令的退出状态。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,则为真

 

四、文件比较运算符  

 

-a filename  如果 filename 存在,则为真                   [ -e $HOME/.bashrc ]

-e filename  (同上)


-d filename  如果 filename 存在,并且为目录,则为真       [ -d /home/snail ] 

-f filename  如果 filename 存在,并且为常规文件,则为真   [ -f /dev/ttyS0 ]


-r filename  如果 filename 存在,并且可读,则为真         [ -r /etc/passwd ]

-u filename  如果 filename 存在,并且为set-user-id,为真  [ -f $HOME/ak47 ]       

-w filename  如果 filename 存在,并且可写,则为真         [ -w /var/log/mail ] 

-x filename  如果 filename 存在,并且可执行,则为真       [ -x ./start.sh ] 

 

五、几个常用语法

 

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