qns_fengyusong 发表于 2018-8-28 12:50:09

【学神-RHEL6.5】1-17 shell基础及if表达式

  本节所讲内容:
  . shell 基本语法
  . 变量
  . 表达式
  . 判断语句
  . if表达式

[*]  什么叫shell
  【例】先看一个简单的shell程序
# vim example01.sh                            #写入一下内容  
#!/bin/bash
  
#This is to show what a example looks like.
  
echo "Our first example"
  
echo "We ar currently in the following directory"
  
pwd
  
echo "This directory contains the following files"
  
ls
  
# chmod +x example01.sh          #赋予一个可执行权限
  
# ./example01.sh                         #执行该shell程序
  
Our first example
  
We ar currently in the following directory
  
/root
  
This directory contains the following files
  
anaconda-ks.cfg   Music
  
Desktop            Pictures
  
Documents       Public
  
Downloads      qla2xxx-8.07.00.16.06.0-k-dd-rhel6u5-2.6.32-431.el6-x86_64.iso
  
example01.sh         Templates
  
install.log         Videos
  
install.log.syslog
  注释:
  #!/bin/bash #!跟shell命令的完全路径。 作用:显示后期命令以哪种shell来执行这些命令。如不指shell,以当前shell作为执行的shell。
  #This is to show what a example looks like.   在shell中以#开始头表示,整个行就被当作一个注释。执行时被忽略。
  shell程序一般以.sh结尾,表名这是一个shell程序

[*]  1.1shell编程
  先了解一些基本概念
  编程语言:机器语言、汇编语言、高级语言
  静态语言:编译型语言,如C、C++、java等
  动态语言:php、shell、python、perl等
  编译器:又称为解释器,可以将人类的语言翻译成机器理解的语言
  弱类型:变量随时声明,shell就是一种弱类型的编程语言
  强类型:变量在适用前必须事先声明

[*]  1.2创建shell程序的步骤
  第一步:创建一个命令和控制结构的shell文件。
  第二步:赋予这个文件一个可执行的权限,使用chmod +x
  第三步:执行。
  方法1:./ example01.sh
  方法2:使用绝对路径。如# /root/ example01.sh。
  方法3:使用bash或sh来执行。# bash example01.sh。这种执行方法可以没有执行权限。

[*]  shell变量的运用
[*]  变量
  变量是shell传递数据的一种方法。变量是用来代表每个值的符号名。Shell变量分为两类,分别为临时变量和永久变量。
  临时变量:是shell程序内部定义的变量,其使用范围仅限于定义它的程序,对其它程序不可见。
  永久变量:也就是linux系统的环境变量,其值不随shell程序的执行而消失或改变。
  【例】
# echo $PATH  
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
  
# echo $HOME
  
/root
  用户自定义变量:由字母或下划线开头(不允许数字开头),右面有字母、数字或下划线组成,并且大小写字母的意义不同。变量名的长度没有限制。
  注:使用变量时,要在变量名前加上前缀“$”
  2.2 主要的赋值类型
  2.2.1 变量赋值
  赋值号“=”两边应没有空格
  【例】
# A=aaa  
# A = aaa
  
bash: A: command not found
  2.2.2将命令的执行结果赋给变量
  【例】
# A=`date`  
# echo $A
  
Sat Jul 25 20:59:47 CST 2015
  2.2.3 变量的传递
  【例】
# B=$A  
# echo $B
  
Sat Jul 25 20:59:47 CST 2015
  2.2.4利用变量和其他字符串组成一个新的字符串
  【例】
# MYDIR=/home/xuegod  
# echo $MYDIR/zhangsan
  
/home/xuegod/zhangsan
  
# DAY=Mon
  
# echo Today is ${DAY}day
  
Today is Monday
  2.2.5 给变量赋值多个单词
  【例】
# NAME="mike Ron"  
# echo $NAME
  
mike Ron
  
# NAME='shenmk'
  
# echo $NAME
  
shenmk
  2.2.6 单引号的双引号的区别
  单引号:之间的内容原封不动的指定给了变量
  双引号:之间的特殊符号的含义保留
  【例】
# NAME="mike Ron $NAME"  
# echo $NAME
  
mike Ron shenmk
  
# NAME='mike Ron $NAME'
  
# echo $NAME
  
mike Ron $NAME
  2.2.7 把命令当做变量进行定义
  【例】
# wen=`date +%F` #利用反引号进行定义  
# echo $wen
  
2015-07-25
  
# wen=$(date) #利用小括号加$进行定义
  
# echo $wen
  
Sat Jul 25 20:59:47 CST 2015
  2.3 变量的管理
  2.3.1 列出所有的变量
  set 命令
  【例】
# set | grep DAY  
DAY=Mon
  2.3.2 变量的删除
  unset 命令
  【例】
# echo $NAME  
mike Ron $NAME
  
# unset NAME
  
# echo $NAME
  2.4.1 位置变量
  Shell 解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定为参数称为位置参数。使用$N 来表示
  $0 获取当前执行shell脚本的文件名,包括脚本的路径
  $n 获取当前执行shell脚本的第n个参数,当n大于9时用{n}表示
  【例】
