gdrocket 发表于 2018-8-23 07:52:02

shell基本介绍 以及基本的shell脚本的语法

  shell基本介绍 :
  1、Shell作用就是执行用户命令,有两种方式:交互式(输入一条,解释一条),批处理(将多个命令同时写入脚本,然后调用shell,一次性把这些命令执行完毕);
  2、交互式命令分为:内建命令 和 非内建命令;
  内建命令; 相当于调用函数,不创建新的进程,使用which查不到其定义的位置;如cd ,alias ,exit等;
  非内建命令:使用了fork创建新进程,使用which可以查找到其定义的位置;
  3、在shell脚本中,#表示注释,但是如果#位于第一行,且为#!形式,表示该脚本使用后面指定的解释器; 如 #! /bin/sh
  4、在批处理中,交互式shell fork/exec出一个shell,用于处理子进程任务,一条执行完,才执行下一条;
  5、Shell 变量由全大写字母加下划线组成;
  6、 有两种类型的Shell变量:环境变量和本地变量;
  环境变量可以从父进程传递给子进程,可使用printenv查看 当前Shell进程的环境变量; 环境变量是一个存放元素为字符串的数组;
  本地变量只存在于当前Shell中,set 命令可以查看当前Shell进程中定义的所有变量;
  环境变量是所有进程都有的东西,而本地变量只是Shell进程特有;
  7、Shell变量的定义:
  VARNAME=value注意,等号两边不能有空格;
  在shell中定义的变量,默认本地变量,仅供本Shell进程使用,不过,可使用export VARNAME=value将本地变量声明为环境变量;
  8、Shell变量的删除:
  unset VARNAME 删除VARNAME变量,无论是本地变量还是环境变量;
  9、Shell变量的取值:
  ${VALUE}表示提取了VALUE的值;
  10、Shell 变量类型默认是字符串类型的,不需要定义其变量类型;
  11、通配符:
  *: 匹配零个或者多个任意字符;
  ?: 匹配一个任意字符;
  ,匹配a,b,c中的任意一个;
  12、 一条命令的输出作为另一条命令的输入;
  DATE=$(data)   将data命令的执行结果给了变量DATE;
  13、算术运算:$(( ))中的Shell变量取值将转化为整数;
  VAR=45;
  echo $(($VAR+45 ))
  $(( )) 只能做整数的运算,且包含的运算符只能是 : +,- , * , / 和()运算;
  14、转义字符\;
  转义字符 \ 用于除去紧跟其后的单个字符的特殊意义(回车除外),也就是说只去其字面值;如touch \$\ \$可以创建名字为$$的文件;
  15、单引号:
  用于保持单引号内字符的字面值,包括回车和\也不例外;如果单引号没有配对,则会提示用户输入’;
  16、双引号:
  用于保持引号内所有字符的字面值,包括双引号;但是除了一下情况:
  $+变量名仍然表示取变量的值;
  反引号仍然表示命令替换(和$()等价);
  \$, \‘,\“ , \\仍然表示字面值;
  shell脚本基本语法:
  1、test 命令:
  test命令用于测试一个条件是否成立,与[    ]作用等价,如果成立,则返回0,不成立,则返回1;
  VAR=5   //变量赋值;
  ${VAR} -gt 1//比较大小; 等价于[ ${VAR} -gt 5 ],注意在变量之间,变量和括号之间,都要加一个空格;
  echo $?         //显示结果;
  2、常见测试命令:
  (注意:括号 和字符之间都有空格,空格不可少;
  [ -dDIR ], 如果DIR存在,而且是一个目录,则为真,返回0;
  [ -fFILE ],如果FILE存在,且为一个普通文件,则为真;
  [ -z STRING ],如果STRING的长度为0,则为真,
  [ -n STRING ],如果STRING的长度不为0,则为真;
  [ STRING1 = STRING2 ],如果两个字符串相同,则为真;
  [ STRING1 != STRING2 ],如果两个字符串不同,则为真;
  [ ARG1 OP    ARG2 ] ,ARG1 和 ARG2必须是帧数;OP是操作符; -eq(等于) -ne(不等于),
  -lt(小于), -le(小于等于),-gt(大于) -ge(大于等于)
  [ ! EXPR ] EXPR可以是上面的任何测试命令; !表示逻辑反;
  [ EXPR1 -a EXPR2 ] EXPR可以是上面的任何测试命令; -a 表示逻辑与;
  [ ExPR1 -o EXPR2 ] ,EXPR可以是上面的任何测试命令; -o表示逻辑或;
  3、在条件测试语句中,如果一个没有定义的变量直接被赋值,则会出现错误:
  如[ -d Desktop -a $VAR = ‘abc’ ] 如果VAR 没有事先定义,则会报错,正确的做法是
  [ -d Desktop -a “$VAR” = ’abc‘ ], 使用双引号将变量内容括起来;
  4、shell 中的条件选择语句:
  if/then/elif/else/fi
  如:if [-f ./1.sh ];
  then ./2.sh;
  elif;
  then ;
  fi;
  注意: 命令和各个参数之间必须要用空格隔开;
  Shell中没有{},所以用if和fi 表示语句块的开始和结束;fi 后面也是可以跟语句的;
  如果 条件的返回值为0(即:Exit Status 的返回值为0),则表示条件为真,否则表示条件为假;
  注意: :(即冒号)是一个特殊的命令,称为空命令,表示不做任何事,但是作为条件返回时,结果为真;
  5、read变量名
  表示从命令行读一个值给了变量名;
  6、使用case和esac 来确定 case 命令执行的范围;
  使用 $变量 in可能值1|可能值2|可能值3) 动作;; *)动作2;;来匹配相应的变量值,并且执行相应的动作,注意,使用的是两个封号结尾;注意只有半个括号;
  最后使用 esac 来结束;
  如:
  case ”$YES_OR_NO“ in
  yes|y)
  echo “good morning ”;;
  *)
  echo “good afternoon“;;
  *)
  echo “sorry”;;
  esac
  7、 使用for 循环:
  for 循环变量 in 取值1 取值2 取值3;
  do执行动作;
  done
  意思就是,依次取取值,然后进行动作;done 表示循环完毕;
  8、使用while;
  read TRY
  while [ $TRY !=”secret“ ];
  do echo “sorry!”
  read TRY;
  done;
  9、 控制循环次数;
  COUNTER=1;
  while [ “$COUNTER” -lt 10 ];
  do echo “here we again ”
  COUNTER=$(($COUNTER + 1))
  10、常用的位置参数和特殊变量;
  $0 命令行参数第一个,相当于C语言中的main函数的 argv;这里是该文件的名字;
  $1 ,$2 相当于 argv,argv;
  $#,相当于argc -1;
  $@ ,表示 $1,$2......,这个可用在for 循环之后的 in 后面;
  $? 表示上一条命令的退出状态:Exit Status;
  11、使用shift 位移个数 可以将参数左移几个;
  echo “the $0 is now running”
  echo “first $1”
  echo “second $2”
  echo “$@”
  shift 1                  #参数左移两个;
  echo “first $1”
  echo “second $2”
  echo “$@”
  会发现现在的 $1 是原来$2的值;
  12、   shell 中函数的运用;
  foo() { echo “Function foo is called” }   #注意,这里的分号必须要加;
  echo “start”
  foo               #注意没括号;
  echo “end”
  注意函数定义时,没有参数和返回值;定义时有括号,调用时没有有括号;
  注意,函数定义必须在函数调用之前,必须;调用一般在后面;
  13、Shell脚本提供了调试方式:
  在 命令行输入时,使用以下格式:
  sh -n shell文件名;      只检测是否有语法错误,并不执行;
  sh -v shell文件名;      一边执行脚本,一边将执行过的脚本命令和执行结果打印到标准输出;
  sh -x shell文件名;      提供跟踪执行信息,将执行的每一条命令和结果打印出来;(常用)
  在脚本里头全部调试时,使用以下格式:
  #! /bin/sh -x(x可以被替换);
  在脚本里只进行一部分调试时:
  在开始调试的位置加:
  set -x;                         #启用调试;
  需要调试信息的部分;
  set +x;                        #禁用调试;
  (x 可以换)

页: [1]
查看完整版本: shell基本介绍 以及基本的shell脚本的语法