变量定义简介
定义变量时,可直接为 变量名=变量值,使用 echo $变量名 (或 echo ${变量名})以打印变量至终端,使用 unset 变量名 可以清除变量值,可使用 readonly 变量名 指定只读变量,该变量无法修改,强行修改将会在执行结束后报错,程序仍会正常继续执行:
#! /bin/bash
#这是第一个shell脚本
num=10
echo $num
unset num
echo $num
readonly num=100
echo $num
num=120
echo $num
echo $num
echo $num
运行结果:
xxx@PC:~$ ./first.sh 10 100 100 100 100 first.sh: 行 xx: num: 只读变量 xxx@PC:~$ |
使用 read 变量名 可以从键盘中输入变量,若需要添加输入提示信息,可添加 -p 参数,若需要同时读取多个变量,可使用空格隔开:
#! /bin/bash
#这是第一个shell脚本
num=10
echo "num=$num"
read -p "请输入num的值:" num
echo "num=$num"
read data1 data2
echo "data1=$data1,data2=$data2"
运行结果:
xxx@PC:~$ ./first.sh num=10 请输入num的值:120 num=120 114 514 data1=114,data2=514 xxx@PC:~$ |
使用命令 env 可以查看当前环境变量,expor 命令可将变量导出至全局供其它脚本使用,source 命令可进行终端时调用脚本(等同于. xxx.sh)或脚本内其它脚本的调用,被调用脚本不需要可执行权限:
xxx@PC:~$ env *** 系统环境变量 *** xxx@PC:~$ source demo.sh xxx@PC:~$ env *** 系统环境变量 DATA=100 *** xxx@PC:~$ |
demo.sh文件中的内容:
#! /bin/bash
#这是第二个shell脚本
expor DATA=100
变量命名注意事项
1、变量名只能包含英文字母下划线,不能以数字开头
1_num=10 错误
num_1=20 正确
2、等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来
3、双引号 单引号的区别
双引号:可以解析变量的值,替换变量值输出
单引号:不能解析变量的值,当做纯文本输出
shell中预设的变量
$# | 传递给shell脚本参数的数量 |
$* | 传递给shell脚本参数的内容 |
$1、$2... | 传递给shell脚本的参数 |
$? | 命令执行后返回的状态 |
"$?" | 检测上个命令师傅正常执行(0 为正常执行,非0 为执行异常) |
$0 | 当前执行的进程名 |
$$ | 当前执行的进程号 |
"$$" | 用作临时文件名保证临时文件名不重复 |
脚本标量特殊用法
""(双引号) | 可以解析变量的值,替换变量值输出 |
''(单引号) | 不能解析变量的值,当做纯文本输出 |
``(反引号) | 中间的内容为系统命令,执行其中内容 |
\(转义字符) | 等同于C语言中的转义字符,echo输出时需要加上 -e 参数 |
(命令序列) | 由子shell完成,不影响父shell变量内容,类似于C语言中的函数内变量 |
{命令序列} | 在当前shell中执行,会影响父shell变量内容 |
示例文件如下:
#! /bin/bash
num=10
echo "num=$num"
echo 'num=$num'
echo "today:`date`"
echo -e "hello\nworld"
(
num=114514
echo "()内num=$num"
)
echo "()外num=$num"
{
num=114514
echo "{}内num=$num"
}
echo "{}外num=$num"
运行结果:
xxx@PC:~$ ./first.sh num=10 num=$num today:2023年 03月 13日 星期一 11:18:21 CST hello world ()内num=114514 ()外num=10 {}内num=114514 {}外num=114514 xxx@PC:~$ |
变量的扩展
#!/bin/bash
#${num:-val} 如果num存在,则值为num,否则为val
echo ${num:-100}
num=200
echo ${num:-100}
str="00123456789"
#测量字符串长度
echo "str长度为:${#str}"
#从下标为x处提取字符串
echo ${str:3}
#从下标为x处提取长度为y的字符串
echo ${str:3:6}
#${str/old/new}用new替换字符串中出现的第一个old,不会修改原str
echo ${str/0/9}
#${str//old/new}用new替换字符串中出现的全部old,不会修改原str
echo ${str//0/9}
运行结果:
xxx@PC:~$ ./first.sh 100 200 str长度为:11 23456789 234567 90123456789 99123456789 xxx@PC:~$ |
变量属性设置
在bash的内建命令中,declare可以指定变量的属性,也可以写作typeset。declare -i s 表示强制把s变量当做int型参数运算。