bash的特殊符号、变量和运算符
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]#
- bash shell (2) 特殊符号变量
- 高级BASH 编程 笔记(二)BASH必须了解的特殊变量符号
- 特殊运算符实现 两个变量交换
- bash脚本编程之四,整数测试以及特殊变量
- shell学习之—Bash内部变量—位置参数—特殊参数
- shell bash 脚本特殊变量
- bash里的特殊变量
- linux中shell变量,Bash shell中一些比较特殊的符号
- bash脚本编程之四——整数测试及特殊变量
- bash中特殊的变量赋值
- PHP内核探索 —— 预定义变量:PHP脚本运行前将一些特殊变量加到符号表
- vb中变量等价的特殊符号
- 嵌入式 shell相关经典解释如变量以及赋值和特殊符号
- bash 环境中的常见特殊符号
- centos 正则,grep,egrep,流式编辑器 sed,awk -F 多个分隔符 通配符 特殊符号. * + ? 总结 问加星 cat -n nl 输出文件内容并加上行号 alias放~/.bash_profile 2015-4-10 第十三节课
- Linus Bash Shell 的特殊变量和关系运算符
- shell-特殊变量 重定向 运算符
- shell基础-bash变量-数值运算与运算符
- 运算符和特殊变量
- bash通配符与特殊符号