Shell-Bash变量与运算符

1、Bash中变量定义的规则 说明:

  • 变量名称,有字母,数字和下划线组成,但是不能以数字开头
  • 在 Bash 中变量的默认类型是字符串类型,如果需要定义数值类型需要特殊声明
  • 变量定义使用等号连接,等号左右两边不能有空格
  • 变量的值如果有空格,需要使用单引号或者双引号包括起来。
  • 使用$变量名 或者 ${变量名} 可以进行变量值的叠加
  • 将命令的结果复制给变量,需要使用反引号,或者$()包含命令
  • 环境变量建议大写
样例:
命令复制给变量: curDate=$(date) echo curDate

2、变量的分类 (1)说明:
  • 用户自定义变量: 由用户自由定义变量名和变量值,
  • 环境变量:环境变量分为系统环境变量和用户环境变量。其中系统环境变量不允许修改变量名称和变量作用,允许修改变量内容。而用户环境变量是允许修改的。
  • 位置参数变量: 用来向脚本中传递参数或数据,变量名不能自定义,变量作用也是固定的,但是变量内容是自定义的。
  • 预定义变量: Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
(2)样例:
用户自定义变量: variableTest='test value'

(3) 变量比较
变量类型 名称 作用 内容
用户自定义变量 允许自定义 允许自定义 允许自定义
环境变量 禁止自定义 禁止自定义 允许自定义
位置参数变量 禁止自定义 禁止自定义 允许自定义
预定义变量 禁止自定义 禁止自定义 允许自定义
3、用户自定义变量 (1)变量的定义
varName='varContent'# 注意左右两边不能有空格

(2) 调用变量
echo $varName

(3) 变量查看 set命令说明:
set[选项] 选项: -u: 设定此项后,调用未声明的变量会报错。重启会失效。在未设置的情况下,Bash 自身无法区分空变量和未定义变量. -x: 设定此项之后,在命令执行之前会先把命令输出一次。

(4) 变量删除 unset 命令说明:
unset[选项] 选项: -f: 仅删除函数。 -v: 仅删除变量。

unset 样例:
lh="ls -lh"#定义变量 $lh # 使用变量 unset -v lh#删除变量

4、环境变量 (1)环境变量设置: export命令说明:
  • export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。
export命令语法:
export [选项] [变量名称]=[变量设置值] [选项]: -f代表[变量名称]中为函数名称。 -n删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。 -p列出所有的shell赋予程序的环境变量。

export命令样例:
export varName="varcontent"# 使用 export 声明环境变量

(2)环境变量查看 env命令说明:
  • env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。该命令只使用"-"作为参数选项时,隐藏了选项"-i"的功能。
  • 若没有设置任何选项和参数时,则直接显示当前的环境变量。
env命令语法:
env [选项] [参数] [选项]: -i:开始一个新的空的环境; -u;<变量名>:从当前环境中删除指定的变量。 [参数]: 变量定义:定义在新的环境中变量,定义多个变量定义用空格隔开。格式为“变量名=值”; 指定:指定要执行的指令和参数。

env命令样例:
[命令]: env | egrep -i "HOME"#查询系统变量中USER和HOME [结果]: PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Volumes/Document/apache-maven-3.3.9/bin::/Users/luoqing/.rvm/bin JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home M2_HOME=/Volumes/Document/apache-maven-3.3.9 HOME=/Users/luoqing JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home

(3)系统自带环境变量 PATH:系统查找命令的路径 样例:
echo $PSTH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/luoqing/.rvm/bin

自定义脚本执行:
  • 将脚本复制到 PATH 中的某个目录下: cp ./shell.sh /usr/local/bin
  • 将脚本路径添加到系统环境变量中: PATH=${PATH}:/Users/luoqing/test/
PS1:命令提示符设置 样例:
echo $PS1 [\u@\h \w]\$#

LANG:定义Linux系统的主语系环境 样例:
[命令]: echo $LANG [结果]: zh_CN.UTF-8

