当前位置: 首页 > news >正文

Shell变量与子串

文章目录

  • 一、Shell变量
  • 二、shell子串

一、Shell变量

本地变量

定义Shell变量,变量名不需要加美元符 $

本地变量只在用户当前shell生存期中有效,如

[hdp@VM-12-6-centos ~]$ name="lihua"
[hdp@VM-12-6-centos ~]$ echo $name
lihua
[hdp@VM-12-6-centos ~]$ bash
[hdp@VM-12-6-centos ~]$ echo $name[hdp@VM-12-6-centos ~]$

变量定义

变量名要求:字母、数字、下划线组成、可以是 字母 或是 下划线 开头,如

lihua
li_hua123
_li_hua123

变量名严格区分大小写

Li_hua
li_hua
1.赋值不加引号
story_three=⼤师兄,快来救我
2.赋值单引号
story_two='⼤师兄,三师弟被妖怪抓⾛了'
3.赋值双引号
story_one="⼤师兄,师傅被妖怪抓⾛了"

取出变量值

单引号,所见即所得,强引用

双引号,输出引号里所有内容,识别特殊符号,弱引用

无引号,连续的符号可以不加引号,有空格则有歧义,最好使用双引号

反引号,引用命令执行结果,等于 $() 用法

特殊变量

shell的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量

$0 获取shell脚本文件名,以及脚本路径
$n 获取shell脚本的第n个参数,n在1~9之间,如$1 ,$2, $9 ,⼤于9则需要写,${10},参数空格隔开
$# 获取执行的shell脚本后⾯的参数总个数
$* 获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是 接收所有参数为单个字符串,"$1 $2.."
$@ 不加引号,效果同上,加引号,是接收所有参数为独立字符串,如"$1" "$2" "$3" ...,空格保留

特殊变量实践

[hdp@VM-12-6-centos ~]$ cat special_var.sh
#! /bin/bash
echo '---特殊变量 $0 $1 $2 ..的实践'
echo '结果:' $0 $1 $2
echo '#####################'
echo '---特殊变量$# 获取参数总个数'
echo '结果:' $#
echo '#####################'
echo '---特殊变量$* 实践'
echo '结果:' $*
echo '#####################'
echo '---特殊变量$@ 实践'
echo '结果:' $@

执行结果:

[hdp@VM-12-6-centos shell_program]$ bash special_var.sh 11 22 33 44
---特殊变量 $0 $1 $2 ..的实践
结果: special_var.sh 11 22
#####################
---特殊变量$# 获取参数总个数
结果: 4
#####################
---特殊变量$* 实践
结果: 11 22 33 44
#####################
---特殊变量$@ 实践
结果: 11 22 33 44

∗ 和 *和 @ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数

当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做⼀份数据,彼此之间以空格来分隔。

但是当它们被双引号" "包含时,就会有区别了:

"$*"会将所有的参数从整体上看做⼀份数据,而不是把每个参数都看做⼀份数据。

"$@"仍然将每个参数都看作⼀份数据,彼此之间是独立的。

比如传递了 5 个参数,那么对于" ∗ " 来说,这 5 个参数会合并到⼀起形成⼀份数据,它们之间是无法分割的;而对于 " *"来说,这 5 个参数会合并到⼀起形成⼀份数据,它们之间是无法分割的;而对于" "来说,这5个参数会合并到起形成份数据,它们之间是无法分割的;而对于"@"来

说,这 5 个参数是相互独立的,它们是 5 份数据。

如果使用 echo 直接输出" ∗ " 和 " *"和" ""@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来。

实践

[root@chaogelinux shell_program]# cat t1.sh
#!/bin/bash
echo "print each param from \"\$*\""
for var in "$*"
doecho "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
doecho "$var"
done

执行结果:

[hdp@VM-12-6-centos shell_program]$ bash t1.sh 11 22 33 44
print each param from "$*"
11 22 33 44
print each param from "$@"
11
22
33
44

特殊状态变量

$? 上⼀次命令执行状态返回值,0正确,⾮0失败
$$ 当前shell脚本的进程号
$! 上⼀次后台进程的PID
$_ 再次之前执行的命令,最后⼀个参数
查找方式 man bash 
搜索Special Parameters

