[Linux][Shell][Shell变量]详细讲解

DieSnowK 2024-07-16 17:37:01 阅读 83

目录

1.本地变量2.变量定义3.取出变量值4.特殊变量5.特殊状态变量6.shell内置的变量命令1.echo2.eval3.exec

7.截取字符串8.特殊shell扩展变量处理1.语法2.应用场景


1.本地变量

定义Shell变量,变量名不需要加<code>$本地变量只在⽤户当前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/}`;done

snowk@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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。