Bash 中其他特殊符号
单引号&双引号
[root@localhost ~]#name=qyy #给变量name赋值,值为:qyy[root@localhost ~]#echo $nameqyy[root@localhost ~]#echo \"$name\"qyy[root@localhost ~]#echo \'$name\'$name
反引号 & $()
[root@localhost ~]# echo `date`Wed Apr 29 03:48:46 EDT 2020 #两者的意思是一样的[root@localhost ~]# echo $(date)Wed Apr 29 03:49:48 EDT 2020
小括号、中括号、大括号
强调事项:()执行一串命令时,需要重新开一个子shell进行执行{}执行一串命令时,是在当前shell执行()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开()最后一个命令可以不用分号结尾{}最后一个命令要用分号结尾{}的第一个命令和左括号之间必须要有一个空格()里的各命令不必和括号有空格
操作验证:
() 中执行命令时,新开启shell 进行,不覆盖原来的
[root@localhost ~]# name=dongxu[root@localhost ~]# echo $namedongxu[root@localhost ~]# (name=laow;echo $name)laow[root@localhost ~]# echo $namedongxu
{ } 执行命令时,就在本shell中进行,覆盖掉原有的
[root@localhost ~]# { name=laoq;echo $name; }laoq[root@localhost ~]# echo $namelaoq
Bash的变量和运算符
定义变量的规范
变量是计算机语言中能储存计算结果或表示指抽象概念,变量可以通过变量名访问,在指令式语言中,变量即可变化的量。
注:变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。
变量不能以数字开头[root@localhost ~]# 2name=dongxu-bash: 2name=dongxu: command not found在Bash中,变量的默认类型都是字符串型,若要进行数值运算,必须修改变量类型为数值型。[root@localhost ~]# x=455[root@localhost ~]# y=700[root@localhost ~]# s=$x+$y[root@localhost ~]# echo $s455+700在赋予变量是等号两边不能有空格[root@localhost ~]# name= shangxue-bash: shangxue: command not found[root@localhost ~]# name =shangxue-bash: name: command not found
注:变量的值如果有空格,需要使用单引号或双引号包括。如:name=\"hello world\"。其中双引号内的符号\"$\"、“\\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符
变量叠加
如果需要增加变量的值,那么可以进行变量值的叠加。
格式:变量名= “变量名新增值\”或变量名=\”变量名 新增值\” 或 变量名= \”变量名新增值\”或变量名=\”{变量名} 新增值”
注意:因为是在原变量值的基础增加内容,多数会用到空格,那么必须用双引号才可以
[root@localhost ~]# echo $namelaoq[root@localhost ~]# name=\"$name laow\"[root@localhost ~]# echo $namelaoq laow[root@localhost ~]# name=\"${name} laot\"[root@localhost ~]# echo $namelaoq laow laot
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。[root@localhost ~]# time=`date`[root@localhost ~]# echo $timeWed Apr 29 05:19:19 EDT 2020[root@localhost ~]# dir=$(ls)[root@localhost ~]# echo $diranaconda-ks.cfg hello.sh
变量的分类
自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。比如:PAHT
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。比如:n预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:n预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:n预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:?
用户自定义变量
注意:切记变量的命名规范!(空格、名称、引号等)
1) 变量调用
echo $变量名[root@localhost ~]# echo $namelaoq laow laot
2) 变量查看
set [选项] #开启针对变量的某些特定功能
-u :调用没有声明的变量时会报错
+u :关闭
[root@localhost ~]# echo $xxx[root@localhost ~]# set -u[root@localhost ~]# echo $xxx-bash: xxx: unbound variable
-x :命令执行前,会先把命令输出一次
[root@localhost ~]# set -x[root@localhost ~]# echo $name+ echo laoq laow laotlaoq laow laot
3) 变量删除
unset 变量名
环境变量
注:我们很少自行定义环境变量,一般都是对系统设置好的进行修改
1) 环境变量设置
export AGE=18#export 声明的是环境变量
2) 环境变量查询和删除
env命令和set命令的区别:set命令查看所有变量,env命令只能查看环境变量。
[root@localhost ~]# set | grep NAMEHOSTNAME=localhost.localdomainLOGNAME=rootNAME=laowPROMPT_COMMAND=\'printf \"\\033]0;%s@%s:%s\\007\" \"${USER}\" \"${HOSTNAME%%.*}\" \"${PWD/#$HOME/~}\"\'[root@localhost ~]# set | grep AGEAGE=18[root@localhost ~]# env | grep NAMEHOSTNAME=localhost.localdomainLOGNAME=root[root@localhost ~]# env | grep AGEAGE=18
3) 系统默认的环境变量(PATH、PS1、LANG)
PATH变量:系统命令存放路径
[root@localhost ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
说明:PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个命令时,命令没有设置别名,并且也没有写命令的相对或绝对路径时,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
让脚本像执行命令一样简单
方法一:可以考虑把自己写的脚本放入PATH对应的目录内
方法二:修改PATH变量的值,将我们存放脚本的目录叠加到PATH变量中
[root@localhost ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@localhost ~]# PATH=\"$PATH:/sh\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sh
注意:以上操作仅仅临时生效,重启后则失效,要实现永久生效需要写入配置文件才行
单用户生效:~/.bash_profile所有用户生效:/etc/profile
PS1变量:命令提示符设置
PS1是用来定义命令行的提示符的,可以按照我们自己的需求来定义提示符。
可用选项:
\\d:显示日期,格式为“星期月日”\\H:显示完整的主机名。如默认主机名“localhost.localdomain”\\h:显示简写主机名。如默认主机名“localhost”\\t:显示24小时制时间,格式为“HH:MM:SS”\\T:显示12小时制时间,格式为“HH:MM:SS”\\A:显示24小时制时间,格式为“HH:MM”\\@:显示12小时制时间,格式为“HH:MM am/pm”\\u:显示当前用户名\\v:显示Bash的版本信息\\w:显示当前所在目录的完整名称\\W:显示当前所在目录的最后一个目录\\#:执行的第几个命令\\$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$”PS1的默认格式:
定义PS1变量值时需要注意单引号,否则不生效
修改格式
LANG变量:系统语系变量
LANG定义的是Linux 的语言环境变量:
[root@localhost ~]#echo $LANGen_US.UTF-8
Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”。
Linux中到底支持多少语系呢?我们可以使用以下命令查询:
[root@localhost ~]# localectl list-locales | tail -5zh_TW.euctwzh_TW.utf8zu_ZAzu_ZA.iso88591zu_ZA.utf8
永久修改操作系统语言环境
[root@localhost ~]# cat /etc/locale.confLANG=\"zh_CN.UTF-8\"[root@localhost ~]# localectl set-locale LANG=en_US.utf8 #该命令直接修改配置文件
注意:LANG变量的值会随着登录终端是否支持中文而改变。
$N 位置参数变量:通过位置进行变量赋值和取值
[root@localhost sh]#cat xx.sh#!/bin/bashecho $0echo $1echo $3echo $4[root@localhost sh]#chmod +x xx.sh[root@localhost sh]#./xx.sh avs sdf der get./xx.shavsder #其中只有第二个没有显示get
∗和*和∗和@区分、$#参数的讲解
[root@localhost sh]#cat a.sho \"Number of values:$#\"#统计一共有多少个字符串(值的个数)。n=1for i in \"$@\"#此处在通过$*或者$@向脚本内传递值的时候,必须使用\"\"才有效果~!doecho \"Value of position $n:$i\"#按照对应位置将对应值打印出来。let n=n+1#用来定位第n个位置,实现自动累加。done[root@localhost sh]#chmod +x a.sh[root@localhost sh]#./a.sh a1 a2 a3 a4 a5 a6 a7 a8./a.sh: line 1: o: command not foundValue of position 1:a1Value of position 2:a2Value of position 3:a3Value of position 4:a4 #当是$@时是一个一个的输出Value of position 5:a5Value of position 6:a6Value of position 7:a7Value of position 8:a8
[root@localhost sh]#cat a.sho \"Number of values:$#\"#统计一共有多少个字符串(值的个数)。n=1for i in \"$*\" #注意智力的变化#此处在通过$*或者$@向脚本内传递值的时候,必须使用\"\"才有效果~!doecho \"Value of position $n:$i\"#按照对应位置将对应值打印出来。let n=n+1#用来定位第n个位置,实现自动累加。done[root@localhost sh]#./a.sh a1 a2 a3 a4 a5 a6 a7 a8./a.sh: line 1: o: command not foundValue of position 1:a1 a2 a3 a4 a5 a6 a7 a8 #当是$*时是整体输出
一些小的脚本操作:
脚本1:实现算法的加减乘除
[root@localhost sh]#cat b.shcribe:This is a simple calculator.echo -e \"\\e[31;1m*********************************\\e[0m\"echo -e \"\\e[34;1m*******Project: calculator*******\\e[0m\"echo -e \"\\e[34;1m*Format: ./sum.sh num1 sign num2*\\e[0m\"echo -e \"\\e[34;1m*********Sign: + - * / **********\\e[0m\"echo -e \"\\e[31;1m*********************************\\e[0m\"echo $1$2$3=$(($1$2$3))#等号前边的$1$2$3用来描述计算公式,等号后的$1$2$3用来完成实际计算:$((计算公式))用来数值计算
脚本实现的作用
加法[root@localhost sh]#./b.sh 77+88./b.sh: line 1: cribe:This: command not found****************************************Project: calculator********Format: ./sum.sh num1 sign num2**********Sign: + - * / *******************************************77+88=165乘法[root@localhost sh]#./b.sh 3*4./b.sh: line 1: cribe:This: command not found****************************************Project: calculator********Format: ./sum.sh num1 sign num2**********Sign: + - * / *******************************************3*4=12除法[root@localhost sh]#./b.sh 12/4./b.sh: line 1: cribe:This: command not found****************************************Project: calculator********Format: ./sum.sh num1 sign num2**********Sign: + - * / *******************************************12/4=3减法[root@localhost sh]#./b.sh 12-4./b.sh: line 1: cribe:This: command not found****************************************Project: calculator********Format: ./sum.sh num1 sign num2**********Sign: + - * / *******************************************12-4=8
**脚本2:**实现在Linux系统中带有关键词:DNS,找出所包含DNS这个关键词的文件,并将文件名打印出来
[root@localhost sh]#cat c.sh#!/bin/bash#筛选普通文件for i in `find / -type f`#之后过滤带有DNS关键词的文件dogrep \"DNS\" $i &> /dev/null#执行成功打印出来[ $? == 0 ] && echo $idone
脚本效果
[root@localhost sh]#./c.sh/boot/grub2/i386-pc/net.mod/boot/grub2/locale/ca.mo/boot/grub2/locale/da.mo/boot/grub2/locale/de.mo/boot/grub2/locale/[email protected]/boot/grub2/locale/de_CH.mo/boot/grub2/locale/[email protected]/boot/grub2/locale/[email protected]/boot/grub2/locale/[email protected]#有很多我就不一一列出
$*显示所有参数(作为整体接收并传递到脚本内)
$@显示所有参数(分开接收,依次传递到脚本内)
$#显示参数个数
预定义变量
$?:命令执行成功:返回值为0;命令执行失败:返回值为非0
[root@localhost sh]#lsa.sh b.sh xx.sh[root@localhost sh]#echo $? #操作成功0[root@localhost sh]#lls-bash: lls: command not found #操作失败[root@localhost sh]#echo $?127
$$:当前进程的PID(即显示当前登录shell的进程号)
[root@localhost sh]#echo $$7434[root@localhost sh]#ps aux | grep 7434 | grep -v greproot 7434 0.0 0.2 115440 2068 pts/1 Ss 22:21 0:00 -bash$!:最后一个放入后台执行的命令的进程[root@localhost sh]#dd if=/dev/zero of=/dev/null & #后面加&符是后台持续执行的意思[1] 7520[root@localhost sh]#echo $!7520[root@localhost sh]#ps aux | grep 7520 | grep -v greproot 7520 99.3 0.0 107996 616 pts/1 R 23:04 0:23 dd if=/dev/zero of=/dev/null
read 接收键盘输入,完成交互式操作
read [选项] [变量名]
-p “提示信息”:在read等待时输入的信息
-t 秒数 :read等待的秒数
-n 字符数:read最多能接收的字符数(达标即执行)
-s :隐藏输入信息
[root@localhost sh]# cat d.sh#!/bin/bash#输入名字 后面的name是变量read -p \"Please enter your name:\" name#输入年龄 等待10秒自动设置为空echo -n \"Please enter your age(10 seconds):\"read -t 10 ageecho#输入性别 输入一个字符串自动换行echo -n \"Please enter your gender(m/w):\"read -n 1 genderecho#输入手机号 隐藏信息echo -n \"Please enter your phone number:\"read -s pnecho#输入住址echo -n \"Please enter your home address:\"read addr#高亮显示 打印出上边信息echo -e \"\\e[33;1m******$name Personal Information *******\\e[0m\"echo \"Name:$name\"echo \"Age:$age\"echo \"Gender:$gender\"echo \"Phone Number:$pn\"echo \"Home Addres:$addr\"[root@localhost sh]# chmod +x d.sh[root@localhost sh]# ./d.shPlease enter your name:qiyouyinPlease enter your age(10 seconds):23Please enter your gender(m/w):mPlease enter your phone number:Please enter your home address:shangdong******qiyouyin Personal Information *******Name:qiyouyinAge:23Gender:mPhone Number:18315863515Home Addres:shangdong[root@localhost sh]#