linux编程-----shell脚本

来源:互联网 发布:算法工程师职业规划 编辑:程序博客网 时间:2024/05/17 01:43

一、基础语法

1.创建shell脚本文件,vim xxx.sh 

  文本内容首行写上 #!/bin/bash

  (在#后面加上!与shell的名称,用来宣告使用的shell类型),脚本中#代表注释.

 编写良好的shell脚本的步骤:

 ①.首先宣告使用的shell是什么类型的脚本。(在/etc/crontab情况下,如果没有宣告使用的shell,会出现错误信息导致脚本无法执行);

 ②.注明脚本的内同功能、版本信息、作者、编写日期等;

 ③.注释每个大步骤的主要功能。

 

2.执行shell脚本(脚本默认是在另外新开的shell中执行的)

方法一: 将脚本文件改成可执行的属性,如chmod  111 xx.sh  然后执行该文档,如 ./xx.sh

方法二:用sh命令执行脚本,如sh xx.sh

方法三"强制在当前shell中执行脚本 source xx.sh 

 

3.位置参数代号 xx.sh 参数1 参数2 参数3 参数4

        $0    $1     $2     $3     $4

    $0就是脚本文件名称 $1就是第一个附加参数,$2等以此类推

例如:脚本test1.sh内容为

   echo "this script's name is $0"

   echo "parameters are $1,$2,$3"

执行脚本 sh test1.sh pa1 pa2 pa3 

输出 this script's name is test1.sh

   parameters are pa1,pa2,pa3

tag:其他特殊变量的意义:

 

$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数

4.语法关键字

 (1) declare 定义变量用的,declare [-afirx] 变量名称

其中参数-a  定义为数组array

    -f  定义为函数function

    -i  定义为整数integer

    -r  定义为只读

    -x 定义为透过环境变量输出

 如: declare -i A=3  定义了整型变量A初始值为3

(2)引用变量的值要加上$符号,如 echo "A的值为$A"

当Shell遇到一个"$"符时(没有被引用或逃逸),它将认为其后为一变量,引用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能

$SUN=sun
$echo ${SUN}day

(3)语句末尾分号;可加可不加

(4)反引号``的作用:①包裹函数名,执行函数 ②字符串中包裹命令 让shell识别命令

1) 在Linux中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。
  如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。
  [root@localhost sh]# echo The date is `date`
  The date is 2014年 12月 18日 星期四 16:15:13 

 2)可以用$()替代``, 如

 ls -l `locate a.txt.txt 等同于 ls -l $(locate a.txt.txt)

 

(5)双引号""和单引号''的区别:  

  ①单引号内的内容将全部变为字符串

      ②双引号内可以识别出带$的变量,还能识别转义符\和反引号`

  ③单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符,如果没有单引号或双引号,shell会把空格后的字符串解释为命令。

 

(6)read 接收用户输入 

    用法 read 变量名称,例如:

  #read name

     #jack  (用户键盘输入jack)

  #echo $name

  #jack  

(6)逻辑判断

  1)逻辑运算符  

  ①数值可以使用 -eq-ne-lt-le-gt-ge 进行比较,分别表示等于不等于小于小于或等于大于大于或等于

  ②字符串可以使用操作符 =!=<> 分别进行等于不等于第一个字符串是在第二个字符串之前还是之后的比较操作。

  ③ [ ! -e logical.txt ] 判断文件logical不存在时,对文件进行逻辑判断的操作符如下

 

 几个针对文件操作的逻辑运算符操作符特性-d目录-e存在(也可以使用 -a)-f普通文件-h符号链接(也可以使用 -L)-p命名的管道-r可以读取-s非空-SSocket-w可以写入-N上次读取之后已经被修改过了

 2)if...then... fi式条件判断,fi表示if then判断式的结束符

 注意:下面的[ 条件 ] 中括号内两侧均含有空格 夹着条件内容

  if [ 条件一 ] &&[ 条件二 ];then

    执行内容

  elif [ 条件三] || [条件四 ];then

    执行内容

  else

    执行内容

  fi

例如:if [ "$yn" = "y" ] || [ "$yn"="Y" ]; then 

      echo "script is running..."

   else 

      echo "stop"

   fi

  3) case式条件判断,esac表示case判断式的结束符

    case 变量 in

       值1)

       执行内容1

       ;;     

     值2)

       执行内容2     

       ;;

     值3)

       执行内容3

       ;;

     *)

      其他情况值默认执行内容

   esac

(7)循环语句

 1)for...do...done循环

  for((条件一;条件二;条件三;))  

  do 

    操作

  done

例如:

     declare -i s;

  for((i=1;i<=100;i++))

  do 

    s+=i;

  done

  echo "s累加后值为$s"

2) while...do...done循环

while [ 条件1 ] || [ 条件2 ] 

do

  操作

done

例如(注意空格)

  declare -i a=0;

  declare -i s;

  while [ $a -ge 0 ] && [ $a 0- 101 ] 

      do 

      s+=a

    a=a+1

  done

  echo "s=$s";

3)for ... in ... do...done

$LIST="file1 file2 file3"

for a in $LIST

do

  echo $a

done

二、函数

1.函数定义

 function XX函数名(){

  执行内容

  return 返回值

}

说明:function关键字可以不加,return 可以没有

2.执行函数:用函数名不用带括号

①变量调用并接收: xx变量=`xx函数名称`  或 xx变量=$(xx函数名称) 

比如 A1=`helloworld` 执行helloworld函数并且用A1接收,但是接收的不是return值,而是执行函数时的标准输出内容

②直接执行: helloworld 或者$helloworld

③$?可以接收函数return的返回值

 

三、Shell脚本调试技术

1.简单的用sh 进行debug调试:

 sh -n xx.sh 不要执行脚本,只是查询脚本内的语法,若有错就列出

 sh -v xx.sh 在脚本执行前,先将脚本的源码内容显示在屏幕上

 sh -x xx.sh 将执行到的脚本(变量已引用后的)内容显示在屏幕上

 

2.参考 http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/

 

学习参考:http://billie66.github.io/TLCL/book/zh/

0 0