脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,shell变量也遵循这个规则。在bash shell中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,bash shell在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串
语法
变量命名规范
shell变量命名必须遵循下列几点规则:
- 变量名由数字、字母、下划线组成
- 必须以字母或者下划线开头
- 不能使用shell里的关键字(通过 help 命令可以查看保留关键字)
变量定义
# 如果value不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号。如果value包含了空白符,那么就必须使用引号包围起来
var=value
var='value'
var="value"
shell也支持将命令或函数的执行结果赋值给变量
var=`command`
var=$(command)
var=`function`
var=$(function)
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
var="value"
readonly var
readonly var2="value"
定义变量时" "和’ '的区别:
- 用单引号’ '包围变量的值时,单引号里面是什么就输出什么,即使内容中有对变量和命令的引用,也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景
- 用双引号" "包围变量的值时,输出时会先解析里面的变量和命令。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义
使用变量
# 使用一个定义过的变量,只要在变量名前面加美元符号'$'即可
echo $var
# 使用'{ }'花括号指定变量名称边界
echo ${var}
修改变量的值
var="value1"
echo ${var}
# 第二次对变量赋值时不能在变量名前加'$',只有在使用变量时才能加'$'
var="value2"
echo ${var}
删除变量
使用unset命令可以删除变量
# 变量被删除后不能再次使用
unset var
注意事项
- 赋值号’='两边不能有空格
- shell脚本是按顺序边执行边解析的,变量没有声明为readonly之前同样可以修改变量的值
- unset命令不能删除只读变量
示例
变量的定义、使用、删除
#!/bin/bash
var1=value1
var2='value2 ${var1}'
var3="value3 ${var1}"
date=$(date)
echo "var1 = ${var1}"
echo "var2 = ${var2}"
echo "var3 = ${var3}"
echo "date = ${date}"
var1="new value1"
echo "var1 = ${var1}"
readonly var1
var1="new value2"
echo "var1 = ${var1}"
unset var1
unset var2
echo "unseted var2 ${var2}"
unset var3
echo "unseted var3 ${var3}"
执行结果
var1 = value1
# var2变量定义使用的是单引号’ ',所以没有进行var1变量的解析
var2 = value2 ${var1}
# var2变量定义使用的是双引号" ",将var1变量的解析之后再赋值给了var3
var3 = value3 value1
date = Thu Feb 13 22:28:44 CST 2020
# var1没有声明为readonly之前,可以修改它的值
var1 = new value1
# var1声明为readonly之后,再修改它的值,shell给出错误提示
./for.sh: line 17: var1: readonly variable
var1 = new value1
# readonly变量不能被删除
./for.sh: line 20: unset: var1: cannot unset: readonly variable
# var2和var3被删除
unseted var2
unseted var3