shell 编程要点

来源:互联网 发布:做淘宝怎么做需要哪些 编辑:程序博客网 时间:2024/06/15 09:02

两个有用的命令read -p "Please input a choice:"  choice
killall -9 myfiles



1.长命令 使用反斜线字符(\)在命令行上扩充


qustdjx@qustdjx-K42JZ:~/test$ echo "this is \
> long command"

this is long command

" >"是回车自动产生的,不是输入的,在执行Shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令

2.编辑shell程序:

例:

#!/bin/sh
echo "Mr.$USER,Today is:"
echo &date "+%c%d%A"
echo "Wish you a lucky day !"

#!/bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date命令前加符号“&”,其中%B%d%A为输入格式控制符。


3.执行shell的方式:

首先修改权限 :chmod +x date.sh

(1)./date.sh

 (2)  bash date.sh

 (3)为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。

例:把date.sh 放到/bin 下,修改环境变量:

root@qustdjx-K42JZ:/home/qustdjx/test# cp date.sh /bin
root@qustdjx-K42JZ:/home/qustdjx/test# export PATH=/bin:$PATH
root@qustdjx-K42JZ:/home/qustdjx/test# date.sh
Mr.root,Today is:

2012年08月02日 星期四 12时45分50秒02星期四
Wish you a lucky day !
4.shell 的参数

(1)由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。

(2)上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。

    $0:命令含命令所在的路径。

    $#:传递给程序的总的参数数目。

    $?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。

    $*:传递给程序的所有参数组成的字符串。

     例:

   

#! /bin/sh
echo “Program name is $0”;
echo “There are totally $# parameters passed to this program”;
echo “The last is $?”;
echo “The parameter are $*”;

  运行:

qustdjx@qustdjx-K42JZ:~/test$ ./test.sh
Program name is ./test.sh
There are totally 0 parameters passed to this program
The last is 0
The parameter are

例:

#! /bin/sh
if test $# -eq 0
then
echo "Please specify a file!"
else
mv $1 $HOME/dustbin           #移动到回收站
echo "File $1 is deleted !"            
fi


注:test命令参数;

              INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2


5.shell 程序中的变量

(1)简单的赋值:

x=6

a="hello world"

b=$a

(2)键盘读入值
qustdjx@qustdjx-K42JZ:~/test$ read str

qustdjx

qustdjx@qustdjx-K42JZ:~/test$ echo $str
qustdjx

例:

#! /bin/sh
echo “please input x y”
read x,y
z=`expr $x+$y`
echo “The sum is $z”

注:

 #expr 通用求值表达式,通过给定的操作(参数必须以空格分开)连接参数,并对参数求值.可以使算术操作, 比较操作, 字符串操作或者是逻辑操作

expr 5 \* 3  返回 15  在算术表达式expr中使用乘法操作时, 乘法符号必须被转义.

z=`expr $x+$y` 中的“`"是键盘左上角的“`"

6.表达式的比较

(1)字符串比较

作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。

常用的字符串操作符如表所示.。

常用的字符串操作符

      字符串操作符
        

      含义及返回值

    =
        

     比较两个字符串是否相同,相同则为“真”

     !=
        

     比较两个字符串是否不相同,不同则为“真”

     -n
        

    比较两个字符串长度是否大于零,若大于零则为“真”

     -z
        

    比较两个字符串长度是否等于零,若等于零则为“真”

例:

#! /bin/sh
read ar1
read ar2
[ "$ar1" = "$ar2" ]
 echo $? #?保存前一个命令的返回码

qustdjx@qustdjx-K42JZ:~/test$ ./test
sss
sss
0

”[”后面和”]”前面及等号“=“的前后都应有一个空格;注意这里是程序的退出情况,如果ar1和ar2的字符串是不相等的非正常退出,输出结果为1。


例:

判断输入的字符串的长度是否大于0

#! /bin/sh
read ar
 [ -n "$ar" ]
echo $?   #保存前一个命令的返回码

注:运行结果为1,则表明字符串长度小于或等于0

(2)数字比较

用test比较的运算符

  运算符号
    

  含 义

-eq
    

  相等

-ge
    

  大于等于

-le
    

  小于等于

-ne
    

  不等于

-gt
    

  大于

-lt
    

  小于

