定义变量时不能加$且等号两边无空格,变量名只能含字母、数字、下划线并以字母或下划线开头;引用时建议用${}避免歧义,值含空格需用引号包裹,命令结果用$()捕获,单引号不解析变量双引号支持展开,可设只读或删除变量但只读变量不可unset。

Shell 变量用起来其实很简单:先命名赋值,再加 $ 引用。关键不是“会不会”,而是别踩那几个常见坑——比如等号两边加空格、用数字开头、或者忘了引号包空格。
变量怎么定义才合法
定义时只写名字和值,**不能加 $,等号两边绝对不能有空格**:
-
✓ 正确:
name="张三"、PORT=8080、APP_NAME="my-app" -
✗ 错误:
name = "张三"(空格导致变成执行命令)、1name="abc"(数字开头)、user-name="test"(含短横线,非法)
变量名只能含字母、数字、下划线,且必须以字母或下划线开头。习惯上常量用大写(如 PI=3.14),普通变量小写或驼峰都行。
引用变量要注意边界
用 $变量名 或更推荐的 ${变量名} 来取值。花括号不是可有可无——它能防止歧义:
-
skill=Java,写echo "$skillScript"会被当成变量skillScript(为空); - 写
echo "${skill}Script"才真输出JavaScript。
只要变量后面紧挨着字母/数字,就强烈建议加花括号,这是省心又安全的习惯。
带空格、命令结果、特殊字符怎么办
值里有空格?必须用引号包住,否则 Shell 会切开当成多个参数:
-
msg="Hello world!"✓ -
msg=Hello world!✗(报错或只取 Hello)
想存命令执行结果?用 $() 或反引号:
files=$(ls /tmp)date_str=`date +%Y-%m-%d`
单引号内所有内容原样输出(不解析变量),双引号内支持变量展开和转义,按需选用。
常用操作:修改、只读、删除
- 重新赋值直接写:
count=5→count=12(不用加$) - 设为只读:
readonly DB_HOST="127.0.0.1",之后再赋值会报错 - 删掉变量:
unset temp_var,再 echo 就为空了
注意:只读变量不能 unset,也不能再赋值。
基本上就这些。不复杂,但容易忽略空格和引号——写完变量多看一眼等号两边,基本就稳了。










