Shell脚本编程基础

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    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    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
 

 

你可能感兴趣的:(linux,shell,脚本,编程,whitespace,file,bash)