目录
- 1.本地变量
- 2.变量定义
- 3.取出变量值
- 4.特殊变量
- 5.特殊状态变量
- 6.shell内置的变量命令
- 1.echo
- 2.eval
- 3.exec
- 7.截取字符串
- 8.特殊shell扩展变量处理
- 1.语法
- 2.应用场景
1.本地变量
- 定义Shell变量,变量名不需要加
$
- 本地变量只在⽤户当前shell⽣存期中有效
2.变量定义
- 变量名要求:字⺟、数字、下划线组成、可以是字⺟或是下划线开头
- 变量名严格区分⼤⼩写
3.取出变量值
- 单引号:所⻅即所得,强引⽤
- 双引号:输出引号⾥所有内容,识别特殊符号,弱引⽤
- ⽆引号:连续的符号可以不加引号,有空格则有歧义,最好使⽤双引号
- 反引号:引⽤命令执⾏结果,等于
$()
⽤法
4.特殊变量
-
shell的特殊变量,⽤在如脚本,函数传递参数使⽤
-
有如下特殊的,位置参数变量
变量 作用 $0
获取shell脚本文件名,以及脚本路径 $n
获取shell脚本的第n个参数,n在1~9之间,大于9则需要些 {}
,如{$10}
$#
获取执行的shell脚本后面的参数总个数 $*
获取shell脚本所有参数,不加引号等同于 $@
作用,加上引号"$*"作用是接收所有参数为单个字符串$@
不加引号,效果同上,加引号,是接收所有参数为独立字符串
5.特殊状态变量
-
查找方式:
man bash
,搜索Special Parameters
变量 作用 $?
上次命令执行状态返回值,0正确,非0失败 $$
当前shell脚本的进程号 $!
上一次后台进程的PID $_
获取上次命令的最后一个参数
6.shell内置的变量命令
1.echo
- 参数:
-n
:不换行输出内容-e
:解释转义字符\n
:换行\r
:回车\t
:tab\b
:退格\v
:纵向制表符
2.eval
- 功能:执行多个命令
- 示例:
eval ls; cd ~
3.exec
- 功能:不创建子进程,执行后续命令,
exec
执行后,自动exit
7.截取字符串
-
语法:
语法 作用 #
从开头删除匹配最短 ##
从开头删除匹配最长 %
从结尾删除匹配最短 %%
从结尾删除匹配最长 #
指定字符内容截取 a*c
匹配开头为a,中间任意个字符,结尾为c的字符串 ${变量}
返回变量值 ${#变量}
返回变量长度,字符长度 ${变量:start}
返回变量offset数值之后的字符 ${变量:start:length}
提取offset之后的length限制的字符 ${变量#word}
从变量开头,删除最短匹配的word子串 ${变量##word}
从变量开头,删除最长匹配的word ${变量%word}
从变量结尾,删除最短匹配的word子串 ${变量%%word}
从变量结尾,删除最长匹配的word子串 ${变量/pattern/string}
用string代替第一个匹配的pattern ${变量//pattern/string}
用string代替所有的pattern -
操作实例:删除文件名
# 通过⼦串的替换⽅式 snowk@SnowKYP# f=stu_102999_1_finished.jpg# 变量的⼦串功能,去掉后缀 snowk@SnowKYP# echo ${f//_finished/} stu_102999_1.jpg# 利⽤变量的反引⽤替换⽂件名 snowk@SnowKYP# mv $f `echo ${f//_finished/}`# 剩下的⽂件,利⽤循环操作 # 找出剩下所有需要替换的jpg⽂件 snowk@SnowKYP# ls *fin*.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg stu_102999_5_finished.jpg# 写shell循环代码,循环操作 # 去掉所有jpg⽂件的_finished后缀 snowk@SnowKYP# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;donesnowk@SnowKYP# ls *.jpg stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
8.特殊shell扩展变量处理
1.语法
- 功能:这四个扩展变量,都属于对变量的值进行判断、处理
- 语法:
parameter,参数,范围
${parameter:-word}
:如果parameter
变量值为空,返回word
字符串${parameter:=word}
:如果parameter
变量值为空,则word
替代变量值,且返回其值${parameter:?word}
:如果parameter
变量值为空,word
当作stderr
输出,否则输出变量值- ⽤于设置变量为空导致错误时,返回的错误信息
${parameter:+word}
:如果parameter
变量值为空,什么都不做,否则word
返回
2.应用场景
- 数据备份,删除过期数据的脚本
# 原脚本命令,有bug,有歧义 find ${file_path} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f# 修正后的脚本命令 # 如果有bug起义,就在当前目录搜索并执行删除 find ${file_path:=/tmp} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f