bash工作特性:
1.支持命令历史、命令补全
2.支持管道、重定向
3.支持命令别名
4.支持命令行编辑
5.支持命令行展开
6.支持文件名通配
7.支持使用变量
8.支持编程
命令编辑:
光标跳转:ctrl+a:跳到命令行首 home
ctrl+e:跳到命令行尾 end
ctrl+u:删除光标至命令行首的内容
ctrl+k:删除光标至命令行尾的内容
ctrl+l:清屏 clear
命令历史:bash会自动记录过去曾经执行过的命令,会保存到内存缓存中
↑或者history
history -w:将缓存中的命令历史保存到历史文件中.bash_history
history -c:清空命令历史
命令历史的使用技巧:
!n:执行命令历史中第N条命令
!-n:执行命令历史中倒数第N条命令
!!:执行上一条命令
!string:执行命令历史中最近的一个以指定字符串开头的命令
!$:引用前一个命令的最后一个参数
先按esc松开再按。(点)
一起按alt+。(点)
bash支持的引号:
` `:命令替换
" ":弱引用,可以实现变量替换
‘ ‘:强引用,不可以实现变量替换
文件名通配:
*:匹配任意长度的任意字符
?:任意单个字符
[]:匹配指定范围内的任意字符
[a-z] [a-zA-Z] [a-z0-9]
[^]:匹配指定范围之外的任意字符
[^0-9]
shell 基本语法
变量
表达式
判断语句
if表达式
shell基础:
#!/bin/bash -->shbang-解释shell的绝对路径
作用:显示后期命令以哪种shell来执行这些
命令。如不指shell,以当前shell作为执行的shell
两种注释:
#
;
shell程序一般以sh结尾
创建执行shell程序的步骤
第一步:创建一个包含命令和控制结构的shell文件。
第二步:修改这个文件的权限使它可以执行。
使用chmod u+x
第三步:执行
方法1:[[email protected] shell]# ./expr.sh
方法2:使用绝对路径 [[email protected] ~]# /root/shell/expr.sh
方法3:[[email protected] ~]# bash /root/shell/expr.sh
方法1,2需要给x权限,方法3不用,直接bash
=======================================================================
shell变量-->内存空间,命名
变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。
Shell 有两类变量:临时变量和永久变量。
临时变量:是shell 程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。
永久变量:是环境变量,其值不随shell 脚本的执行结束而消失。
=======================================================================================
变量命名规则:
1.只能包含字母,数字和下划线,并且不能数字开头
2.不应跟系统中已有的环境变量重名
3.见名知意
环境变量
定义:作用域为当前shell进程及其子进程
查看环境变量:
echo $PATH
env
用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。
export VARNAME=VALUE
脚本在执行时会启动一个子shell进程
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
用户定义变量-->本地变量
set VARNAME=VALUE:作用域整个bash进程
由字母或下划线打头。 由字母、数字或下划线组成,并且大小写字母意义不同。变量名长度没有限制
?使用变量值时,要在变量名前加上前缀 "$”
局部变量:
local VARNAME=VALUE :作用域为当前代码段
变量赋值:赋值号“=”两边应没有空格。
[[email protected] ~]# A=`date`
[[email protected] ~]# echo $A
Fri Apr 24 17:18:46 CST 2015
PATH=$PATH:. 当前路径添加进环境变量--不安全
[[email protected] ~]# P=${PATH} 把PATH变量值赋给P
[[email protected] ~]# echo $P
[[email protected] ~]# T=$(date) 命令--动作
[[email protected] ~]# T=`date` 同上
[[email protected] ~]# echo $T
脚本里面的执行结果传不到外面,是独立
脚本执行时新建了个子shell ,独立
可以利用变量和其它字符组成一个新的字符串。
[[email protected] ~]# MYDIR=/home/test01
[[email protected] ~]# echo "$MYDIR/ttt"
/home/test01/ttt
[[email protected] ~]# echo Today is $DAYday
Today is
[[email protected] ~]# echo Today is $DAY day
Today is mon day
[[email protected] ~]# echo Today is ${DAY}day
Today is monday
列出所有的变量:
set 命令
[[email protected] ~]# set | grep DAY
DAY=mon
给变量赋值多个单词:
[[email protected] ~]# NAME="hh-ll"
[[email protected] ~]# echo $NAME
hh-ll
[[email protected] ~]# NAME=‘gg kk‘
[[email protected] ~]# echo $NAME
gg kk
[[email protected] ~]# NAME="jj uu $NAME"
[[email protected] ~]# echo $NAME
jj uu hh ll
[[email protected] ~]# NAME=‘jj uu $NAME‘
[[email protected] ~]# echo $NAME
jj uu $NAME
单引号和双引号的区别:
单引号之间的内容原封不动地指定给了变量。
双引号取消了空格的作用,特殊符号的含义保留。
位置变量:Shell解释执行用户的命令时,
将命令行的第一个字作为命令名,而其它字作为参数
。由出现在命令行上的位置确定的参数称为位置参数。
位置变量:使用$N 来表示
$1,$2,....
[[email protected] test]# ./example.sh file1 file2 file3
$0 这个程序的文件名 example.sh
$n 这个程序的第n个参数值,n=1..N
特殊变量:
有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读
的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,
以下是一些等殊变量:
$?:上一个命令执行状态返回值:
程序执行后,可能有两类返回值
程序的执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行。1,2,127系统预
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个后台程序的PID
[email protected]: 这个程序的参数列表
引用变量:${VARNAME} {}有时可省略
撤销变量:
unset VARNAME
查看当前shell中变量
set
查看当前shell中的环境变量
printenv
env
eport
特殊变量,位置变量没法查看
===========================================================================
Read命令:
作用:从键盘读入数据,赋给变量
[[email protected] ~]# read a b c
8 9 12
[[email protected] ~]# echo $a $b $c
8 9 12
在shell脚本中使用
[[email protected] ~]# read a b
1 2 3
You have new mail in /var/spool/mail/root
[[email protected] ~]# echo $b
2 3
[[email protected] ~]# read a b c
1 2
[[email protected] ~]# echo $c
expr 命令
作用:Shell变量的算术运算:
expr命令:对整数型变量进行算术运算
语法: expr 表达式 #注意 运算符之间要有空格
+: expr 3 + 5
-:expr $var1 - 5
*:expr $var1 \* $var2
/ :expr $var1 / $var2
复杂的运算:
var4=8
expr `expr 5 + 11` / $var4
bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[ expression ]
[ [ expression ]
整数比较:
-eq:测试两个整数是否相等
$A -eq $B
echo $?
0 or 1
-ne:测试两个整数是否不等:不等为真,相等为假
-gt:测试一个数是否大于另一个数:大于为真
-lt:测试一个数是否小于另一个数:小于为真
-ge:大于或等于
-le:小于或等于
字符串测试:
==:等值比较,等为真
!=:不等比较,不等为真
>:大
<:小
-n string 测试指定字符串是否为空,空则真,不空则假
-s string 测试指定字符串是否不空,不空则真,空则假
文件测试:
-e FILE :文件是否存在
-f FILE : 测试文件是否为普通文件
-d FILE : 测试指定路径是否为目录
-r FILE :测试当前用户对指定文件是否有读权限
-w FILE :.............................写权限
-x FILE:..........................执行权限
-s FILE:测试文件是否为空
命令间的逻辑关系
逻辑与:&&或-a
第一个条件为假时,第二个条件不用再判断,最终结果已经有;
第一个条件为真时,第二个条件必须再判断
id ylion &> /dev/null && echo "hello ylion
! id user1 && useradd user1
逻辑或:||或-o
逻辑或 。 两个条件有一个成立 ,结果为真
id user1 || useradd user1
非:!
取反
===============================================================
流程控制
顺序
选择
循环
选择结构之if语句
单分支if语句
if 判断条件; then
statement1
statement2
.........
fi
双分支if语句
if 判断条件; then
statement1
statement2
....
else
statement3
statement4
....
fi
多分支if语句:
if 判断条件1; then
statement1
....
elif 判断条件2; then
statement2
.....
elif 判断条件3; then
statement3
.....
else
statement4
......
fi
shell中如何进行算术运算
1.let 算术运算表达式
let c=$a+$b
echo $c
2.$[算术运算表达式]
c=$[$a+$b]
3.$((算术运算表达式))
c=$(($a+$b))
4.expr 算术运算表达式 表达式中各操作数及运算符之间要有空格,而且使用命令引用
c=`expr $a + $b `
定义脚本退出状态码
exit:退出脚本
定义脚本执行状态结果
exit # 0-255
如果脚本没有明确定义退出状态码。那么最好执行的一条命令的退出码即为脚本退出状态码
1.精确找出有效的IP地址
2.写一个脚本,完成以下要求
(1)添加3个用户test1、test2、test3,并设置密码。但要先判断用户是否存在,不存在则添加
(2)显示当前系统共有多少个用户
3.写一个脚本,完成以下要求
指定一个存在的用户,自己用变量保存
(1)如果其UID为0,则显示此用户为管理员
(2)否则,就显示其为普通用户