脚本控制返回值

#!/bin/bash
[ $# -ne 2 ] && {echo "must be two args"exit 119 #终⽌程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 可以return 119用法
}
echo ok

执行结果

[hdp@VM-12-6-centos shell_program]$ bash t2.sh
must be two args
[hdp@VM-12-6-centos shell_program]$ echo $?
119

上⼀次后台进程的PID

[hdp@VM-12-6-centos shell_program]$ nohup ping baidu.com & 1> /dev/null
[1] 24197
[hdp@VM-12-6-centos shell_program]$ nohup: ignoring input and appending output to ‘nohup.out’
^C
[hdp@VM-12-6-centos shell_program]$ echo $!
24197
[hdp@VM-12-6-centos shell_program]$ ps -ef | grep ping
hdp      24197 19773  0 13:52 pts/0    00:00:00 ping baidu.com
hdp      24303 19773  0 13:52 pts/0    00:00:00 grep --color=auto ping

nohup 是一个Unix/Linux命令,用于在后台运行命令,即使终端关闭或用户注销,命令也能继续运行。它的常见用法是:

nohup command &

这条命令会在后台运行 command,并将输出重定向到一个名为 nohup.out 的文件中。 & 符号表示在后台运行命令。

1 表示标准输出(stdout),而 2 表示标准错误输出(stderr)。所以 1> /dev/null 将标准输出重定向到 /dev/null,意味着将标准输出丢弃,不会显示在终端上。

因此,nohup ping baidu.com & 1> /dev/null 这条命令的意思是在后台运行 ping baidu.com 命令,并将标准输出重定向到 /dev/null,从而丢弃所有标准输出,不会在终端显示。

$$ 当前shell脚本的进程号

$_ 再次之前执行的命令,最后⼀个参数

[hdp@VM-12-6-centos shell_program]$ bash special_var.sh 
---特殊变量 $0 $1 $2 ..的实践
结果: special_var.sh
#####################
---特殊变量$# 获取参数总个数
结果: 0
#####################
---特殊变量$* 实践
结果:
#####################
---特殊变量$@ 实践
结果:
[hdp@VM-12-6-centos shell_program]$ ls $_
special_var.sh
[hdp@VM-12-6-centos shell_program]$ cat $_
#! /bin/bash
echo '---特殊变量 $0 $1 $2 ..的实践'
echo '结果:' $0 $1 $2
echo '#####################'
echo '---特殊变量$# 获取参数总个数'
echo '结果:' $#
echo '#####################'
echo '---特殊变量$* 实践'
echo '结果:' $*
echo '#####################'
echo '---特殊变量$@ 实践'
echo '结果:' $@

bash shell内置变量命令

bash本身提供的⼀些内置命令

echo
eval
exec
export
read
shift

echo命令

-n 不换行输出内容
-e 解析转义字符
\n 换行
\r 回⻋
\t tab
\b 退格
\v 纵向制表符

eval

eval 执行多个命令。

[hdp@VM-12-6-centos shell_program]$ eval ls;pwd;cd ..
nohup.out  special_var.sh  t1.sh  t2.sh
/home/hdp/shell_program
[hdp@VM-12-6-centos ~]$

exec

不创建子进程,执行该命令,exec执行后⾃动exit

[hdp@VM-12-6-centos shell_program]$ sh
sh-4.2$ exec date
Fri May 10 14:01:09 CST 2024
[hdp@VM-12-6-centos shell_program]$

二、shell子串

子串就是⼀个完整字符串的⼀部分,通过shell特有语法截取。

