【学神-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]