当前位置: > shell编程 >

Shell脚本编程基础

时间:2014-04-29 01:49来源:www.it.net.cn 作者:IT网
Shell简介

Shell简单的说就是命令解析器,将用户输入的指令转换为相应的机器能够执行的程序。

Shell脚本是一个包含一系列命令序列的文本文件(批处理)。当运行这个脚本文件时,文件中包含的命令序列将得到执行。

HelloWorld

Shell脚本的第一行必须是如下格式:  #!/bin/bash

    符号#!用来指定该脚本文件的解析程序。例中使用bash,也可以使用其他shell。如#!/bin/sh。

    当编辑好脚本后,必须使其具有可执行属性。 chmod +x filename

Shell脚本hello.sh

view plaincopy to clipboardprint?
#!/bin/bash 
echo "hello world!"
mkdir ./helloworld
#!/bin/bash
echo "hello world!"
mkdir ./helloworld

Shell中的变量

在Shell编程中,所有的变量都由字符串组成,并不需要预先对变量声明。

Shell脚本s1.sh

view plaincopy to clipboardprint?
#!/bin/sh 
#号后面是注释 
#set variable a 
a="hello"
#print a 
echo "A is: $a"
#!/bin/sh
#号后面是注释
#set variable a
a="hello"
#print a
echo "A is: $a"

命令行参数传递

  $#:传入脚本的命令行参数个数

  $*:所有的命令行参数,各参数值之间留有空格

  $0:命令本身(shell文件名)

  $1:第一个命令行参数

  $2:第二个命令行参数

shell脚本s2.sh

view plaincopy to clipboardprint?
#!/bin/sh 
echo "numer of vars:"$# 
echo "values of vars:"$* 
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4
#!/bin/sh
echo "numer of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4

运行 ./s2.sh a b c d

输出结果:

numer of vars:4
values of vars:a b c d
value of var1:a
value of var2:b

value of var3:c

value of var4:d

Shell中的局部变量

shell脚本s3.sh

view plaincopy to clipboardprint?
#!/bin/bash 
hello="var1"
echo $hello 
function funcl 

    local hello="var2"
    echo $hello  

funcl 
echo $hello
#!/bin/bash
hello="var1"
echo $hello
function funcl
{
    local hello="var2"
    echo $hello
}
funcl
echo $hello

在变量首次被赋值时加上local关键字可以声明一个局部变量

注意:(1)变量赋值时,“=”左右两边都不能有空格

         (2)BASH中的语句结尾不需要分号

Shell中的控制结构

if语句

if[expression]

then

    #code block

if

if[expression]

then

    #code block

else

    #code block

fi

比较运算符

比较操作 整数操作 字符串操作 比较操作 整数操作 字符串操作
相同 -eq = 大于或等于 -ge 
不同 -ne != 小于或等于 -le 
大于 -gt > 为空 -z 
小于 -lt < 不为空 -n 


使用实例:

  比较整数a是否大于整数b: if[ $a -gt $b ]        判断字符串a是否为空: if[ -z $a ]

注意:

(1)在"["和"]"符号的左右都留有空格    (2)"="左右都有空格

shell脚本s4.sh

view plaincopy to clipboardprint?
#!/bin/bash 
a=$1
b=$2
if [ -z $a ] || [ -z $b ] 
then 
    echo "please enter 2 no"
    exit 1
fi 
if [ $a -eq $b ] ; then 
    echo "number a = number b"
else if [ $a -gt $b ] 
    then 
        echo "number a>number b"
    elif [ $a -lt $b ] 
        then 
            echo "number a<number b"
    fi 
fi
#!/bin/bash
a=$1
b=$2
if [ -z $a ] || [ -z $b ]
then
    echo "please enter 2 no"
    exit 1
fi
if [ $a -eq $b ] ; then
    echo "number a = number b"
else if [ $a -gt $b ]
    then
        echo "number a>number b"
    elif [ $a -lt $b ]
        then
            echo "number a<number b"
    fi
fi

判断

-e 文件已经存在    -f 文件是普通文件    -s 文件大小不为零 -d 文件是一个目录

-r 文件对当前用户可以读取    -w 文件对当前用户可以写入    -x 文件对当前用户可以执行

shell脚本s5.sh

view plaincopy to clipboardprint?
#!/bin/sh  
folder=/home  
[ -r "$folder" ] && echo "Can read $folder"  
[ -f "$folder" ] || echo "this is not file" 
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"

shell脚本s6.sh

view plaincopy to clipboardprint?
#!/bin/bash 
DIR=$1   
#if  the string empty 
if [ "$DIR" = " " ]  
then 
    echo "usage: `basename $0` directory to create" >&2
    exit 1
fi 
echo "dir" $DIR 
if [ -d $DIR ] 
then 
    echo "The directory already exist"
    exit 0
