当前位置: > shell编程 >

Shell 第一天

时间:2015-10-10 12:44来源:linux.it.net.cn 作者:IT

目录[-]

  • 1.hello world
  • 2 位置参数
  • 3  内部参数
  • 4  键盘读入变量值
  • 5 字符串比较
  • 6 文件操作
  • 7 循环
  • 8 switch
  • 9 函数

1.hello world

以下几个脚本写法均正确:

 
1
2
3
#!/bin/bash a='hello world' echo $a

 

 
1
2
3
#!/bin/bash a='hello world' echo ${a}

 

 

1
2
3
#!/bin/bash a="hello world" echo ${a}

 

 

 

1. 变量单引号,双引号都正确?

2.变量$a , ${a}都正确,区别是什么?

 

大家常见的变量形式都是$var,如 

$ var=test 
$ echo $var 
test

但当你要显示变量值加随意的字符(我这里用AA)时,就会出错,如下: 

$ echo $varAA

$

这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围,如下 
$ echo ${var}AA 
testAA 
$


 

 

2 位置参数

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

3  内部参数

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

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

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

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

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

   

 
1
2
3
4
5
6
7
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testparameter.sh #!/bin/bash echo "the program name is $0"; echo "the program has $# parameter"; echo "the parameter string is $*"; echo  "the execution result is $?"

 

 

1
2
3
4
5
[nxuser@PSjamsBond-0-0-0 tmp]$ ./testparameter.sh  this is a test
the program name is ./testparameter.sh
the program has 4 parameter
the parameter string is this is a test
the execution result is 0

 

 

1
2
3
4
5
6
7
8
9
10
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testdelete.sh  #!/bin/bash
#方括号必须有空格,否则语法错误
if [ $# -eq 0 ];then   echo  "please specify a file to delete" else
  gzip $1
  mv $1.gz $HOME/dustbin
  echo "success" fi

 

 

 

注意:

1.  方括号必须有空格,否则报错

  if [ $# = 0 ];then

  else 

   fi

 

4  键盘读入变量值

在Shell程序设计中,变量的值可以作为字符串从键盘读入,其格式为:

     read 变量

例如:

[root@localhost  bin]#read str

read为读入命令,它表示从键盘读入字符串到 str

 
1
2
3
4
5
6
7
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testread.sh #!/bin/sh echo "input directory" read  DIRECTORY cd  $DIRECTORY ls

 

 

1
2
3
4
5
6
7
8
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testcaculate.sh #!/bin/sh
echo “please input x y” #读入多个值,空格隔开
read x y #运算需要用`包括,并且运算符两个数字必须用空格隔开,否则报错 z=`expr $x + $y` echo “The sum is $z”

 

 

1. read多个值用空格隔开

2,表达式expr用`包括,并且运算符两侧的数字必须加空格,否则报错

3 表达式total=`expr $total +$num`及num=`expr $num +1`中的符号“`”为键盘左上角的“`”键。

 

 

 

5 字符串比较

 

1
2
3
4
5
6
7
8
[nxuser@PSjamsBond-0-0-0 tmp]$ vi teststring.sh #!/bin/sh
read str1 str2 if [ $str1 = $str2 ];then
 echo "equal" else
 echo "not equal" fi

 

 

 

除了上面的写法,也可以这样写:

 

 

1
2
3
4
5
6
[nxuser@PSjamsBond-0-0-0 tmp]$ vi teststring.sh #!/bin/sh
read str1 str2
[ "$str1" = "$str2" ] echo $?
~

 

 

 

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

 

6 文件操作

-d  是否是目录

 

 
1
2
3
4
5
6
7
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfile.sh #!/bin/sh if [ -d /tmp ];then 
 echo "yes" fi
~

 

 

 

-f 是否为文件

 

 

1
2
3
4
5
6
7
8
9
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfile.sh #!/bin/sh if [ -f /tmp ];then
 echo "yes" else
 echo "no" fi
~

 

 

 

 

7 循环

 

 
1
2
3
4
5
6
7
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testloop.sh #!/bin/sh for i in a,b,c,d  1,2,3,4 do
 echo $i done

 

 

在循环列表中的空格可表示换行。

 
1
2
3
4
5
6
7
<STRONG>#!/bin/sh total=0 for(( j=1;j<100;j++))
 do 
  total=`expr $total + $j`
 done echo  "result is $total"</STRONG>

 

 

for i  in 列表

 

  do  

    ......

  done

 

for((...))

  do 

  ...

   done

 

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

 

while 表达式

     do

       操作

     done

until 表达式

do

操作

done

 

8 switch

 

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
echo "input name" read  NAME
 case  $NAME in
kerry) echo "kerry";;
  
eva) echo "eva";;
*) esac

 

 

 

第二个条件不需要case语句  ,最后结尾注意。操作语句是;;结尾

 

case 表达式 in

值1|值2)

操作;;

值3|值4)

操作;;

值5|值6)

操作;;

*)

操作;;

esac

9 函数

 
1
2
3
4
5
6
7
8
9
10
11
12
13
[nxuser@PSjamsBond-0-0-0 tmp]$ vi testfuction.sh #!/bin/sh
add()
{
 a=$1
 b=$2
 sum=`expr $a + $b`
 echo "sum is $sum"
  
}
add $1 $2
~

 

 

 

注意:

函数定义完成后必须同时写出函数的调用,然后对此文件进行权限设定,在执行此文件


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容