例:

#! /bin/sh
read x y
if test $x -eq $y
then
echo "$x=$y"
else
echo "$x!=$y"
fi


运行:

qustdjx@qustdjx-K42JZ:~/test$ ./test
12 23
12!=23


注:read 命令读入两个字符串时,应用空格隔开

(3)逻辑操作

Shell中的逻辑运算符

 运算符号
    

  含 义

 !
    

 反:与一个逻辑值相反的逻辑值

 -a
    

 与(and):两个逻辑值为“是”返回值为“是”,反之为“否”

 -o
    

或(or):两个逻辑值有一个为“是”,返回值就是“是”

例:

#! /bin/sh
p1="1111"
p2=""

[ "$p1" -o "$p2" ]
echo $?
[ "$p1" -a "$p2" ]
echo $?

运行:

qustdjx@qustdjx-K42JZ:~/test$ ./test
0
1


注:p2="" 引号内没有空格,如果有空格则会返回两个0

(4)文件操作

文件测试操作符

  运算符号
    

  含 义

 -d
    

 对象存在且为目录返回值为“是”

 -f
    

 对象存在且为文件返回值为“是”

-L
    

 对象存在且为符号连接返回值为“是”

 -r
    

 对象存在且可读则返回值为“是”

 -s
    

 对象存在且长度非零则返回值为“是”

 -w
    

 对象存在且且可写则返回值为“是”

 -x
    

 对象存在且且可执行则返回值为“是”

例:

#! /bin/sh
dir="/home/qustdjx/test"
[ -d $dir ]

if test $? -eq 0
then
echo "$dir:exist"
else
echo "$dir :no exist"
fi
运行:
qustdjx@qustdjx-K42JZ:~/test$ ./test
/home/qustdjx/test:exist




例:

输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容

#! /bin/sh
  echo "Please enter the directory name or file name"
  read DORF
  if [ -d $DORF ]
  then
ls $DORF
  elif [ -f $DORF ]
then
cat $DORF
else
  echo "input error! "
fi

7.循环结构

Shell常见的循环语句有for循环、while循环语句和until循环。
(1) for循环

语法:

for变量 in列表

do

操作

done


例:

在列表中的值:a,b,c,e,I,2,4,6,8用循环的方式把字符与数字分成两行输出。

#! /bin/sh
for i in a,b,c,e,I  2,4,6,8   #在循环列表中的空格可表示换行。
do
echo $i
done


运行:

qustdjx@qustdjx-K42JZ:~/test$ ./test
a,b,c,e,I
2,4,6,8

例:

#! /bin/sh
total=0
for((j=1;j<=100;j++));
do
total=`expr $total + $j`
done
echo "The result is $total"

运行:
./test: 3: Syntax error: Bad for loop variable

这是因为:http://blog.csdn.net/qustdjx/article/details/7823951
qustdjx@qustdjx-K42JZ:~/test$ ./test
The result is 5050
另一种写法:
#!/bin/sh
s=0
for i in `seq 1 100`
do
s=`expr $s + $i`
done
echo $s

注意:
for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr$total + $j`until循环的加号两边的空格不能省,否则会成为字符串的连接。
(2)while 循环

语法:

while表达式

do

操作

done

只要表达式为真,do和done之间的操作就一直会进行。


例:
#!/bin/sh
i=1
j=0
while ((i <=100 ))
do
 ((j=j+i))
 ((i++))
done
echo $j




另一例:
#! /bin/sh
total=0
num=0
   while((num<=100));
do
      total=`expr $total + $num`
      ((num=$num+1))
done

echo "The result is $total"


另另一例:

#!/bin/sh
i=1
sum=0
while [ $i -le 100 ]; do
 sum=$((sum+i))
 i=$((i+1))
done
echo "SUM=$sum"


(3)until 循环

语法:
until 表达式
do
操作
done
重复do和done之间的操作直到表达式成立为止。

例:
#! /bin/sh
total=0
num=0
   until [ $num -gt 100 ]
   do
       total=`expr $total + $num`
       num=`expr $num + 1`
done
echo "The result is $total"
 8.条件结构语句

语法:
if 表达式1  then
操作
elif表达式2  then
操作
elif表达式3  then
操作
……
else
操作
fi


原创粉丝点击