# vim ./example.sh  
#!/bin/bash
  
Echo “$0”
  
echo "$1"
  
echo "$2"
  

  
# ./example.sh/etc/passwd/etc/hosts
  
./example.sh
  
/etc/passwd
  
/etc/hosts
  【例】位置变量在服务启动与停止中的应用
# vim /etc/init.d/vsftpd  
case "$1" in                                           #相当于执行/etc/init.d/vsftpd $1
  
start)
  
start                                                         #当选择 start 时调用 start 函数来启动服务
  
;;
  
stop)
  
stop                                                                  #当选择 stop 时调用 stop 函数来停止服务
  
;;
  
restart|reload)                           # 当选择 restart 或者 reload 时先停止服务再启动服务
  
stop
  
start
  
RETVAL=$?
  
;;
  
echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}" #当输入的$1不存在时,利用$0来打印当前执行的脚本
  2.4.2 特殊变量
  有些变量是一开始执行shell脚本时就会设定,且不能被修改,我们称之为特殊变量
  $* 这个程序的所有参数
  $# 这个程序的参数个数
  $$ 这个程序的 PID
  $! 执行上一个后台程序的 PID
  $? 执行上一个命令的返回值
  【例】
# vim z2.sh  
#!/bin/bash
  
echo "$* 表示这个程序的所有参数 "
  
echo "$# 表示这个程序的参数个数"
  
touch /tmp/a.txt
  
echo "$$ 表程序的进程 ID "
  
touch /tmp/b.txt &
  
echo "$! 执行上一个后台命令的 PID"
  
echo "$$ 表程序的进程 ID "
  
执行结果:
  
# ./z2.sh aaabbb ccc
  
aaabbb ccc 表示这个程序的所有参数
  
3 表示这个程序的参数个数
  
3899 表程序的进程 ID
  
3901 执行上一个后台命令的 PID
  
3899 表程序的进程 ID
  关于$?返回值的主要含义
  0
  运行成功
  2
  权限被拒绝
  1-125
  运行失败,命令错误或者参数错误
  126
  找到命令,但不能执行
  127
  未找到命令
  128
  命令被系统强制结束
  2.5 变量的数值计算

[*]  用于执行简单的整数运算
  格式:$((算术运算符))

[*]  常用的算术运算符
  运算符
  含义
  ++ --
  递增和递减,可前置也可后置
  + - ! ~
  一元运算的正负号逻辑与取反
  + - * / %
  加减乘除余数
  = !=
  相等不相等
  =
  比较大小
  >>2))  
0
  
# echo $((1/dev/null                                                #将所有执行信息重定向到null 中
  
[ $? -eq 0 ] && echo "int" || echo "input erro"      #根据expr执行的返回值来判断是否为整数

[*]变量测试语句
[*]  的应用
  格式:test 测试条件
  注意:在使用“[]”简写test时,左中括号后面和右中括号前面必须有空格,如果没有空格则shell不能辨别表达式何时开始何时结束
  5.2 测试的范围
  测试的范围包括整数、字符串、文件
  5.2.1 文件状态的测试
  test -e:目标是否存在(exist)
  test -d:是否为目录(directory)
  test -f:是否为文件(file)
  test -x:文件存在并且可执行
  test -r file:文件存在并且可读
  test -w file:文件存在并且可写
  test -s file 测试大小是为空。是否为空文件
  test File1 –ef File2 两个文件具有同样的设备号和 i结点号
  test File1 –nt File2 文件 1 比文件 2 新
  test File1 –ot File2 文件 1 比文件 2 旧
  test –b File 文件存在并且是块设备文件
  test –c File 文件存在并且是字符设备文件
  test –f File 文件存在并且是正规文件

  test –g File 文件存在并且是设置了组>
  test –G File 文件存在并且属于有效组>  test –h File 文件存在并且是一个符号连接(同-L)
  test –k File 文件存在并且设置了 sticky 位
  test –L File 文件存在并且是一个符号连接(同-h)

  test –o File 文件存在并且属于有效用户>  test –p File 文件存在并且是一个命名管道
  test –t FD 文件描述符是在一个终端打开的
  test –u File 文件存在并且设置了它的 set-user-id 位
  5.2.2 数值的比较
  test -eq:等于(equal)
  test -ne:不等于(Not equal)
  test -gt:大于(greater than)
  test -lt:小于(lesser than)
  test -ge:大于或等于(greater or equal)
  test -le:小于或等于(lesser or equal)
  说明:也可以省略 test 写成:[ int1 -lt int2 ]
  -eq
  ==
  等于(equal)
  -ne
  !=
  不等于(not equa)
  -gt
  >
  大于(greater than)
  -ge
  >=
  大于或等于(greater or equal)
  -lt
  <
  小于(lesser than)
  -le
  
页: [1]
查看完整版本: 【学神-RHEL6.5】1-17 shell基础及if表达式