1. shell变量简介web
2. 定义变量shell
3. 使用变量express
4. 修改变量的值编程
5. 单引号和双引号的区别bash
6. 将命令的结果赋值给变量编程语言
7. 删除变量函数
8. 变量类型工具
9. 特殊变量列表测试
10. 退出状态this
11. shell表达式与运算符
11.1 条件表达式
11.2 整数比较符
11.3 字符串比较符
11.4 文件测试
11.5 布尔运算符
11.6 逻辑判断符
11.7 整数运算
11.8 其余运算工具
11.9 shell括号用途总结
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各类数据。脚本语言在定义变量时一般不须要指明类型,直接赋值就能够,Shell 变量也遵循这个规则。
在 Bash shell 中,每个变量的值都是字符串,不管你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
这意味着,Bash shell 在默认状况下不会区分变量类型,即便你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不一样。
Shell 支持如下三种定义变量的方式:
variable=value
variable='value'
variable="value"
variable 是变量名,value 是赋给变量的值。若是 value 不包含任何空白符(例如空格、Tab缩进等),那么能够不使用引号;若是 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后咱们会详细说明。
注意,赋值号的周围不能有空格,这可能和你熟悉的大部分编程语言都不同。
Shell 变量的命名规范和大部分编程语言都同样:
变量定义举例:
url=http://www.baidu.com time_15_age=18 real_name='ken' _author="ken"
使用一个定义过的变量,只要在变量名前面加美圆符号$便可,如:
author="ken" echo $author echo ${author}
变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,好比下面这种状况:
skill="Java" echo "I am good at ${skill}Script"
若是不给 skill 变量加花括号,写成echo “I am good at $skillScript”,解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是咱们指望的样子了。推荐给全部变量加上花括号{ },这是个良好的编程习惯。
在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量。能够经过 export 导出成用户变量。一些写 Shell 脚本时经常使用的系统变量:
| $SHELL | 默认 Shell | | $HOME | 当前用户家目录 | | $IFS | 内部字段分隔符 | | $LANG | 默认语言 | | $PATH | 默承认执行程序路径 | | $PWD | 当前目录 | | $UID | 当前用户 ID | | $USER | 当前用户 | | $HISTSIZE | 历史命令大小,可经过 HISTTIMEFORMAT 变量设置命令执行时间 | | $RANDOM | 随机生成一个 0 至 32767 的整数 | | $HOSTNAME | 主机名 |
1.4.2 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
下面看下他们之间区别:
Shell 进程的环境变量做用域是 Shell 进程,当 export 导入到系统变量时,则做用域是 Shell 进程及其 Shell 子进程,另开shell无效。
已定义的变量,能够被从新赋值,如:
url="http://www.baidu.com" echo ${url} url="http://www.sina.com" echo ${url}
第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。
前面咱们还留下一个疑问,定义变量时,变量的值能够由单引号’ ‘包围,也能够由双引号” “包围,它们到底有什么区别呢?不妨如下面的代码为例来讲明:
#!/bin/bash url="http://c.biancheng.net" website1='C语言中文网:${url}' website2="C语言中文网:${url}" echo $website1 echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net
以单引号’ ‘包围变量的值时,单引号里面是什么就输出什么,即便内容中有变量和命令(命令须要反引发来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的状况,即不但愿解析变量、命令等的场景。
以双引号” “包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令而且想将其解析后再输出的变量定义。
建议:若是变量的内容是数字,那么能够不加引号;若是真的须要原样输出就加单引号;其余没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最多见的使用场景。
Shell 也支持将命令的执行结果赋值给变量,常见的有如下两种方式:
variable=`command` variable=$(command)
第一种方式把命令用反引号包围起来,反引号和单引号很是类似,容易产生混淆,因此不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,因此推荐使用这种方式。
例如,我建立了一个名为 test 的文本文件。下面的代码中,使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,而后使用 echo命令输出。
[root@ken ~]# echo "this is ken" >test [root@ken ~]# mes=`cat test` [root@ken ~]# echo $mes this is ken
使用 unset 命令能够删除变量。语法:
unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。
举个例子:
#!/bin/bash myUrl="http://see.xidian.edu.cn/cpp/u/xitong/" unset myUrl echo $myUrl
上面的脚本没有任何输出。
定义只读变量
[root@ken ~]# name=ken [root@ken ~]# readonly name [root@ken ~]# echo $name ken [root@ken ~]# unset name -bash: unset: name: cannot unset: readonly variable
运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其余shell启动的程序不能访问局部变量。
2) 环境变量
全部的程序,包括shell启动的程序,都能访问环境变量,有些程序须要环境变量来保证其正常运行。必要的时候shell脚本也能够定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量 含义
$0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。 例如,第一个参数是$1,第二个参数是$2。 $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的全部参数。 $? 上个命令的退出状态,或函数的返回值。 $ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
请看下面的脚本:
#!/bin/bash echo "File Name: $0" echo "First Parameter : $1" echo "First Parameter : $2" echo "Quoted Values: $@" echo "Quoted Values: $*" echo "Total Number of Parameters : $#" 运行结果: [root@ken ~]# bash test name age File Name: test First Parameter : name First Parameter : age Quoted Values: name age Quoted Values: name age Total Number of Parameters : 2
$? 能够获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,通常状况下,大部分命令执行成功会返回 0,失败返回 1。
不过,也有一些命令返回其余值,表示不一样类型的错误。
[root@ken ~]# echo ken ken [root@ken ~]# echo $? 0 [root@ken ~]# systemctl restart jj Failed to restart jj.service: Unit not found. [root@ken ~]# echo $? 5
| 表达式 | 实例 |
| [ expression ] | [ 1 -eq 1 ] |
| [[ expression ]] | [[ 1 -eq 1 ]] |
| test expression | test 1 -eq 1 ,等同于[] |
[root@ken ~]# [ 1 -eq 2 ] && echo "this is true" || echo "this is false"
this is false
[root@ken ~]# [ 1 -eq 1 ] && echo "this is true" || echo "this is false"
this is true
注意:括号中的表达式先后都有空格,不然会报错!
[]
[ 1 -eq 1 ]
1.条件表达式的括号里面先后都要有空格
例子1:
[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2”
1
例子2:
[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2” || echo “3”
1
[root@ken ~]# [ 1 -eq 1 ] && echo “1” || echo “2” && echo “3”
1
3
例子3:
[root@ken ~]# [ 1 -lt 1 ] && echo “1” || echo “2”
2
注释:
&&: 表示的含义是前面的命令执行成功,&&后面的命令才会执行
||:表示的含义是前面的命令执行失败,||后面的命令才会执行
例子1: eq
[root@ken ~]# [ 1 -eq 1 ] && echo 1 || echo 2
1
例子2:ne
[root@ken ~]# [ 1 -ne 1 ] && echo 1 || echo 2
2
例子3:le
[root@ken ~]# [ 1 -le 1 ] && echo 1 || echo 2
1
例子4:ge
[root@ken ~]# [ 1 -ge 1 ] && echo 1 || echo 2
1
例子5:lt
[root@ken ~]# [ 1 -lt 1 ] && echo 1 || echo 2
2
例子6:gt
[root@ken ~]# [ 1 -gt 1 ] && echo 1 || echo 2
2
== : 判断两个字符串是否相等
!=: 判断两个字符串不相等
-n: 判断字符串是否不为空
-z: 判断字符串是否为空
注意:在判断字符串的时候必定要加上双引号!
例子1:==
[root@ken ~]# name=ken
[root@ken ~]# [ “$name” == “ken” ] && echo 1 || echo 2
1
例子2:!=
[root@ken ~]# [ “$name” != “ken” ] && echo 1 || echo 2
2
例子3:-n
[root@ken ~]# [ -n “$name” ] && echo 1 || echo 2
1
例子4:-z
[root@ken ~]# [ -z “$name” ] && echo 1 || echo 2
2
-e: exist 存在即为真 #能够判断目录和文件
-f: 存在且为普通文件
-d: 存在且为目录
例子1:-e
[root@ken ~]# [ -e /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -e /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etcd ] && echo 1 || echo 2
2
例子2:-f
[root@ken ~]# [ -f /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -f /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -f /etc ] && echo 1 || echo 2
2
例子3:-d
[root@ken ~]# [ -d /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -d /etc/passwd ] && echo 1 || echo 2
2
[root@ken ~]# [ -d /etc/passwddd ] && echo 1 || echo 2
2
!: 取反
-a: && 和
-o:|| 或
例子1:!
[root@ken ~]# [ ! 1 -eq 1 ] && echo 1 || echo 2
2
例子2:-a
[root@ken ~]# [ 1 -eq 1 -a 2 -lt 2 ] && echo 1 || echo 2
2
-a:
条件一: 条件二 合
true true true
true false false
false true false
false false false
例子3:-o
[root@ken ~]# [ 1 -eq 1 -o 2 -lt 2 ] && echo 1 || echo 2
1
[root@ken ~]# [ 1 -eq 2 -o 2 -lt 2 ] && echo 1 || echo 2
2
-o:
条件一: 条件二 合
true true true
true false true
false true true
false false false
第一种用法:
[root@ken ~]# [[ 1 -eq 1 && 2 -eq 2 ]] && echo 1 || echo 2
1
第二种用法:
[root@ken ~]# [ 1 -eq 1 ] && [ 2 -eq 2 ^C&& echo 1 || echo 2
&&: 前面的命令执行成功就会执行后面的命令
||: 前面的命令执行失败就会执行后面的命令
例子1:
[root@ken ~]# num=$((24))
[root@ken ~]# echo $num
8
例子2:+
[root@ken ~]# num1=$((2+4))
[root@ken ~]# echo $num1
6
例子3:-
[root@ken ~]# num2=$((num1-4))
[root@ken ~]# echo $num2
2
例子4:/
[root@ken ~]# num3=$((num2/2))
[root@ken ~]# echo $num3
1
例子5:%
[root@ken ~]# num4=$((5%2))
[root@ken ~]# echo $num4
1
例子6:
[root@ken ~]# num5=$((52))
[root@ken ~]# echo $num5
25
例子7:
[root@ken ~]# num6=$((3/2))
[root@ken ~]# echo $num6
1
自加一
写法一:推荐写法
[root@ken ~]# num=1
[root@ken ~]# let num++
[root@ken ~]# echo $num
2
写法二:
[root@ken ~]# let num+=1
[root@ken ~]# echo $num
3
写法三:
[root@ken ~]# let num=num+1
[root@ken ~]# echo $num
4
例子2:
[root@ken ~]# let num+=2
[root@ken ~]# echo $num
6
例子1:
[root@ken ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
1+1
2
3*6
18
例子2:
[root@ken ~]# echo “1+1” | bc
2