Swift51.com
麦子学院 头像
麦子学院  2017-04-12 00:12

linux之shell编程基本语法

回复:0  查看:1873  
本文和大家分享的主要是linux shell 编程相关内容,一起来看看吧,希望对大家学习linux shell 编程http://www.maiziedu.com/course/529/有所帮助。
   基本格式
  代码写在普通文本文件中,通常以 .sh 为后缀名
  vi intsmaze.sh
  #!/bin/bash    ##  表示用哪一种 shell 解析器来解析执行我们的这个脚本程序 echo "hello world"   ##   注释也可以写在这里 ##  这是一行注释
  执行脚本
  sh intsmaze.sh
  或给脚本添加x 权限,直接执行,否则只能通过 sh xxx.sh 执行
  chmod 755 intsmaze.sh
  ./intsmaze.sh
   基本语法
   系统变量
  Linux Shell 中的变量分为 系统变量 用户自定义变量 。可以通过 set 命令查看系统变量。
  [hadoop@centos-Reall-131 shtest]$ set
  BASH=/bin/bash
  HADOOP_HOME=/home/hadoop/hadoop-2.6.4
  HISTCONTROL=ignoredups
  HISTFILE=/home/hadoop/.bash_history
  HISTFILESIZE=1000
  HISTSIZE=1000
  HOME=/home/hadoop
  HOSTNAME=centos-Reall-131
  HOSTTYPE=i386
  ID=500
  JAVA_HOME=/home/hadoop/app/jdk1.7.0_65
  LANG=en_US.UTF-8
  LESSOPEN='|/usr/bin/lesspipe.sh %s'
  LINES=24
  LOGNAME=hadoop
  访问系统变量:$HOME $PWD $SHELL $ JAVA_HOME  等等
   自定义变量
  1 、语法
  变量=值  (例如STR=abc
  等号两侧不能有空格
  使用变量: $arg
  双引号和单引号有区别:双引号仅将字符串中的空格脱意;单引号会将字符串中的变量引用比如$param 脱意。
  2 、示例
  [hadoop@centos-Reall-131 ~]$ STR=hello world
  -bash: world: command  not found
  [hadoop@centos-Reall-131 ~]$ STR="hello world"
  [hadoop@centos-Reall-131 ~]$ A=9
  [hadoop@centos-Reall-131 ~]$ echo $A9
  [hadoop@centos-Reall-131 ~]$ echo $STR
  hello world
  如果想打印 hello worlds is greater   怎么办?
  echo $STRs is greate  行吗?
  不行,正确写法是:
  echo ${ STR}s is greate
  [hadoop@centos-Reall-131 ~]$ echo ${STR}s is greate
  hello worlds is greate
  [hadoop@centos-Reall-131 ~]$ echo '${STR}s is greate'
  ${STR}s is greate
  [hadoop@centos-Reall-131 ~]$ echo "please$STR"
  pleasehello world
  [hadoop@centos-Reall-131 ~]$ echo 'please$STR'
  please$STR
  unset A  撤销变量 A
  readonly B=2  声明静态的变量 B=2,不能 unset
  export  A    # 可把变量提升为当前 shell 进程中的全局环境变量,可供其他子 shell 程序使用
  vi a.sh
  #!/bin/bash
  a="a in a.sh"echo $a
  /root/scripts/b.sh
  vi b.sh
  #!/bin/bash
  b="b in b.sh"echo $becho $a
  然后执行  ./a.sh  ,会发现 b 脚本中并没有把 a 脚本中定义的 a 变量打印出来。
  如果要在b 中打印出 a 脚本的变量 a ,需要在 a 脚本中把变量 a export 定义,此时, a 变量就成了 a.sh 脚本所在 bash 进程的全局变量,该进程的所有子进程都能访问到变量 a
  另一种方式:
  如果在a.sh 脚本中用如下方式调用 b.sh
  .  ./b.sh      ## 注意:重点关注最前面那个 “.”
  或者
  source ./b.sh   ##
  则,b.sh 就在 a.sh 所在的 bash 进程空间中运行,而不是在 a 进程中的子进程中运行了。
  总结:
  1 a.sh 中直接调用 b.sh ,会让 b.sh a 所在的 bash 进程的 子进程 空间中执行
  2 、而子进程空间只能访问父进程中用 export 定义的变量
  3 、一个 shell 进程无法将自己定义的变量提升到父进程空间中去
  4 “.” 号执行脚本时,会让脚本在调用者所在的 shell 进程空间中执行
  3 、反引号赋值
  A=`ls -la`    ##  反引号,运行里面的命令,并把结果返回给变量 A
  A=$(ls -la)   ##  等价于反引号
  4 、特殊变量
  $?  表示上一个命令退出的状态码
  $$  表示当前进程编号
  $0  表示当前脚本名称
   $n 表示n位置的输入参数(n代表数字,n>=1
  $#  表示参数的个数,常用于循环
  $* $@  都表示参数列表
   注:$*$@区别
  $*  和  $@  都表示传递给函数或脚本的所有参数
  ü  不被双引号 " " 包含时 ——
  $*  和  $@  都以 $1  $2  … $n  的形式组成参数列表
  ü  当它们被双引号 " " 包含时 ——
  "$*"  会将所有的参数作为一个整体,以  " $1 $2 … $n  "  的形式组成一个整串;
  "$@"  会将各个参数分开,以 "$1" "$2" … "$n"  的形式组成一个参数列表
来源: 博客园