else
    echo "The directory does exist"
    echo -n "Create is now? [Y/N]:"
    read create 
    if [ "$create" = "y" ] || [ "$create" = "Y" ] 
    then 
        echo "creating now"
    if [ mkdir $DIR ] 
        DIR=" "
    fi 
         
    if [ "$DIR" = " " ] 
        then 
        echo "create directory sucess"
        else
            echo "create directory error"
        fi 
    elif [ "$create" = "n" ] || [ "$create" = "N" ] 
    then 
            echo "does not create directory"
            exit 0
    else
        echo "Errors order"
        exit 1
    fi 
fi
#!/bin/bash
DIR=$1
#if  the string empty
if [ "$DIR" = " " ]
then
    echo "usage: `basename $0` directory to create" >&2
    exit 1
fi
echo "dir" $DIR
if [ -d $DIR ]
then
    echo "The directory already exist"
    exit 0
else
    echo "The directory does exist"
    echo -n "Create is now? [Y/N]:"
    read create
    if [ "$create" = "y" ] || [ "$create" = "Y" ]
    then
        echo "creating now"
if [ mkdir $DIR ]
   DIR=" "
fi
      
if [ "$DIR" = " " ]
        then
  echo "create directory sucess"
        else
            echo "create directory error"
        fi
    elif [ "$create" = "n" ] || [ "$create" = "N" ]
then
            echo "does not create directory"
            exit 0
    else
        echo "Errors order"
        exit 1
    fi
fi

for循环

for循环结构与C语言中有所不同,在bash中for循环的基本结构式

for var in [list]

do

    #code lock

done

其中$var是循环控制变量,[list]是var遍历的一个集合,do/done对包含了循环体。

另外,如果for和do写在同一行,必须在do前面加";"。

shell脚本s7.sh

view plaincopy to clipboardprint?
#!/bin/bash  
for day in Sun Mon Tue Wed Thu Fri Sat 
do
    echo $day 
done 
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done

shell脚本统计当前目录下的文件数

view plaincopy to clipboardprint?
#!/bin/bash 

counter=0 
for files in * 
do
    counter=`expr $counter + 1` 
done 
echo "There are $counter files in `pwd` we need to process"
#!/bin/bash

counter=0
for files in *
do
    counter=`expr $counter + 1`
done
echo "There are $counter files in `pwd` we need to process"

shell脚本将用户输入的数字按倒序的方式输出

view plaincopy to clipboardprint?
#!/bin/bash 
echo -n "Pleasw enter number : "
read n 
sd=0 
rev=""
on=$n 
echo "$n"
while [ $n -gt 0 ] 
do
    sd=$(( $n % 10 )) # get Remainder 
    n=$(( $n / 10 ))  # get next digit 
    rev=$( echo $rev$sd) 
done 
echo  "$on in a reverse order $rev"
#!/bin/bash
echo -n "Pleasw enter number : "
read n
sd=0
rev=""
on=$n
echo "$n"
while [ $n -gt 0 ]
do
    sd=$(( $n % 10 )) # get Remainder
    n=$(( $n / 10 ))  # get next digit
    rev=$( echo $rev$sd)
done
echo  "$on in a reverse order $rev"

until循环

until循环的基本结构

until [condition]

do

    #code block

done

while和until的区别在于while是为真时执行,until是为假时执行。

shell脚本 移动一个文件,如果目标存在,监视该文件,直到文件被删除才移动文件。

view plaincopy to clipboardprint?
#!/bin/bash 
if [ "$1" = "" ] || [ "$2" = "" ] 
then 
    echo "Please enter file name"
    exit 1 
fi 
if [ -e $2 ] 
then 
    echo "The file already exists"
    until [ ! -f $2 ] 
    do
        sleep 1 
    done 
fi 
if [ ! `mv $1 $2` ] 
then 
    echo "mv sucessful"
else
    echo "mv error"
fi
#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ]
then
    echo "Please enter file name"
    exit 1
fi
if [ -e $2 ]
then
    echo "The file already exists"
    until [ ! -f $2 ]
    do
        sleep 1
    done
fi
if [ ! `mv $1 $2` ]
then
    echo "mv sucessful"
else
    echo "mv error"
fi


case语句

case语句结构

case "$var" in

    condition1)

        ;;

    condion2)

        ;;

    *)

        default statments;;

esac

shell脚本 判断键盘输入大小写

view plaincopy to clipboardprint?
#!/bin/bash  
echo "Hit a key, then hit return."
read Keypress  
case "$Keypress" in
    [A-Z] ) echo "Uppercase letter";; 
    [a-z] ) echo "Lowercase letter";; 
    [0-9] ) echo "Digit";; 
    * ) echo "Punctuation, whitespace, or other";; 
esac 
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z] ) echo "Uppercase letter";;
[a-z] ) echo "Lowercase letter";;
[0-9] ) echo "Digit";;
* ) echo "Punctuation, whitespace, or other";;
esac
(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容