第五节 bash变量

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 /]# a=1
[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








猜你喜欢

转载自blog.csdn.net/bijingzhao123/article/details/80199095