${变量} 返回变量值
${#变量} 返回变量长度,字符长度
${变量:start} 返回变量Offset数值之后的字符
${变量:start:length} 提取offset之后的length限制的字符
${变量#word} 从变量开头删除最短匹配的word子串
${变量##word} 从变量开头,删除最长匹配的word
${变量%word} 从变量结尾删除最短的word
${变量%%word} 从变量结尾开始删除最长匹配的word
${变量/pattern/string} 用string代替第⼀个匹配的pattern
${变量//pattern/string} 用string代替所有的pattern

案例

子串基本用法

Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。

从指定位置开始截取

这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是 Shell 同时支持两种计数方式。

1.从字符串左边开始计数

如果想从字符串的左边开始计数,那么截取字符串的具体格式如下:

${string: start :length}

其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。

基础案例:

[hdp@VM-12-6-centos ~]$ str="helloworld"
[hdp@VM-12-6-centos ~]$ echo ${str}
helloworld
[hdp@VM-12-6-centos ~]$ echo ${#str}
10
[hdp@VM-12-6-centos ~]$ echo ${str:1}
elloworld
[hdp@VM-12-6-centos ~]$ echo ${str:2}
lloworld
[hdp@VM-12-6-centos ~]$ echo ${str:5:5}
world

计算变量值,长度的玩法

#计算字符串长度
str="helloworld"
#计算字符串长度
[hdp@VM-12-6-centos ~]$ echo $str | wc -L  
10
[hdp@VM-12-6-centos ~]$ cat test.txt
hello
hello world
hell0 world !!!
# 打印行数
[hdp@VM-12-6-centos ~]$ cat test.txt | wc -l
3
# 打印最长行数的元素个数
[hdp@VM-12-6-centos ~]$ cat test.txt | wc -L
15
#expr的length函数计算长度
[hdp@VM-12-6-centos ~]$ expr length "$str"
10
#用awk的length函数
[hdp@VM-12-6-centos ~]$ echo "$str" | awk '{print length($0)}'
10
#最快的方式
[hdp@VM-12-6-centos ~]$ echo ${#str}
10

字符串长度计算,多种方法,谁最快?

速度比较

# 最快方式
# seq -s 指定分隔符
# seq -s ":" 100
# 执行3次打印的命令,打印出⼀个指定了分隔符的1~100的序列
[hdp@VM-12-6-centos ~]$ for n in {1..3};do char=`seq -s ":" 100`;echo ${char} ;done
1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:100
1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:100
1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:100
# 实践
[hdp@VM-12-6-centos ~]$ time for n in {1..10000};do char=`seq -s "#########" 100`;echo ${#char} &>/dev/null;donereal	0m13.819s
user	0m5.624s
sys	0m8.948s
#计算速度很慢,管道符和wc -L
[hdp@VM-12-6-centos ~]$ time for n in {1..10000};do char=`seq -s "#########" 100`;echo ${char} | wc - L &>/dev/null;donereal	0m31.221s
user	0m15.769s
sys	0m25.549s
# 性能还不错
[hdp@VM-12-6-centos ~]$ time for n in {1..10000};do char=`seq -s "#########" 100`;expr length "${char}"  &>/dev/null;donereal	0m27.055s
user	0m10.653s
sys	0m17.999s
# awk再次加⼯,最慢
[hdp@VM-12-6-centos ~]$ time for n in {1..10000};do char=`seq -s "#########" 100`;echo ${char} | awk '{print length($0)}' &>/dev/null;donereal	0m34.400s
user	0m17.737s
sys	0m28.834s
[hdp@VM-12-6-centos

shell编程,尽量用内置系统操作,与内置函数

seq是一个用于生成数字序列的命令,其语法如下:

seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 递增量 尾数

这里是一些常用选项:

  • -w, --equal-width:使生成的数字保持等宽,即数字之间补零以保持长度一致。
  • -s, --separator=字符串:指定分隔符,默认为换行符。
  • -f, --format=格式:指定输出格式,例如 %g 表示浮点数,%d 表示整数等。
  • -h, --help:显示帮助信息并退出。
  • -V, --version:显示版本信息并退出。

seq命令生成的序列可以用于各种场景,比如在Shell脚本中生成循环的计数器,生成需要一系列数字作为输入的命令的参数等。

awk是一种强大的文本处理工具,它可以逐行扫描文件,并根据用户定义的规则进行处理和操作。通常,它用于对结构化文本数据进行处理、分析和格式化输出。

awk的基本语法如下:

awk 'pattern { action }' input-file
  • pattern:模式部分用于匹配输入行。如果省略模式部分,则默认匹配所有行。
  • { action }:动作部分定义了对匹配的行执行的操作。动作可以是对字段的操作、控制流语句等。如果省略动作部分,则默认打印匹配的行。

awk中,有一些预定义的变量和函数可以在处理过程中使用,例如:

  • $0:表示整个输入行。
  • $1, $2, ...:表示第一个、第二个字段等。
  • NF:表示当前行的字段数。
  • NR:表示当前行的行号。
  • FS:表示输入字段分隔符,默认为空格或制表符。
  • OFS:表示输出字段分隔符,默认为一个空格。
  • RS:表示输入记录(行)分隔符,默认为换行符。
  • ORS:表示输出记录(行)分隔符,默认为换行符。

awk还支持各种内置函数和算术操作符,以及条件语句、循环语句等高级特性,使得它成为一种非常灵活和强大的文本处理工具。

例如,下面的awk命令会打印出文件中第二列大于10的行:

awk '$2 > 10' input-file

awk在处理文本数据时非常高效,并且可以通过编写简洁而强大的脚本来完成各种文本处理任务。

截取字符串

基本语法

# 从开头删除匹配最短
## 从开头删除匹配最长
% 从结尾删除匹配最短
%% 从结尾删除匹配最长
# 指定字符内容截取
a*c 匹配开头为a,中间任意个字符,结尾为c的字符串
a*C 匹配开头为a,中间任意个字符,结尾为C的字符串
#语法
name="helloworld" # 该变量的值,有索引,分别是从 0,1,2,3,4开始
${变量} 返回变量值
${#name} 返回变量长度,字符长度--------
${变量:start} 返回变量start数值之后的字符,且包含start的数字
${变量:start:length} 提取start之后的length限制的字符 ,例如${name:4:1}
${变量#word} 从变量开头删除最短匹配的word子串 ${name:hou}
${变量##word} 从变量开头,删除最长匹配的word
${变量%word} 从变量结尾删除最短的word
${变量%%word} 从变量结尾开始删除最长匹配的word
替换
${变量/pattern/string} 用string代替第⼀个匹配的pattern
${变量//pattern/string} 用string代替所有的pattern

删除匹配的内容

[hdp@VM-12-6-centos ~]$ name="abcABC123ABCabc"
# 从开头删除
[hdp@VM-12-6-centos ~]$ echo ${name#a*C}  #从开头删除最短的a*C
123ABCabc
[hdp@VM-12-6-centos ~]$ echo ${name#a*c}   
ABC123ABCabc
[hdp@VM-12-6-centos ~]$ echo ${name##a*c}   #从开头删除最长的匹配# 匹配到了就删除
[hdp@VM-12-6-centos ~]$ echo ${name%a*c}
abcABC123ABC
# 从结尾删除
# 从结尾没有匹配到结果,原样返回
[hdp@VM-12-6-centos ~]$ echo ${name%a*C}
abcABC123ABCabc
# 原样返回,因为从结尾开始匹配,压根就找不到a*C,因此不做处理
[hdp@VM-12-6-centos ~]$ echo ${name%%a*C}
abcABC123ABCabc
# 匹配长的删除
# 删⼲净了,因为变量值name2=abcABC123ABCabc,匹配a*c,取最长的也就从前删到结尾
[hdp@VM-12-6-centos ~]$ echo ${name%%a*c}

替换字符串

[hdp@VM-12-6-centos ~]$ str="Hello,man,i am your brother."
[hdp@VM-12-6-centos ~]$ echo $str
Hello,man,i am your brother.
# ⼀个/ 替换匹配第⼀个合适的字符串
[hdp@VM-12-6-centos ~]$ echo ${str/brother/sister}
Hello,man,i am your sister.
# 两个//,匹配所有的合适的字符串
# 替换所有的o为⼤写O
[hdp@VM-12-6-centos ~]$ echo ${str//o/O}
HellO,man,i am yOur brOther.

删除文件名练习

删除所有图⽚文件名中的子串
[hdp@VM-12-6-centos ~]$  touch stu_102999_{1..5}_finished.jpg
[hdp@VM-12-6-centos ~]$  touch stu_102999_{1..5}_finished.png
[hdp@VM-12-6-centos ~]$  ll *.jpg *.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_1_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_1_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_2_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_2_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_3_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_3_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_4_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_4_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_5_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_5_finished.png

1.去掉所有 _finished 字符串

思路:
#1.单个文件去掉后缀,很简单
[hdp@VM-12-6-centos ~]$ mv stu_102999_1_finished.jpg stu_102999_1.jpg
#2.通过子串的替换方式
[hdp@VM-12-6-centos ~]$ f=stu_102999_1_finished.png 
# 变量的子串功能,去掉后缀
[hdp@VM-12-6-centos ~]$ echo ${f//_finished/}
stu_102999_1.png
# 利用变量的反引用替换文件名
[hdp@VM-12-6-centos ~]$ mv $f `echo ${f//_finished/}`
[hdp@VM-12-6-centos ~]$  ll *.jpg *.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_1.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_1.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_2_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_2_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_3_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_3_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_4_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_4_finished.png
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_5_finished.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_5_finished.png
# 剩下的文件,利用循环操作
# 找出剩下所有需要替换的jpg⽂件
# 写shell循环代码,循环操作
# 去掉所有jpg⽂件的_finished后缀
[hdp@VM-12-6-centos ~]$ for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done
[hdp@VM-12-6-centos ~]$ ll *.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_1.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_2.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_3.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_4.jpg
-rw-rw-r-- 1 hdp hdp 0 May 11 19:00 stu_102999_5.jpg

特殊shell扩展变量处理

语法

parameter,参数,范围

如果parameter变量值为空,返回word字符串
${parameter:-word}
如果parameter变量为空,则word替代变量值,且返回其值
${parameter:=word}
如果parameter变量为空,word当作stderr输出,否则输出变量值
用于设置变量为空导致错误时,返回的错误信息
${parameter:?word}
如果para变量为空,什么都不做,否则word返回
${parameter:+word}

扩展变量实践

演示1: :-

[hdp@VM-12-6-centos ~]$ echo $str# 当str没有值,heihei被返回,赋值给result
[hdp@VM-12-6-centos ~]$ result=${str:-hello}
[hdp@VM-12-6-centos ~]$ echo $result
hello
# 要注意的是,此时str还是空
[hdp@VM-12-6-centos ~]$ echo $str# 情况2,当str变量有值时,该特殊扩展变量的符号,也就不起作用了
[hdp@VM-12-6-centos ~]$ str="hello"
[hdp@VM-12-6-centos ~]$ result=${str:-heihei}
[hdp@VM-12-6-centos ~]$ echo $result 
hello
[hdp@VM-12-6-centos ~]$ echo $str
hello

演示2: :=

该特殊情况用于保证变量始终有值

# 撤销变量
[hdp@VM-12-6-centos ~]$ unset str
[hdp@VM-12-6-centos ~]$ unset result
# 发现,heihei不但给了result,还给了str变量
[hdp@VM-12-6-centos ~]$ result=${str:=heihei}
[hdp@VM-12-6-centos ~]$ echo $result 
heihei
[hdp@VM-12-6-centos ~]$ echo $str
heihei
# 如果变量有值,什么事也不做
[hdp@VM-12-6-centos ~]$ result=${str:=hello}
[hdp@VM-12-6-centos ~]$ echo $result 
heihei
[hdp@VM-12-6-centos ~]$ echo $str 
heihei

演示3

:?,当变量不存在时候,输出指定信息

[hdp@VM-12-6-centos ~]$ echo ${cc}# 默认错误
[hdp@VM-12-6-centos ~]$ echo ${cc:?}
-bash: cc: parameter null or not set
[hdp@VM-12-6-centos ~]$ echo ${cc:?cc is null or not set}
-bash: cc: cc is null or not set
[hdp@VM-12-6-centos ~]$ cc="happy"
# 变量有值,则不做处理
[hdp@VM-12-6-centos ~]$ echo ${cc:?cc is null or not set}
happy

演示4

:+ 如果变量为空,什么都不做,否则替换

[hdp@VM-12-6-centos ~]$ unset result str
[hdp@VM-12-6-centos ~]$ str="hello"
[hdp@VM-12-6-centos ~]$ echo $name# 为空
[hdp@VM-12-6-centos ~]$ result=${name:+str}
[hdp@VM-12-6-centos ~]$ echo $result[hdp@VM-12-6-centos ~]$ echo $name[hdp@VM-12-6-centos ~]$ name="lihua"
# 后⾯的值,返回给result
[hdp@VM-12-6-centos ~]$ result=${name:+str}
[hdp@VM-12-6-centos ~]$ echo $result
str
[hdp@VM-12-6-centos ~]$ echo $name
lihua

扩展变量的应用场景

在脚本开发中,例如数据备份、删除的脚本

删除7天前的过期数据

[hdp@VM-12-6-centos ~]$ cat del_data.sh 
find ${path:=/tmp} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
# 上述就对path变量做了处理,否则如果path变量为定义,命令就会报错
# 有误的脚本,未指定path的路径,就会在当前⽬录删除,程序就有了歧义,bug
[hdp@VM-12-6-centos ~]$ cat del_data.sh
find ${path} -name '*.tar.gz' -type f -mtime +7|xargs rm -f

1.find ${path:=/tmp} -name '*.tar.gz' -type f -mtime +7:这部分命令使用find工具在指定路径(如果未指定,默认为/tmp目录)下查找文件名匹配*.tar.gz的文件,并且这些文件的修改时间(modification time)是在7天前(+7天)之前。

2.| xargs rm -f:这部分命令将find命令的输出作为输入,使用xargs将文件列表传递给rm -f命令,rm -f用于强制删除文件,即使文件不存在也不会报错。

-6-centos ~]$ echo r e s u l t s t r [ h d p @ V M − 12 − 6 − c e n t o s ] result str [hdp@VM-12-6-centos ~] resultstr[hdp@VM126centos ] echo $name
lihua


**扩展变量的应用场景**在脚本开发中,例如数据备份、删除的脚本删除7天前的过期数据```bash
[hdp@VM-12-6-centos ~]$ cat del_data.sh 
find ${path:=/tmp} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
# 上述就对path变量做了处理,否则如果path变量为定义,命令就会报错
# 有误的脚本,未指定path的路径,就会在当前⽬录删除,程序就有了歧义,bug
[hdp@VM-12-6-centos ~]$ cat del_data.sh
find ${path} -name '*.tar.gz' -type f -mtime +7|xargs rm -f

1.find ${path:=/tmp} -name '*.tar.gz' -type f -mtime +7:这部分命令使用find工具在指定路径(如果未指定,默认为/tmp目录)下查找文件名匹配*.tar.gz的文件,并且这些文件的修改时间(modification time)是在7天前(+7天)之前。

2.| xargs rm -f:这部分命令将find命令的输出作为输入,使用xargs将文件列表传递给rm -f命令,rm -f用于强制删除文件,即使文件不存在也不会报错。

综合起来,这个命令的目的是在指定路径下删除修改时间在7天之前的所有.tar.gz文件。


http://www.mrgr.cn/news/62006.html

相关文章:

  • 模拟退火算法的详细解读,看这一篇就够了~
  • CHARLS数据库系列教程(5)---亚组分析,P for trend,P for interaction
  • 【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)
  • GPU 学习笔记四:GPU多卡通信(基于nccl和hccl)
  • 【Java】-- 接口
  • C++(友元、异常机制)
  • Mac程序坞窗口预览的方法来了
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 为什么美业必须要有一套专业的美业门店管理系统?美业SaaS系统收银系统拓客系统Java源码
  • Django框架实现用户认证
  • 【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?
  • 在JavaScript中怎样实现闭包?
  • 5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型
  • 【Linux】进程间通信
  • iOS18 取消/适配TabbarController缩放动画
  • Vue CLI: 安装、项目创建及基本概念指南,vue生命周期
  • C++:输入和输出
  • 《Linux系统编程篇》exec族函数——基础篇
  • MATLAB——入门知识
  • Vue3 学习笔记(十三)Vue组件详解
  • Windows高级技巧:轻松实现多进程窗口的连接与管理
  • 轻松实现金蝶与旺店通数据无缝对接的完整解决方案
  • Linux文件系统_inode
  • 兽音译器的编码原理
  • 真香!Python十大文件操作整理,收藏起来以后有用!!
  • 为什么不建议使用黑帽SEO手法?