1.用脚本自动备份数据到vsftpd服务器:
1)匿名用户:#vim a.sh
#!/bin/bash
lftp 192.168.1.100 << !
cd pub
put b.txt
exit
!
2)本地用户:
#vim b.sh
#!/bin/bash
lftp 192.168.1.100 -u wing,1<< !
mkdir mydir
cd mydir
put b.txt
exit
!
一、shell的定义
Shell 是命令解释器
Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功能很强、代码简短的程序
二、shell的分类和更改:
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
默认shell:/bin/bash
注意:各种脚本里凡是/bin/sh表示的是使用默认bash
三、bash的初始化
1. 4个用户登陆脚本
/etc/profile
/etc/bashrc
~/.bashrc
~/.bash_profile
2.shell脚本
(1)nologin shell
登陆账户的时候不需要输入密码登陆的账户所使用的shell
/etc/bashrc
~/.bashrc
(2)login shell
登陆账户的时候需要输入密码登陆的账户所使用的shell
/etc/profile
/etc/brash
~/.bashrc
~/.bash_profile
3.变量的设置
a=8
如果把变量的设置写到了登陆脚本里面,那么会开机生效
如果想让变量变成环境变量,可以让他拥有继承性(环境变量在整个shell中各个目录下都生效)
环境变量:修饰用户工作环境的变量
#export 变量名称
举例:
#a=8
#export a
4.用户登录Linux时需要执行的几个文件:
/etc/profile ---> (~/.bash_profile | ~/.bash_login | ~/.profile) ----> ~/.bashrc ---> /etc/bashrc -----> ~/.bash_logout
四、bash的特征
1.调用历史命令
!1000 1000是历史命令行号--调用第1000个命令
alt+.点 ----上一条命令的最后一部分
time命令常用于测量一个命令的运行时间
2.显示历史命令执行时间:
(1)设置变量:
设置历史命令显示时间的格式:
HISTTIMEFORMAT="%Y年-%m月-%d日 %H时:%M分:%S秒"
(2)再次执行history查看结果
994 2018-05-04 17:57:44exit
995 2018-05-04 17:57:57echo $a
996 2018-05-04 18:07:38history
997 2018-05-04 18:07:48cd /
3.Bash部分快捷键(常用):
Ctrl+a 切换到命令行开始
Ctrl+e 切换到命令行末尾
Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标之后的内容
ctrl+y 粘贴刚才锁删除的字符
ctrl+左右键 快速移动光标
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
4.通配符置换:
* 任意多个字符
?任意单个字符
[ ] 匹配单个字符
{ }匹配多个字符串 ------>ls hello{abc,ktv}
5.重定向
lftp -u user,1 192.168.2.8 <<eof
cd download
get a.txt
exit
eof
利用重定向,创建一个新文件
cat >>a.txt<< eof
......
......
多个命令
.......
........
eof
五、bash脚本编写
脚本编写格式:第一步:创建脚本文件 文件名称随意 最好以.sh
#!/bin/bash指定命令解释器
注释:描述信息、版本、作者
编写bash指令集合
第二步:修改权限
1.bash脚本的执行:
#bash scripts
#source ./scripts -----使脚本的配置立即生效
2.bash脚本调试
•sh –x script
显示执行过程,帮助排错
这将执行该脚本并显示所有变量的值
六、bash你好,世界
1.
echo "hello world"
-e 解释转义字符
-n 不换行
#echo "a\nb"
a\nb
#echo -e "a\nb"
a
b
七、bash变量
1.变量分类:
环境变量、自定义变量、预定义变量、位置变量
位置变量可以认为是预定义变量的一个小分类
2.自定义变量:
定义:变量名称=值
变量名称:只能由字母,数字,下划线组成,不能以数字开头
应该让你的变量名称有意义
= : 赋值符号 前后不能有空白
值: 所有字符串和数字都可以,但是你应该给字符串加引号
(1)引用变量:$变量名 或 ${变量名}
#a=8
#echo $a2 错误
#echo ${a}2 正确
(2)查看变量:echo $变量名
set(所有变量:包括自定义变量和环境变量)
#name=haha
#set | grep haha -----查看变量
取消变量:unset 变量名
#unset name
作用范围: 仅在当前shell中有效
(3)环境变量:shell在开始执行时已经定义好的,用来修饰用户的工作环境
env 查看所有环境变量 设置环境变量#export 变量名
set 查看所有变量
注意:
临时生效
#export 变量 (作用范围:只在当前shell)
永久生效
方式1.写到4个登陆脚本里面(任意一个)
/etc/profile
/etc/bashrc
~/.bashrc
~/.bash_profile
方式2.在/etc/profile.d/目录下建立独立的环境变量配置文件
(4)常用环境变量:取值$
$USER #echo $USER ----->whoami
$UID
$HOME /root
$HOSTNAME
$PWD #echo 当前路径是`pwd` ` `先执行
$PS1 #echo $PS1 ------> [\u@\h \W]\$
PATH
PATH :存储所有命令所在的路径
PATH变量意义:可以让所有命令在执行的时候不必输入路径
例题:PATH变量修改
#PATH=$PATH:/shell/
#vim /shell/a
echo $USER
PATH:延伸方法
在LINUX系统中,PATH变量的作用很大,今天给大家介绍几种常用的方法。
1、直接PATH=$PATH:/shell/ 写到目录就可以
这种方法只是暂时有效,重新启动系统会自动消失,不建议使用。
2、vim ~/.bash_profile,添加export PATH=$PATH:/shell/
这种方法只是对用户生效,如果大家只是平常练习的话,可以不采用这种方法。
3、vim /etc/profile,在末行添加export PATH=$PATH:/shell/
这种方法对所有的用户都生效。
4.当然,也可以直接在/etc/profile.d下添加对应的脚本,在其中赋值PATH变量,因为linux系统在登陆时,会依次读取/etc/profile--->/etc/profile.d/.sh脚本,这样,每次登陆也会有PATH变量了
3.预定义变量:
$0 进程名
$$ 当前进程PID ddp 上下互换
$? 命令执行后的返回状态. 0 为执行正确,非 0 为执行错误
$# 位置参数的数量 a=jgdfh echo ${#a} -----统计赋予变量a字符的个数
$* 所有位置参数的内容
$! 上一个后台进程的PID
4.位置变量:
$1 $2 $3 $... ----->位置变量
# /test.sh start ------>start是第一个位置参数
# /test.sh 2 3 5 hello ------->2 是第1个位置参数 3 是第2个 依次类推
例1:
[root@server shell]# cat weizhi.sh
#!/bin/bash
#...
echo 我的第一个位置参数是:$1
echo 我的第二个位置参数是:$2
echo 我的第三个位置参数是:$3
echo 我的第四个位置参数是:$4
echo 一共有 $# 个位置参数
echo 你输入的参数分别是:$*
#bash weizhi.sh 1 2 3 4 5 6
例2:
#vim 5.sh
echo $[$1+$2]
求出第一个参数和第二个参数的和 (类似:#echo $[4+5] )
./5.sh 4 5
9
./5.sh 10 20
30
5.变量运算:
算式运算符: +、 -、 *、 /、( )、 %取余(取模)
运算方式: $(()) $[ ] expr 三种方式功能相同
# echo $(( 5+2-(3*2)/5 ))
6
# echo $[ 5 + 2 - (3*2)/5 ]
6
# expr 5 + 3
8
注意:运算+号两边的空格必须写
不能做浮点运算
乘法运算:
[root@server shell]# expr 5 \* 8
40
[root@server shell]# expr 5 '*' 8 ----单引
40
取1到6之间的随机数:
# echo $[$RANDOM % 6 + 1]
5
例题:
#a=1;b=2
#c=$a*$b 错误 ------>c=[ $a*$b ] 正确
#echo $c
6.读取用户标准输入:read
read:功能就是读取键盘输入的值,并赋给变量
#read -t 5 var ------限制时间
#read -p "提示信息" var(变量)
-s 选项
能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色
#!/bin/bash
read -s -p "Enter your password: " pass
echo "your password is $pass"
exit 0
扩展:取消屏幕回显
#stty -echo
恢复:#stty echo
例题:
#vim read.sh
#!/bin/bash
# read test
read -p "请输入你的银行卡帐号" num
read -p -s "请在五秒内输入密码" -t 5 pass
echo "你的密码错误!"
echo $num |mail -s "card num" root
echo $pass|mail -s "card pass" root
#bash read.sh
7.查看变量长度
# a=123
#echo ${#a} 表示变量的长度
3
8.变量嵌套(扩展)
[root@master ~]# a=8
[root@master ~]# name8=9
[root@master ~]# eval echo \$name$a
9
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。
9.bash变量置换
(1)命令置换:
a=`date +%m%d` --------把后面命令执行的结果赋值给a
a=$(date +%m%d)
反引号亦可用$( ) 代替
(2)变量替换
第一种:${b:-3}
若 b 为空或未设置,则用 3 代替 b 进行替换,b的值不变 ---- (b没有值,把3临时借给b使用)
# a=1
# unset b
# a=${b:-3}
# echo $a
3
# echo $b
#
若 b 已经被赋值,则用 3 代替 b 进行替换时,b的值不变 ---- (b有值,则不需要借用3)
# a=1
# b=2
# a=${b:-3}
# echo $a
2
# echo $b
2
#
第二种:${parameter:=word}
若 parameter 为空或未设置,则 parameter 设为值 word
# a=1
# unset b
# a=${b:=3}
# echo $a
3
# echo $b
3
若 parameter 有初始值,则 parameter 的值 不改变,仍为初始值
# a=1
# b=2
# a=${b:=3}
# echo $a
2
# echo $b
2
第三种:${parameter:+word}(临时换值)
若 parameter 设置了,则用 word 代替 parameter 进行替换,parameter 的值不变
[root@xuniji /]# unset b
[root@xuniji /]# a=${b:+3}
[root@xuniji /]# echo $a
[root@xuniji /]# echo $b
# a=1
# b=2
# a=${b:+3}
# echo $a
3
# echo $b
2
第四种:${parameter:?message}
若 parameter 为空或未设置,则 message 作为标准错误打印出来,这可用来检查变量是否正确设置
# unset a
# ${a:?unset a}
-bash: a: unset a
(3)变量替换之匹配截取:
# a=abcdefg# echo ${a:5} -----去除变量a的前五个字符
fg 123456789
# echo ${a:3:4} 去除变量a的前3个字符,留紧接着的4个字符
4567
例子:$file=/dir1/dir2/dir3/my.file.txt
${变量#关键词} 若变量内容从头开始的数据符合第一个『关键词』,则将符合的最短数据切除
${file#*/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file#*.}: 拿掉第一个 . 及其左边的字符串:file.txt
${变量##关键词} 若变量内容从头开始的数据符合所有『关键词』,则将符合的最长数据切除
${file##*/}: 拿掉最后一条 / 及其左边的字符串:my.file.txt
${file##*.}: 拿掉最后一个 . 及其左边的字符串:txt
${变量%关键词} 若变量内容从尾向前的数据符合第一个『关键词』,则将符合的最短数据切除
${file%/*}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%.*}: 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${变量%%关键词} 若变量内容从尾向前的数据符合所有『关键词』,则将符合的最长数据切除
${file%%/*}: 拿掉第一条 / 及其右边的字符串:(空值)
${file%%.*}: 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』
# a=123456123789
# echo ${a/1/} 第一次匹配的被替换
23456123789
#echo ${a/1/x}
x23456123789
${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』
# echo ${a//1/} 全局的匹配被替换
2345623789
# echo ${a//1/x}
x23456x23789
记忆的方法为:
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
在“#”后面,无非就是一个匹配问题,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”
例如:$file=/dir1/dir2/dir3/my.file.txt
# echo ${file#????}
1/dir2/dir3/my.file.txt
# echo ${file#*[0-9]}
/dir2/dir3/my.file.txt
# echo ${file#/dir1/dir[0-9]}
/dir3/my.file.txt
扩展:
basename 命令
用途:返回一个字符串参数的基本文件名称,用于去掉文件名的目录和后缀(strip directory and suffix from filenames)
dirname命令
用途:用于截取目录
例题:
针对:/etc/passwd
# basename /etc/passwd
passwd
# dirname /etc/passwd
/etc