shell变量
变量:是计算机语言中储存计算结果或表示值的抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如 Haskell )中,变量可能是不可变( immutable )的。在一些语言中,变量可能被明描述为能表示可变状态、具有存储空间的抽象(如在 Java 和 Visual Basic 中);但另外一些语言可能使用其它概念(如 C 的对象)来指称这种抽象,而不严格定义“变量”的准确外延。
shell变量的特性:
- 没有众多的存储类及类型限制,都是字符串
- 不需要预先定义,可以直接赋值
变量的定义
变量定义的格式:
变量名=字符串
实例:
user=lcc
echo $user
shell中的变量名可以有字母,数字,下划线组成。
- 只能由字母或下划线开头
- 建议不要使用命令关键字(用help可以查看系统保留关键字)
变量的赋值
直接赋值:
- 在等号=的两边不能有空格
- 如果在变量的值中包含空格,需要使用单引号‘’或者双引号""
- 如果赋值的是一个已存在的变量名,则会覆盖掉原有的内容
实例:
user1=lcc1
user2='lcc2'
user3="lcc3"
echo $user1
echo $user2
echo $user3
命令结果进行赋值
- 反引号(`)
- $(command)
user1=`echo lcc`
user2="lcc `echo MAN`"
实例1:
使用反引号进行命令结果赋值
实例2:
使用$()进行命令结果赋值
user1=$(echo lcc)
使用read定义变量
用法:
read [-s 关闭回显] [-a 数组] [-n 读取字符数] [-p 提示符] [-t 超时] [名称 …]
例如:
#定义一个变量
read user1
lcc
echo $user1
#定义两个变量,中间用空格隔开
read user2 user3
lcc2 lcc3
echo $user2
echo $user3
#使用命令提示符,提示输入,5秒不输入就会超时
read -p "please enter your username:" -t 5 user4
lcc4
echo $lcc4
使用declare定义变量
参数:
- -r:设置只读
- -l:使值中所有的大学字母转换成小写
- -u:小写转换成大写
例如:
declare -r user1=lcc1
echo $user1
declare -l user2=LCC2
echo $user2
declare -u user3=lcc3
echo $user3
引用变量
为了区分到底引用的是变量的值还是字符串,需要在变量名前面使用美元符号$。
在使用变量时,如果变量存在于引号内,则必须使用双引号。
例如:
user1=lcc
user2=hello$user1
user3="hello$user1"
user4="hello"$user1"hello"
user5='hello'$user1'hello'
扩展变量
引用变量除了使用 v a r 格 式 直 接 引 用 变 量 之 外 , 还 可 以 使 用 var格式直接引用变量之外,还可以使用 var格式直接引用变量之外,还可以使用{var}的方式对变量进行扩展。常见的形式如下表:
表达式 | 说明 |
---|---|
${var} | 等同于$var |
${var:word} | 如果$var的变量值为空或未赋值,则返回word字符串,防止变量为空或因未定义而导致异常 |
${var:=word} | 如果 v a r 的 变 量 值 为 空 或 未 赋 值 , 则 设 置 这 个 变 量 值 为 w o r d , 并 返 回 其 值 。 位 置 变 量 和 特 殊 变 量 不 适 用 。 基 本 同 上 一 个 , 但 该 变 量 又 额 外 给 var的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用。基本同上一个,但该变量又额外给 var的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用。基本同上一个,但该变量又额外给var变量赋值了。 |
${var:?word} | 如果 $var 变量值为空或未赋值,那么 word 字符串将被作为标准错误输出,否则输出变量的值。用于捕捉由于变量未定义而导致的错误,并退出程序。 |
${var:+word} | 如果 $var 变量值为空或未赋值,则什么都不做,否则返回 word 字符串的值,也就是整个表达式的值为 word 。 |
特殊变量
位置参数:
n
:
传
递
给
脚
本
或
函
数
的
参
数
。
n
是
一
个
非
负
的
整
数
,
表
示
第
几
个
参
数
。
在
n
大
于
或
者
等
于
10
的
时
候
,
需
要
使
用
n:传递给脚本或函数的参数。n是一个非负的整数,表示第几个参数。在n大于或者等于10的时候,需要使用
n:传递给脚本或函数的参数。n是一个非负的整数,表示第几个参数。在n大于或者等于10的时候,需要使用{n}
#新建脚本
sudo vim test2.sh
#!/bin/bash
echo $1 $2 $3
echo ${12} $12
:wq
bash test2.sh 1 2 3 4 5 6 7 8 9 0 a b c
其他特殊参数:
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$# | 传递给脚本或函数的所有参数 |
$* | 传递给脚本或函数的所有参数 |
$? | 获取执行上一个指令的执行状态返回值 |
$$ | 获取当前执行的shell脚本的进程号 |
$! | 获取上一个在后台工作的进程的进程号 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数 |
删除变量
unset:
- -f:仅删除函数
- -v:仅删除变量