5、位置参数变量 说明:
位置参数变量 作用说明
$n n 为数字,9分别代码第一到第九个参数,10 以上的参数需要用${n}
$* $*会把所有的参数看作是一个整体
$@ 该变量代表命令行中的所有参数,区别在于$@会把每个参数区别对待
&# 该变量代表命令行中所有参数的个数
样例:
[脚本]: #!/bin/bash echo "验证结果:" echo "=======验证\$n=======" varA=$1 varB=$2 sum=$(($varA+$varB)) echo $sum echo $0 echo "=======验证$@======" echo "\$@ is $@" for i in "$@" do echo $i done echo "======验证$*======" echo "\$* is &*" for j in "$*" do echo $j done echo "\$* is $*" echo "=====验证\$#====" echo "\&# is $#"[结果]: =======验证$n======= 3 ./count.sh =======验证1 2 3 4 5====== $@ is 1 2 3 4 5 1 2 3 4 5 ======验证1 2 3 4 5====== $* is &* 1 2 3 4 5 $* is 1 2 3 4 5 =====验证$#==== \&# is 5

6、预定义变量 说明:
预定义变量 作用
$? 最后一次 执行的命令返回的状态 ,如果这个变量的值为0,证明上一个命令正确结束。非0则命令执行异常。
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
样例:
[脚本]: #!/bin/bash echo "======验证预定义变量====" echo "===\$?===" pwd num=$? echo $num echo "===\$$===" echo "\$\$ is $$"echo "===\$!===" echo "\$! is $!"[结果]: ======验证预定义变量==== ===$?=== /Users/luoqing/Desktop/shellFile 0 ===$$=== $$ is 5562 ===$!=== $! is

7、接收键盘输入 命令:
read [选项] [变量名] [选项]: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 [变量名]: 指定读取值的变量名。

样例:
[命令]: #!/bin/bash echo "====read demo start...====" read -t 30 -p "please input var A:" varA read -t 30 -p "please input var B:" varB sum=$(($varA + varB)) echo "result is :"$sum [结果]: ====read demo start...==== please input var A:12 please input var B:12 result is :24

8、shell的运算符 (1) 数值运算的方法 declare 命令 说明:
  • declare命令用于声明和显示已存在的shell变量。当不提供变量名参数时显示所有shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。
  • declare的功能与typeset命令的功能是相同的。
语法:
declare [选项] [参数] [选项]: +/-:"-"可用来指定变量的属性,"+"则是取消变量所设的属性; -f:仅显示函数; -a: 将变量声明为数组类型 -i:将变量声明为整数型 -r:将变量设置为只读; -x:指定的变量会成为环境变量,可供shell以外的程序来使用; [参数]: shell变量:声明的shell变量,格式为“变量名=值”。

样例:
[脚本]: #!/bin/bash echo "====declare start...====" varA=11 varB=22 sum=$varA+$varB echo "===未使用declear is: "$sum declare -i sumDeclare=$varA+$varB echo "===使用declear is: "$sumDeclare [结果]: ====declare start...==== ===未使用declear is: 11+22 ===使用declear is: 33

expr 命令:数据运算工具 说明:
  • expr命令是一款表达式计算工具,使用它完成表达式的求值操作。
    语法:
expr [选项] [参数] [选项]: --help:显示指令的帮助信息; --version:显示指令版本信息。 [参数]: 需要计算的表达式

样例:
[脚本]: #!/bin/bash echo "====expr start...====" num1=12 num2=13 # expr 运算符左右两侧必须要有空格 sum=$(expr $num1 + $num2) echo "result:"$sum [结果]: ====expr start...==== result:25

let命令 说明:
  • let命令是bash中用于计算的工具,提供常用运算符还提供了方幂**运算符
  • 在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1
语法:
let arg [arg ...]#arg代表运算式

样例:
[脚本]: #!/bin/bash echo "====let start...====" varA=12 varB=13 let sum=$varA+$varB echo "result:"$sum [结果]: ====let start...==== result:25

推荐:$(()) 样例:
[脚本]: #!/bin/bash echo "====let start...====" varA=1 varB=3 sum=$(($varA+$varB)) echo "result:"$sum [结果]: ====let start...==== result:4

(2)运算符及优先级
优先级 运算符 说明
1 = += 赋值运算
2 || 逻辑或
3 && 逻辑与
4 | 按位或
5 ^ 按位异或
6 & 按位与
7 == != 等于,不等于
8 < > <= >= 比较运算符
9 << >> 按位左移,右移
10 + - 加减运算
11 * / \ 乘 除 取模
12 ! ~ 逻辑非,补码
13 + - 正 负
9、变量测试 语法:

Shell-Bash变量与运算符
文章图片
变量测试规则
样例: 【Shell-Bash变量与运算符】
[脚本]: #!/bin/bash echo "====let start...====" result=${testA-noDefine} echo "result:"$result [结果]: ====let start...==== result:noDefine

    推荐阅读