shell变量之学习笔记
- Shell变量概念
- 1 shell变量分类:
- 2 变量的赋值
- 3 变量赋值格式:
- 4 变量命名方式
- 5 变量声明
- 6 变量引用
- 7 变量清除
- 8 变量只读
- 9 内部参数变量
- 10 位置参数变量
- 11 退出和返回状态
- 12 命令替换
- 13 read命令
- 14 字符串长度与截取
- 15 字符串替换
- 16 变量的间接引用
- 17 同时输出多行信息
- 18 比较符
Shell变量概念
变量用于保存有用信息,如路径名、文件名、数字等。Linux用户使用变量定制其工作环境,使系统获知用户相关配置。本质上是存储数据的一个或多个计算机内存地址。
1 shell变量分类:
用户自定义变量,由用户自己定义、修改、使用
环境变量path,这类变量由系统维护
位置参数变量,这类变量通过命令行给程序传递执行参数
内部参数变量,是bash预定义的特殊变量,用户不能修改
2 变量的赋值
变量的赋值变量是某个值的名称,引用变量称为变量替换,$是变量替换符号,如vars是变量名。
那么
$vars 就表示变量的值。
3 变量赋值格式:
vars=value
vars1=‘value key’
切记等号两边无空格,如果value中含空格,需要用引号括起来(没有空格括起来与不阔无区别)。
4 变量命名方式
大小写字符、数字、下划线等符号,变量名不能以数字开头
5 变量声明
使用变量前,首先要进行变量声明
shell变量为弱类型,不需要定义变量类型
变量声明与赋值格式:变量=值(等号两边不能有空格)
6 变量引用
KaTeX parse error: Expected 'EOF', got '#' at position 12: 变量名 #̲1个字符建议用,如a
KaTeX parse error: Expected 'EOF', got '#' at position 10: {变量名} #̲多于1个字符建议使用这种方式,…{abc}
echo $变量 #显示变量用echo
7 变量清除
变量不需使用时,用unast进行清除,
格式:unast 变量名
8 变量只读
变量设置为只读用readonly,任何用户不能对此变量进行重新赋值
格式: vars=value
readonly vars
[root@localhost tmp]# name=josh
[root@localhost tmp]# echo $name
josh
[root@localhost tmp]# readonly name
[root@localhost tmp]# unset name
-bash: unset: name: 无法反设定: 只读 variable
[root@localhost tmp]# name='jack'
-bash: name: 只读变量
可以看出,变量只读后,无法清除和重新赋值
9 内部参数变量
Shell内部参数变量是一组特殊的变量,它们由Shell自动设置和维护,用于存储有关Shell和正在运行的命令的信息。以下是一些常见的Shell内部参数变量及其用途:
内部参数变量与含义:
$0:保存当前脚本或命令的名称。
$#:保存传递给脚本或函数的位置参数的数量。
$@:保存所有传递给脚本或函数的位置参数的列表。
$*:保存所有传递给脚本或函数的位置参数的列表,作为一个单独的字符串。
与进程相关的内部参数与含义:
$$:保存当前Shell进程的进程ID(PID)。
$?:保存上一个命令的退出状态(返回值)。通常,0表示成功,非零值表示出现了错误。
$!:保存在后台运行的最后一个命令的PID。
$_表示在此之前执行的命令或脚本的最后一个参数
10 位置参数变量
$0 脚本名字
$1 第一个参数($2第二个,以此类推)
11 退出和返回状态
$? 来实现返回状态
0 表示成功,其他均错误
1 执行失败
126 没有权限
127 命令没找到
0
1
126
127
12 命令替换
两个例子将sshd的进程数统计出来,赋予变量
sshdnum=`ps ef | grep sshd |wc -l`
sshd1um=$(ps -ef |grep sshd |wc -l)
13 read命令
read命令用来接收键盘输入内容为变量赋值
read [-p "信息"] [var1 var2 ...]
read 操作一个变量
read操作多个变量
双引号“”:允许通过 引用其他变量值单引 号 ′ ′ :禁止引用其他变量值, 引用其他变量值 单引号'':禁止引用其他变量值, 引用其他变量值单引号′′:禁止引用其他变量值,视为普通字符
反撇号··:将命令执行结果输出给变量
14 字符串长度与截取
使用${#string}来获取字符串的长度,其中string是你要测量长度的字符串。
使用${string:position:length}来截取字符串,其中string是原始字符串,position是截取的起始位置(从0开始计数),length是截取的字符数。
删除开头
echo ${josh#t}
删除结尾
echo ${josh%e}
15 字符串替换
[root@localhost tmp]# var="aaabcd opple mysqldba"
[root@localhost tmp]# echo ${var#a} #删除第一次出现的a
aabcd opple mysqldba
[root@localhost tmp]# echo ${var/a/i} #将第1次出现的a替换为i
iaabcd opple mysqldba
[root@localhost tmp]# echo ${var/#aa/i} #将第1、2次出现的a替换为i
iabcd opple mysqldba
[root@localhost tmp]# echo ${var//a/i} #将所有a替换为i
iiibcd opple mysqldbi
[root@localhost tmp]# echo ${var/%a/x} #在行尾添加一个x
aaabcd opple mysqldbx
16 变量的间接引用
将str1赋值给str2,通过间接引用变量,实现变量值的替换
[root@localhost tmp]# str1="Hello world"
[root@localhost tmp]# str2=str1
[root@localhost tmp]# echo $str2
str1
[root@localhost tmp]# echo ${!str2}
Hello world
[root@localhost tmp]# eval echo \$$str2
Hello world
17 同时输出多行信息
echo命令输出多行信息,多行中间不能出现双引号,否则会提前结束,或者使用转义\
[root@localhost tmp]# echo "
line1
line2
line3
"line1
line2
line3cat输出多行,多行中不能出现END开始的行,否则提前结束
[root@localhost tmp]# cat <<END
line1
line2
line3
END
line1
line2
line3
18 比较符
-eq //equals等于
-ne //no equals不等于
-gt //greater than 大于
-lt //less than小于
-ge //greater equals大于等于
-le //less equals小于等于