shell脚本备忘

来源:互联网 发布:软件功能性能 编辑:程序博客网 时间:2024/06/06 06:34

一、什么是脚本

脚本不属于任何计算机语言的范畴,但到目前为止,人们往往把那种不需要编译的程序文件称之为脚本。它的代码不需要编译,而是被“解释”执行,所以运行时需要一个“解释器”。

在Linux系统中,常用的脚本有Bash、Perl。

二、一些shell脚本示例

1、新建一个文件,命名为test,输入以下内容

#!/bin/bash

echo "Hello bash" #display one message

在这个文件保存的目录下,执行chmod a+x test,为test添加执行权限,然后在终端运行该脚本:

#./test

Hello bash

第一行#!/bin/bash是必需的,并且必须在首行,让操作系统选择用Bash来解释执行脚本文件。如果是Perl脚本,第一行则为#!/bin/perl

echo是一个Linux命令,#后面是注释

脚本中可以调用各种Linux命令,因此,凡是需要按一定的次序执行多个Linux命令的场合都可以使用脚本来完成。


2、新建一个文件,命名为test2

#!/bin/bash

echo  $1

echo  $2

echo  $3

用户输入可以用$n表示,n为1-9自然数,分别代表输入的第n个参数,用空格或Tab分隔。

#./test2 you are well

you

are

well


3、变量定义

#!/bin/bash

A=b

All=all

echo "$A"ll

echo $All

该段代码的两次输出分别为bll和all,引用变量在前面加一个美元符就可以了。为避免混淆,可以加双引号。


4、条件判断

条件判断主要是判断两个字符是否相等,两个数字是否相等

#!/bin/bash

if [ "$1"="normal" ]

then

 echo "this is normal case"

elif [ -z "$1" ]

then

 echo "no input"

fi

条件语句必须使用fi结束

条件语句中“[”符号后面必须有一个空格


附:字符串的比较和整数的比较的一些操作符

-n    操作数的长度不为零

-z    操作数的长度为零

-d   操作数对应一个目录

-f   操作数对应一个文件

-eq 操作数为整数,并且相等

-neq 操作数为整数,但不相等

= 操作数为字符串,并且相等

!= 操作数为字符串,不相等

-lt 小于,操作数为整数

-gt  大于,操作数为整数

-ge 大于等于,操作数为整数

-le 小于等于,操作数为整数


5、while [] ...do...done语句

#!/bin/bash

echo "please use add or delete or exit"

ACTION="default"

while [ -n $ACTION ]

do

 read ACTION

case $ACTION in

add)

   echo "add"

  ;;

delete)

  echo "delete"

;;

exit)

echo "exit"

break

;;

*)

  echo "invalide"

;;

esac

done

在这里分享给大家一个小技巧,这是我在调试脚本时遇到的情况

假如你是在windows里写的脚本,放到Linux运行bad interpreter: 没有那个文件或目录”错误,原因是在windows下写的脚本是dos格式的,放在Linux下编码不识别,解决方法是使用dos2unix命令转一下,即输入: dos2unix 文件名,就OK了!

while语句和if语句中的条件判断格式完全相同。read是一个Linux命令,用于提示用户输入并以按回车键结束输入。in也是一个Linux命令。case分支也可以有通配符,即星号,每一个分支结束符号是两个分号。esac也是一个Linux命令,这里可以理解为case语句的结束标识。(脚本可以调用各种Linux命令)

done语句是整个while语句的结束标识。要退出while循环,可以用break


6、for循环

Bash中的for循环类似于java中的foreach语句,for一般和in联合使用,用于从某个集合中逐个取出元素并对其进行操作,如下例子:

#!/bin/bash
for x in 1 2 3 4 5 hello
do
echo $x
done

该段代码将显示in集合中的所有元素。

另一个for循环示例:

#!/bin/bash
for x in `ls`
do
echo `basename $x`
echo `dirname $x`
done
uname

该脚本把Linux ls命令的输出作为集合的输入,需加上··号,这个号在键盘1的左边。uname用于显示操作系统的内部名称basename和dirname命令用于显示一个字符串中的文件名称和路径。basename和dirname本身并不去检测该文件是否真正存在于磁盘上,而仅仅是针对字符串的操作。


7、函数

#!/bin/bash
strcat()
{
  OUT="$1"" ""$2"
  return 0
}

strcat2()
{
  echo "$1"" ""$2"
  return 3
}

A="bird"
B="mouse"

OUT=""
strcat $A $B
echo $OUT
OUT2=`strcat2 $A $B`
echo $?
echo $OUT2

定义函数时,不需要定义参数,在函数实体中可以直接使用$1 $2代表输入的第n个参数

return返回整数,相当于C语言中的exit(int)。函数的返回值实际上是echo后面的内容

调用函数时,把函数返回值赋给变量要用··(1左边那个键)包起来

$?代表上一个命令的return值,这个命令可以是函数,也可以是Linux命令


8、常用内置符号常量

$@  代表全部参数,比如test a b c ,此处“a” “b” “c”展开后为三个字符串

$*  全部参数,test a b c,此处“a b c”展开后为一个字符串

$# 参数的个数

$? 上一个命令的return值

$$当前命令所在的进程号(PID)

原创粉丝点击