zl程序教程

您现在的位置是:首页 >  其他

当前栏目

shell语法之${},``,$(),$(()) - - 用法

shell 用法 语法
2023-09-11 14:17:06 时间

一、${}

1、变量截取、替换

定义一个变量
file=/dir1/dir2/dir3/my.file.txt

通过 ${ } 分别替换获得不同的值,单一符号是最小匹配﹔两个符号是最大匹配
1. #  去掉/左边的
1${file#*/}:拿掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt
2${file##*/}:拿掉最后一条 / 及其左边的字串:my.file.txt
3${file#*.}:拿掉第一个 . 及其左边的字串:file.txt
4${file##*.}:拿掉最后一个 . 及其左边的字串:txt

2.%  右边  去掉/右边的
1${file%/*}:拿掉最后条 / 及其右边的字串:/dir1/dir2/dir3
2${file%%/*}:拿掉第一条 / 及其右边的字串:(空值)
3${file%.*}:拿掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file
4${file%%.*}:拿掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my

3.字符定位:字符数
1${file:0:5}:提取最左边的 5 个字:/dir1
2${file:5:5}:提取第 5 个字?右边的连续 5 个字:/dir2

4.字符串替换 /(第一个);//(全部)
1${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
2${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

5.针对不同的变数状态赋值(没设定、空值、非空值):
-	:-	+
1${file-my.file.txt} :假如 $file 为空值,则使用 my.file.txt 作默认值。(保留没设定及非空值)
2${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作默认值。 (保留非空值)
3${file+my.file.txt} :不管 $file 为何值,均使用 my.file.txt 作默认值。 (不保留任何值)

:+	=	:=
4${file:+my.file.txt} :除非 $file 为空值,否则使用 my.file.txt 作默认值。 (保留空值)
5${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留空值及非空值)
6${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留非空值)

?	:?
7${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。 (保留空值及非空值))
8${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (保留非空值)

6.计算出变量值的长度#
${#file}  等于27

2、数组

1.数组替换方法
 A=(a bc de f)
[szb@szb shell48]$ A=(a bc de f)
1)  得到全部组数
[szb@szb shell48]$ echo ${A[@]} 
a bc de f

2)可得到 a (第一个组数)
[szb@szb shell48]$ echo ${A}
a
[szb@szb shell48]$ echo ${A[0]}
a

3)计算数组数量
[szb@szb shell48]$ echo ${#A}
1
[szb@szb shell48]$ echo ${#A[@]}
4

4)重定义数组值
A[3]=szb   # 将第 4 个组数重新定义为 szb

二、``与$() 命令替换

在 `` 中可以使用 ${} 直接把变量和字符串拼接起来

[szb@szb shell48]$ echo `date`
Tue Jul 12 17:58:49 CST 2022

[szb@szb shell48]$ echo $(date)
Tue Jul 12 17:58:57 CST 2022

三、$(())与expr 整数运算

*需要转义,运算符前后需要空格
[szb@szb shell48]$ echo `expr 2 + 3`
5

[szb@szb shell48]$ echo $((2+3))
5