asfsd 发表于 2018-8-29 14:12:31

linux--shell脚本笔记之一。

  shell脚本(1)
  Shell脚本是一个特殊的应用程序,负责接收用户输入的操作命令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。可以在/etc/shells文件查看当前系统所支持的shell种类。
  # cat /etc/shells
  /bin/sh
  /bin/bash
  /sbin/nologin
  /bin/tcsh
  /bin/csh
  /bin/ksh
  其中/bin/bash是目前大多数linux版本采用的默认shell,全称为Bourne AgainShell
  脚本的二种执行方法
  一、./first.sh   这种执行方法需要给first.sh脚本一个执行权限:chomod+x first.sh
  二、sh /first.sh      这种执行方法不需要给first.sh脚本执行权限,也可通过Source“.”执行
  . first.sh 或者source/first.sh (中间都是有空格的)
  重定向与管道操作
  标准输入(STDIN):默认:键盘 文件编号为0
  标准输出(STDOUT):默认:显示器 文件编号为1
  标准错误(STDERR):默认:显示器 文件编号为2
  重定向输出>和>>分别是覆盖和追加重定向
  重定向输入<
  重定向输入可用于给用户创建密码
  #vim shelltest/useradd
  123456
  :x
  # passwd --stdin jerry 和2>>是覆盖和追加重定向
  当一个命令即包括错误输出和标准输出时可以用&>把标准和错误输出到一个文件里
  如自动编译安装httpd时要把makemake install操作全部指向/dev/null
  # vim httpd.sh
  #!/bin/bash
  #httpdshell install
  cd/var/ftp/pub/httpd-2.2.17/
  ./config--prefix=/usr/local/httpd --enable-so &>/dev/null
  make&>/dev/null
  makeinstall $>/dev/null
  .....以下省略
  执行这个脚本后编译安装时会把输出的文件全部指向/dev/null下。
  管道符“ | ”位于管道符左侧的命令输出的结果,将作为右侧命令的输入。
  如查看用“/bin/bash”作为shell的用户名称时可以用awk命令进一步过滤,只显示用户名和登录shell列
  过滤前会显示整行内容
  # grep "/bin/bash$" /etc/passwd
  root:x:0:0:root:/root:/bin/bash
  jerry:x:500:500::/home/jerry:/bin/bash
  过滤后只显示用户名和登录shell
  # grep "/bin/bash$" /etc/passwd | awk -F: '{print$1,$7}'
  root/bin/bash
  jerry/bin/bash
  上列中awk的作用是以:为分隔符输出第1列和第7列内容,-F是指定分隔符,可为文档中的任意字符,默认以空格或制表符分隔(大括号里的内容要用单引号)。
  使用shell变量
  常用的shell变量包括:自定义变量、环境变量、预定义变量、位置变量。
  自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,所以又称做本地变量。
  定义变量的基本格式为“变量名=变量值”,等号两边没有空格。变量名称需要以字母或下划线开头,名称中不要包含特殊字符。
  自定义变量如下:
  # system=centos
  # version=6.5
  查看时用echo回显,变量名前要加上$符号
  # echo $system
  centos
  # echo $system $version
  centos 6.5
  回显变量名时如果后边有其它字符需要添加大括号“{}”将其包围起来,否则将无法确定正确的变量名称。未定义的变量,将显示为空值。
  # echo $system6.5         #因未定义$system6所以只显示.5变量值为空
  .5
  # echo ${system}6.5
  centos6.5
  变量赋值的特殊操作
  在等号后边直接指定变量内容是为变量赋值的最基本方法,除此以外还有一些特殊的赋值操作,可以灵活地赋值变量,以便适用于复杂的管理任务。
  1.双引号(“”)
  比如我们在赋值一个内容里包含空格时,必须用双引号括起来,如下
  # Centos=Centos6.5错误的赋值提示没有这个命令
  -bash: 6.5: command not found
  #Centos="Centos 6.5"
  # echo $Centos
  Centos 6.5
  2.($)符号
  在双引号范围内,使用“$”符号可以引用其它变量的值,如下
  # redhat="red hat$version"
  # echo $redhat
  red hat 6.5
  3.单引号(’)
  当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来,经单引号的范围内,将无法引用其他变量值,任何字符当做普通字符看待,但赋值的内容中包含单引号时,需要用“\”符号进行转义,以免冲突。如下
  # redhat='red hat $version'
  # echo $redhat
  red hat $version
  4.反撇号(`)
  反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量,反撇号括起来的范围内必须是能够执行的命令行,否则会出错。如下
  # ls -ld `which service`
  -rwxr-xr-x 1 root root 1744 2009-07-13/sbin/service
  如上述命令相当于先执行which service然后查看文件属性相当于连续执行了两条命令。
  但是使用反撇号不能在一行命令中实现嵌套命令替换操作,这时可以用“$()”来代替反撇号,以解决嵌套问题,如查看useradd命令程序的软件包安装的配置文件在什么位置,如下
  # rpm -qc $(rpm -qf $(whichuseradd))
  /etc/default/useradd
  /etc/login.defs
  5.read命令
  Read命令是用来提示用户输入信息,从而实现简单的交互过程,将用户输入的内容赋值给指定的变量,多余的内容赋值给最后一个变量,若指定的变量只有一个,则将整行内容赋值给此变量。如下操作会等待用户输入,并将用户输入内容赋值给变量
  # read dir
  /opt/backup
  # echo $dir
  /opt/backup
  Read命令还可以结合”-p”选项来设置提示信息,如下
  # read -p "请指定备份的存放目录:" dir
  请指定备份的存放目录:/opt/backup/
  # echo $dir
  /opt/backup/
  之前说过自定义变量都只能在自己的shell里才能用称为局部变量,其实我们可以把局部变量变为全局变量。如下。
  # echo "$system$version"
  centos 6.5
  # export system version   #设置为全局变量
  # bash               #进入子shell环境
  # echo "$system$version"
  centos 6.5
  export也可以在创建变量时直接创建为全局变量如下
  # exportfqnd="www.baidu.com"
  # bash
  # echo $fqnd
  www.baidu.com
  5.数值变量运算
  Expr用于shell里简单的整数运算
  运算符与变量之间至少要有一个空格。
  expr 变量1 运算符变量2 [运算符变量3]……
  运算符包括以下几种
  +:加法                     -:减法          \*:乘法       /:除法         %:取余运算
  如x=5 y=3
  # x=5
  # y=3
  # expr      $x    %       $y
  2
  特殊变量之环境变量
  环境变量指的是出于运行需要由linux系统提前创建的一类变量,主要用于设置用户的工作环境,如宿主目录,命令查找路径,用户当前目录等。使用env可以查看当前工作环境下的环境变量。
  # env |more
  HOSTNAME=localhost.localdomain
  version=6.5
  TERM=linux
  SHELL=/bin/bash
  HISTSIZE=200
  KDE_NO_IPV6=1
  ……………..省略
  PATH是用于设置可执行程序的默认搜索路径。如first.sh在/root/下可用PATH添加,如下
  #PATH="$PATH:/root"
  # echo $PATH
  /usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root
  在Linux中环境变量的全局配置文件在/etc/profile,在此文件中定义的变量作用于所有用户,而每个用户还有自己独立的配置文件(~/.bash_profile),如变更历史命令由1000改为20,
  #vim /etc/profile
  ……//省略
  HISTSIZE=20
  # source /etc/profile          使其配置生效
  # history |wc –l
  20
  特殊变量之位置变量
  位置变量当执行命令脚本时,第一个字段表示命令名或脚本名,其余字符串参数从左至右的顺序依次赋值给位置变量,如下
  # vi export.sh
  #!/bin/bash
  ########位置变量运算脚本#######
  SUM=`expr $1 \* $2`
  echo "$1 \* $2 = $SUM"
  # sh expr.sh 5 6
  5 \* 6 = 30
  特殊变量之预定义变量
  预定义变量是程序以经定义好的变量,用户不能手动创建也不能直接赋值给预定义变量
  常见预定义变量
  $#:表示命令行中位置参数的个数
  $*:表示所有位置参数的内容
  $?:表示上一条命令执行后的状态,返回0为正确其它值均为异常
  $0:表示当前执行的脚本或程序名称

页: [1]
查看完整版本: linux--shell脚本笔记之一。