您的位置:首页 > 运维架构 > Shell

bash的特殊符号、变量和运算符

2020-06-03 04:46 309 查看

Bash 中其他特殊符号


单引号&双引号

[root@localhost ~]#name=qyy     #给变量name赋值,值为:qyy
[root@localhost ~]#echo $name
qyy
[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 $name
dongxu
[root@localhost ~]# (name=laow;echo $name)
laow
[root@localhost ~]# echo $name
dongxu

{ } 执行命令时,就在本shell中进行,覆盖掉原有的

[root@localhost ~]# { name=laoq;echo $name; }
laoq
[root@localhost ~]# echo $name
laoq

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 $s
455+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 $name
laoq
[root@localhost ~]# name="$name laow"
[root@localhost ~]# echo $name
laoq laow
[root@localhost ~]# name="${name} laot"
[root@localhost ~]# echo $name
laoq laow laot
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
[root@localhost ~]# time=`date`
[root@localhost ~]# echo $time
Wed Apr 29 05:19:19 EDT 2020
[root@localhost ~]# dir=$(ls)
[root@localhost ~]# echo $dir
anaconda-ks.cfg hello.sh

变量的分类
自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。比如:PAHT
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。比如:n预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:n 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:n预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。比如:?
用户自定义变量
注意:切记变量的命名规范!(空格、名称、引号等)
1) 变量调用

echo $变量名
[root@localhost ~]# echo $name
laoq 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 laot
laoq laow laot

3) 变量删除
unset 变量名
环境变量
注:我们很少自行定义环境变量,一般都是对系统设置好的进行修改
1) 环境变量设置

export  AGE=18
#export 声明的是环境变量

2) 环境变量查询和删除
env命令和set命令的区别:set命令查看所有变量,env命令只能查看环境变量。

[root@localhost ~]# set | grep NAME
HOSTNAME=localhost.localdomain
LOGNAME=root
NAME=laow
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
[root@localhost ~]# set | grep AGE
AGE=18
[root@localhost ~]# env | grep NAME
HOSTNAME=localhost.localdomain
LOGNAME=root
[root@localhost ~]# env | grep AGE
AGE=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 $LANG
en_US.UTF-8

Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”。
Linux中到底支持多少语系呢?我们可以使用以下命令查询:

[root@localhost ~]# localectl list-locales | tail -5
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.iso88591
zu_ZA.utf8

永久修改操作系统语言环境

[root@localhost ~]# cat /etc/locale.conf
LANG="zh_CN.UTF-8"
[root@localhost ~]# localectl set-locale LANG=en_US.utf8       #该命令直接修改配置文件

注意:LANG变量的值会随着登录终端是否支持中文而改变。
$N 位置参数变量:通过位置进行变量赋值和取值

[root@localhost sh]#cat xx.sh
#!/bin/bash

echo $0
echo $1
echo $3
echo $4

[root@localhost sh]#chmod +x xx.sh
[root@localhost sh]#./xx.sh avs sdf der get
./xx.sh
avs
der                 #其中只有第二个没有显示
get

∗和*和∗和@区分、$#参数的讲解

[root@localhost sh]#cat a.sh
o "Number of values:$#"
#统计一共有多少个字符串(值的个数)。

n=1
for i in "$@"
#此处在通过$*或者$@向脚本内传递值的时候,必须使用""才有效果~!
do
echo "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 found
Value of position 1:a1
Value of position 2:a2
Value of position 3:a3
Value of position 4:a4     #当是$@时是一个一个的输出
Value of position 5:a5
Value of position 6:a6
Value of position 7:a7
Value of position 8:a8
[root@localhost sh]#cat a.sh
o "Number of values:$#"
#统计一共有多少个字符串(值的个数)。

n=1
for i in "$*"      #注意智力的变化
#此处在通过$*或者$@向脚本内传递值的时候,必须使用""才有效果~!
do
echo "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 found
Value of position 1:a1 a2 a3 a4 a5 a6 a7 a8    #当是$*时是整体输出

一些小的脚本操作:
脚本1:实现算法的加减乘除

[root@localhost sh]#cat b.sh
cribe: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关键词的文件
do
grep "DNS" $i &> /dev/null
#执行成功打印出来
[ $? == 0 ] && echo $i

done

脚本效果

[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/de@hebrew.mo
/boot/grub2/locale/de_CH.mo
/boot/grub2/locale/en@arabic.mo
/boot/grub2/locale/en@cyrillic.mo
/boot/grub2/locale/en@greek.mo
#有很多我就不一一列出

$*显示所有参数(作为整体接收并传递到脚本内)
$@显示所有参数(分开接收,依次传递到脚本内)
$#显示参数个数
预定义变量

$?:命令执行成功:返回值为0;命令执行失败:返回值为非0

[root@localhost sh]#ls
a.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 grep
root       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 grep
root       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 age
echo
#输入性别 输入一个字符串自动换行
echo -n "Please enter your gender(m/w):"
read -n 1 gender
echo
#输入手机号 隐藏信息
echo -n "Please enter your phone number:"
read -s pn
echo
#输入住址
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.sh
Please enter your name:qiyouyin
Please enter your age(10 seconds):23

Please enter your gender(m/w):m
Please enter your phone number:
Please enter your home address:shangdong
******qiyouyin Personal Information *******
Name:qiyouyin
Age:23
Gender:m
Phone Number:18315863515
Home Addres:shangdong
[root@localhost sh]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: