Shell之字符串、数组、内置命令、运算符

文章目录

😹 作者: gh-xiaohe
😻 gh-xiaohe的博客
😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

🚏 Shell字符串变量

🚀 Shell字符串变量:格式介绍

目标:

  • 1、能够使用字符串的3种方式
  • 2、掌握3种方式的区别
  • 3、能够获取字符串的长度

介绍:

  • 字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)

🚬 字符串的3种格式

  • 1、单引号方式
  • 2、双引号方式, 推荐
  • 3、不用引号方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKNJOPAs-1666447727215)(Shell第二天笔记.assets/image-20200610164651589.png)]

🚬 字符串的3种格式区别

1、使用单引号 '' 的字符串:(不建议使用,没有办法解析变量)

  • 任何字符都会原样输出,在拼接字符串中使用变量是无效的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NUAZ3MeJ-1666447727216)(Shell第二天笔记.assets/image-20200610163234693.png)]

2、由双引号" "包围的字符串:(推荐)

  • 其中包含了变量,那么该变量会被解析得到值,而不是原样输出。
  • 字符串中还可以出现双引号的子字符串,但是需要转义。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QesNoVzo-1666447727217)(Shell第二天笔记.assets/image-20200610163716853.png)]

3、不被引号包围的字符串:

  • 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
  • 字符串中不能出现空格,否则空格后边的字符串会作为其他命令解析。

在这里插入图片描述

🚬 获取字符串的长度

语法:

${#字符串变量名}

含义:

  • 获取字符串的字符长度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJvmFQAM-1666447727218)(Shell第二天笔记.assets/image-20200610165428148.png)]

🚬 小结

能够使用字符串的3种方式:

  • 单引号方式
  • 双引号方式[推荐]
  • 不使用引号方式

掌握3种方式的区别:

  • 单引号, 原样输出, 不会解析里面的变量
  • 双引号, 会解析里面的变量, 并且可以使用子双引号, 需要转义
  • 不使用引号, 也会解析里面的变量, 但是不能含有空格, 空格后面的字符串会作为命令去执行

能够获取字符串的长度:

  • ${#var_name}

🚬 字符串拼接方式

1、无符号拼接
2、双引号拼接
3、混合拼接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RviZEjn-1666447986587)(Shell第二天笔记.assets/image-20200610171003827.png)]

🚒 Shell字符串变量:字符串截取

目标:

  • 1、掌握shell字符串截取的常用格式

语法:

格式说明
${变量名:start:length}从 string 字符串的左边第 start 个字符开始,
向右截取 length 个字符。start从0开始
${变量名:start}从 string 字符串的左边第 start 个字符开始截取,直到最后。
${变量名:0-start:length}从 string 字符串的右边第 start 个字符开始,
向右截取 length 个字符。start从1开始, 代表右侧第一个字符
${变量名:0-start}从 string 字符串的右边第 start 个字符开始截取,直到最后。
${变量名#*chars}从 string 字符串左边第一次出现 *chars 的位置开始,
截取 *chars 右边的所有字符。
${变量名##*chars}从 string 字符串左边最后一次出现 *chars 的位置开始,
截取 *chars 右边的所有字符。
${变量名%chars*}从 string 字符串右边第一次出现 chars* 的位置开始,
截取 chars* 左边的所有字符。
${变量名%%chars*}从 string 字符串右边最后一次出现 chars* 的位置开始,
截取 chars* 左边的所有字符

🚬 案例

字符串"welcome to itheima"

# 从左侧第0个开始,向左截取2个字符
# 从左侧第11个开始,向左截取所有字符
# 从右侧第5个开始,向右截取2个字符
# 截取左边第一次出现字符e右边的所有字符
# 截取左边最后一次出现字符e右边的所有字符
# 截取右边第一次次出现字符e左边的所有字符
# 截取右边最后一次出现字符e左边的所有字符
  • 从左侧第0个开始,向左截取2个字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oSRd7ITL-1666491271730)(Shell第二天笔记.assets/image-20200707151451728.png)]

  • 从左侧第11个开始,向左截取所有字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZzS5ZXFe-1666491271731)(Shell第二天笔记.assets/image-20200707151735114.png)]

  • 从右侧第5个开始,向右截取2个字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXdK6CCn-1666491271732)(Shell第二天笔记.assets/image-20200707151355501.png)]

  • 从左侧查找第一次出的e字符,截取他右边的所有字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdeRm0jG-1666491271732)(Shell第二天笔记.assets/image-20200707151952438.png)]

  • 截取左边最后一次出现字符e右边的所有字符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B08dRsB0-1666491271732)(Shell第二天笔记.assets/image-20200707152103808.png)]

  • 截取右边第一次次出现字符e左边的所有字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFZxq7JU-1666491271732)(Shell第二天笔记.assets/image-20200707152615594.png)]

  • 截取右边最后一次出现字符e左边的所有字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGWDtyST-1666491271733)(Shell第二天笔记.assets/image-20200707152632316.png)]

🚬 小结

常用:

格式说明
${变量名: start :length}从左边start位置开始截取length个字符长度, 从0开始
${变量名: start}从左边start位置开始截取到最后所有字符

🚏 Shell索引数组变量

🚀 Shell索引数组变量:定义-获取-拼接-删除

目标:

  • 1、能够定义Shell数组
  • 2、能够获取Shell数组数据
  • 3、能够进行Shell数组的拼接, 删除

介绍:

  • Shell 支持数组(Array), 数组是若干数据的集合,其中的每一份数据都称为数组的元素。

    • 注意Bash Shell 只支持一维数组,不支持多维数组。

🚀 数组的定义

语法:

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔. 语法为:

array_name=(item1  item2 ...)  # 方式1
array_name=([索引下标1]=item1  [索引下标2]=item2  ...)  # 方式2

注意,赋值号 = 两边不能有空格

演示:

1、定义数字存储100,3,22,58,77,17,20

nums=(29 100 13 8 91 44)

2、Shell 是弱类型的,它并不要求所有数组元素的类型必须相同

arr=(20 56 "http://www.itcast.cn/")

Shell数组元素定义后不是固定的, 定义后还可以赋值

# 给数组索引赋值
arr[6]=100

3、可以给指定元素赋值初始化

# 制定下标去赋值,下标可以不连续,但是数组的长度依然是3个
arr2=([0]=1 [2]=100 [4]=aa)

由于上面只赋值了3个元素, 所以数组的长度是3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bjkKZATA-1666491973541)(assets/image-20200629143058345.png)]

🚄 数组的获取

语法:

1、通过下标获取元素值,index从0开始

${arr[index]}

注意使用{ }

2、获取值同时复制给其他变量

item=${arr[index]}

3、使用 @* 可以获取数组中的所有元素

${arr[@]}
${arr[*]}

4、获取数组的长度或个数

${#arr[@]}
${#arr[*]}

5、获取数组指定元素的字符长度

${#arr[索引]}

在这里插入图片描述

🚒 数组的拼接

介绍:

所谓 Shell 数组拼接(数组合并),就是将两个数组连接成一个数组

语法:

使用 @* 获取数组所有元素之后进行拼接

array_new=(${array1[@]} ${array2[@]} ...)
array_new=(${array1[*]} ${array2[*]} ...)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1I7nql0-1666492633973)(assets/image-20200629145734269.png)]

🚤 数组的删除

介绍:

删除数组指定元素数据和删除整个数组数据

语法:

1、删除数组指定元素数据

unset array_name[index]

2、删除整个数组

unset array_name

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ghzeXeF-1666492633973)(assets/image-20200629163807706.png)]

🚬 小结

1、能够定义Shell数组

array_name=(item1 item2 ...)
array_name=([索引1]=item1 [索引2]=item2 ...)

2、能够获取Shell数组数据

${array_name[索引下标]}
${array_name[*]}
${array_name[@]}

3、数组的拼接

array_newname=(${array_name1[*]} ${array_name2[*]} ...)

4、数组的删除

unset array_name[索引]  
unset array_name

🚏 Shell内置命令

目标:

  • 1、理解内置命令的含义
  • 2、能够使用alias内置命令进行给命令定义别名

🚬 内置命令介绍

Shell 内置命令,就是由 Bash Shell 自身提供的命令,而不是文件系统中的可执行脚本文件

使用type 来确定一个命令是否是内置命令:吧

type 命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mG8sl1it-1666493595968)(assets/image-20200630083936549.png)]

通常来说,内置命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前 Shell 进程的一个函数, 还是在当前Shell环境进程内, 减少了上下文切换。

🚬 内置命令列表

命令说明
:扩展参数列表,执行重定向操作
.读取并执行指定文件中的命令(在当前 shell 环境中)
alias为指定命令定义一个别名
bg将作业以后台模式运行
bind将键盘序列绑定到一个 readline 函数或宏
break退出 for、while、select 或 until 循环
builtin执行指定的 shell 内建命令
caller返回活动子函数调用的上下文
cd将当前目录切换为指定的目录
command执行指定的命令,无需进行通常的 shell 查找
compgen为指定单词生成可能的补全匹配
complete显示指定的单词是如何补全的
compopt修改指定单词的补全选项
continue继续执行 for、while、select 或 until 循环的下一次迭代
declare声明一个变量或变量类型。
dirs显示当前存储目录的列表
disown从进程作业表中刪除指定的作业
echo将指定字符串输出到 STDOUT
enable启用或禁用指定的内建shell命令
eval将指定的参数拼接成一个命令,然后执行该命令
exec用指定命令替换 shell 进程
exit强制 shell 以指定的退出状态码退出
export设置子 shell 进程可用的变量
fc从历史记录中选择命令列表
fg将作业以前台模式运行
getopts分析指定的位置参数
hash查找并记住指定命令的全路径名
help显示帮助文件
history显示命令历史记录
jobs列出活动作业
kill向指定的进程 ID(PID) 发送一个系统信号
let计算一个数学表达式中的每个参数
local在函数中创建一个作用域受限的变量
logout退出登录 shell
mapfile从 STDIN 读取数据行,并将其加入索引数组
popd从目录栈中删除记录
printf使用格式化字符串显示文本
pushd向目录栈添加一个目录
pwd显示当前工作目录的路径名
read从 STDIN 读取一行数据并将其赋给一个变量
readarray从 STDIN 读取数据行并将其放入索引数组
readonly从 STDIN 读取一行数据并将其赋给一个不可修改的变量
return强制函数以某个值退出,这个值可以被调用脚本提取
set设置并显示环境变量的值和 shell 属性
shift将位置参数依次向下降一个位置
shopt打开/关闭控制 shell 可选行为的变量值
source读取并执行指定文件中的命令(在当前 shell 环境中)
suspend暂停 Shell 的执行,直到收到一个 SIGCONT 信号
test基于指定条件返回退出状态码 0 或 1
times显示累计的用户和系统时间
trap如果收到了指定的系统信号,执行指定的命令
type显示指定的单词如果作为命令将会如何被解释
typeset声明一个变量或变量类型。
ulimit为系统用户设置指定的资源的上限
umask为新建的文件和目录设置默认权限
unalias刪除指定的别名
unset刪除指定的环境变量或 shell 属性
wait等待指定的进程完成,并返回退出状态码

🚀 Shell内置命令之一:alias设置别名

🚬 alisa 介绍

alisa 用于给命令创建别名。

好处: 可以将经常操作比较复杂的命令进行设置别名, 通过别名的操作提高工作效率

若该命令且不带任何参数,则显示当前 Shell 进程中的所有别名列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ug8M05N7-1666494472946)(assets/image-20200630084814561.png)]

上面是系统为了方便命令操作默认将部分命令创建为别名 ll 的命令与ls -l的效果一样, 就是因为ll是别名

🚬 alias别名定义语法

alias 别名="命令"

这里使用单引号或双引号都可以

🚬 unalias 别名删除语法

删除指定的别名

unalias 别名

删除当前Shell环境中所有的别名

unalias -a

注意: 以上2种方式删除都是临时删除当前Shell的别名, 如果想永久删除必须去配置文件中手动删除

🚬 alias演示

输出所有进行信息

ps -aux

给上面的命令起别名为psList, 并使用psList输出

[root@gh ~] alias psList="ps -aux"


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ea31mQ09-1666494472959)(assets/image-20200630091546806.png)]

删除psList别名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBMG1xAt-1666494472959)(assets/image-20200630091747276.png)]

🚬 小结

1、理解内置命令的含义

  • 就是Shell内部提供的命令, 可以直接使用
  • 内置命令与外部的脚本文件执行区别
    • 内置命令: 执行速度快, 内置命令执行是当前Shell环境的一部分, 就在当前进程内执行, 减少了上下文切换
    • 外部的脚本文件: 执行速度慢, 需要磁盘I/O操作, 并且是fork一个新的进程运行脚本文件,导致进程之间上下文切换

2、能够使用alias内置命令

  • 定义别名语法: alias 别名="命令"

  • 删除别名: unalias 别名

    🚄 Shell内置命令之二:echo输出字符串

目标:

  • 1、能够echo输出不换行的字符串
  • 2、能够使用echo输出转义字符

echo命令介绍:

  • echo 是一个 Shell 内置命令,用于在终端输出字符串,并在最后默认加上换行符

🚬 echo输出语法

默认输出换行语法:

echo 字符串

输出不换行语法:

echo -n  字符串

🚬 演示

1、.创建echo1.sh

touch echo1.sh

2、编辑文件内容并保存

vim echo1.sh

# 文件内容
#!/bin/bash
echo "hello"
echo "world"
echo -n "itheima "
echo -n "shell "

3、运行echo1.sh文件观察效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SegzUSKg-1666494962076)(assets/image-20200630094335603.png)]

itheima shell输出为一行

🚬 echo输出转义字符

🚭 \n 转义字符

用于echo输出字符串非结尾处的换行, 但是默认echo无法解析/n 转义字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FncmhBv6-1666494962078)(assets/image-20200630100606558.png)]

🚭 -e 参数

-e 参数用于解析转义字符

echo -e '字符串中含有转义字符'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRjDFyAn-1666494962079)(assets/image-20200630100653445.png)]

🚭 /c 转义字符

/c 用于强制清除echo的结尾换行输出

必须配合-e 一起使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dk8Ahrpw-1666494962079)(assets/image-20200630100953178.png)]

🚬 小结

1、echo输出不换行的字符串

  • echo -n 输出的数据

2、echo输出转义字符有哪些

  • \n 换行字符
  • \c 清除echo结尾的换行
  • echo -e 含有转义字符的数据

🚒 Shell内置命令之三:read读取控制台输入

目标:

  • 1、理解read命令的作用

  • 2、使用read给多个变量赋值

  • 3、使用read读取1个字符

  • 4、使用read限制时间输入(验证码)

介绍:

  • read 是 Shell 内置命令,用于从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从终端控制台读取用户输入的数据;如果进行重定向,那么可以从文件中读取数据
    • 后续讲解Shell重定向

语法:

read [-options] [var1 var2 ...] # 省略的话,默认输入到$REPLY中

options表示选项,如下表所示;var表示用来存储数据的变量,可以有一个,也可以有多个

optionsvar都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 变量中。

$REPLY保存read最后一个读入命令的数据

options支持的参数

选项说明
-a array把读取的数据赋值给数组 array,从下标 0 开始。
-d delimiter用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。
-n num读取 num 个字符,而不是整行字符。
-p prompt显示提示信息,提示内容为 prompt。
-r原样读取(Raw mode),不把反斜杠字符解释为转义字符。
-s静默模式(Silent mode),不会在屏幕上显示输入的字符。
当输入密码和其它确认信息的时候,这是很有必要的。
-t seconds设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,
那么 read 将会返回一个非 0 的退出状态,表示读取失败。
-u fd使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

🚬 示例1:多个变量赋值

需求: 使用 read 命令给多个变量赋值

步骤:

  • 编辑文件read1.sh脚本文件
# 使用read命令读取数据,要有提示信息"请输入姓名,年龄,爱好:" 将数据赋值给多个变量
# 打印每一个变量的值

演示:

创建文件

touch read1.sh

编辑文件

vim read1.sh

# read1.sh文件内容

#!/bin/bash
read -p "请输入姓名,年龄,爱好: " name age hobby
echo "姓名:${name}"
echo "年龄:${age}"
echo "爱好:${hobby}"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77jKrYPC-1666529743765)(Shell第二天笔记.assets/image-20221023205500808.png)]

执行文件运行效果

在这里插入图片描述

🚬 示例2:读取一个字符

需求: 从终端控制台只读取一个字符

步骤:

  • 编辑文件read2.sh脚本文件
# 使用read命令读取数据,要有提示信息"您确定要删除数据吗?(请输入y/n):" 并且设置读取一个字符
# 打印这个字符输出

演示:

创建文件

touch read2.sh

编辑文件

vim read2.sh

# read2.sh文件内容
				
#!/bin/bash
read -p '您确定要删除数据吗?(请输入y/n):' -n 1 char 
# 或者 read -n 1 -p '您确定要删除数据吗?(请输入y/n):'  char 
		# -n设置读取几个字符 
		# 1 读取一个字符
		# 变量是接收字符的 定义变量char
		# -n 和 -p 没有前后顺序
		    # 添加换行,因为输入一个字符read就结束了,没有等用户回车,所有添加换行 
printf '\n' # 可以直接打印字符串,可以直接写转义字符 同时也可以使用一个echo代替
echo '你输入的字符为:'$char

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmanSdDj-1666531232470)(Shell第二天笔记.assets/image-20221023212022127.png)]

注意:

-n 1只读取一个字符。运行脚本后,只要输入的一个字符,立即读取结束,不用等待用户按下回车键。

printf '\n'语句用于换行,否则 echo 的输出结果会和用户输入的内容位于同一行,不容易区分

执行文件运行效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCiL6bq1-1666531232472)(Shell第二天笔记.assets/image-20221023211853119.png)]

🚬 示例3:限制时间输入

需求: 在终端控制台输入时, 设置指定时间内输入密码

步骤:

  • 编辑文件read3.sh脚本文件
# 使用read命令读取数据,要有提示信息"请输入密码(20秒内):" 并且设置限制时间20秒
# 输出一个换行
# 使用read命令读取数据,要有提示信息"请再次输入密码(20秒内):" 并且设置限制时间20秒
# 输出一个换行
# 校验密码与再次输入的密码是否一致

演示:

创建文件

touch read3.sh

编辑文件

vim read3.sh

# read3.sh文件内容

#!/bin/bash
read -t 20 -sp '请输入密码(20秒内):' pwd1 # s静默模式(看不到) p密码
echo
read -t 20 -sp '请再次输入密码(20秒内):' pwd2
printf '\n'
if
  [ $pwd1 == $pwd2 ]
then # 成立
  echo '密码与确认密码一致, 验证通过'
else
  echo '密码与确认密码不一致,验证失败'
fi #结束

在这里插入图片描述

执行文件运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsznVTgX-1666531510966)(assets/image-20200630115148158.png)]

🚬 小结

  • 1、read命令是什么
    • 用于读取标准输入(终端控制台用户输入的数据)
  • 2、read给多个变量赋值
    • read var1 var2 …
  • 3、read读取1个字符
    • read -n 1 var1
  • 4、read限制时间输入
    • read -t 秒数 var

🚤 Shell内置命令之四:exit退出

目标:

  • 掌握exit的应用场景

介绍:

  • exit 用于退出当前Shell环境进程结束运行, 并且可以返回一个状态码.一般使用 $? 可以获取退出状态码

语法:

  • 正确退出语法
exit  # 默认返回状态码0, 一般代表命令执行成功
  • 错误退出语法
exit 非0数字 # 数字建议的范围0~255,  一般代表命令执行失败

🚬 exit应用场景

1、结束当前Shell进程
2、当Shell 进程执行出错退出时,可以返回不同的状态值代表不同的错误

  • 比如执行一个脚本文件里面操作一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

🚬 示例:Shell脚本文件中使用exit退出

需求: 编写Shell脚本使用exit 退出, 退出时返回一个非0数字状态值, 执行脚本文件并打印返回状态值

步骤:

  • 1、创建exit.sh文件
  • 2、编辑exit.sh文件, 使用exit 数字 退出结束当前Shell
  • 3、执行文件,打印返回状态值

演示:

创建文件

touch exit.sh

编辑文件

vim exit.sh

exit.sh文件内容: 使用exit 数字 退出结束当前Shell

#!/bin/bash
echo 'one'
exit 6
echo 'two'

执行文件运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WaDJ1MY-1666531914749)(assets/image-20200630150541964.png)]

🚬 小结

exit的应用场景

  • 1、结束当前Shell进程
  • 2、可以返回不同的状态码, 用于不同的业务处理

🚗 Shell内置命令之五:declare设置变量

目标:

  • 1、能够使用declare设置变量的属性
  • 2、能够使用declare查看全部Shell变量与函数
  • 3、能够使用declare实现索引数组与关联数组变量

介绍:

  • declare命令用于声明 shell 变量。可用来声明变量并设置变量的属性,也可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

🚬 declare命令作用

1、declare设置变量的属性[重要]
2、查看全部Shell变量与函数
3、实现关联数组变量[重要]

🚬 declare设置变量的属性语法

declare [+/-][aArxif][变量名称=设置值]
  • +/- "-“可用来指定变量的属性,”+"则是取消变量所设的属性。
  • a array,设置为普通索引数组
  • A Array,设置为key-value关联数组
  • r readonly,将变量设置为只读, 也可以使用readonly
  • x exprot,设置变量成为全局变量,也可以使用export
  • i int,设置为整型变量。
  • f function,设置为一个函数变量
🚭 示例1:设置变量属性

需求: 操作一个变量属性, 设置为整型\ 取消整型\设置为只读等操作

步骤:

  • 1、使用declare设置一个整型变量并赋值
  • 2、取消变量的整型类型, 尝试设置其他类型值尝试
  • 3、设置变量只读, 尝试赋值测试

演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HeiZUYu-1666788232538)(Shell第二天笔记.assets/image-20200630164537518.png)]

🚬 实现key-value关联数组变量语法

关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

declare -A 关联数组变量名=([字符串key1]=值1 [字符串key2]=值2 ...)

declare也可以用于定义普通索引数组, -a 参数创建普通或索引数组 -A 创建关联数组

declare -a 关联数组变量名=(值1 值2 …)

declare -a 关联数组变量名=([0]=值1 [1]=值2 …)

获取指定key的值

${关联数组变量名[key]}

获取所有值

${关联数组变量名[*]} # 方式1
${关联数组变量名[@]} # 方式2
🚭 示例2:实现普通索引数组

需求: 使用declare定义一普通数组,并获取打印元素数据的值

步骤:

  • 1、创建declare1.sh文件
  • 2、编辑declare1.sh文件内容, 使用declare定义普通数组数据与打印
  • 3、执行文件

演示:

创建文件

touch declare1.sh

编辑文件

vim declare1.sh

# declare1.sh文件内容
#!/bin/bash
declare -a arr1=(1 2 3 aa)
echo ${arr1[1]}
echo ${arr1[*]}

declare -a arr2=([0]=1 [1]=2  [2]=3  [4]=aa)
echo ${arr2[1]}
echo ${arr2[*]}

declare -a arr2[3]=4
echo ${arr2[*]}

执行文件运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XU6fJJK-1666788232540)(assets/image-20200701101651788.png)]

🚭 示例3:实现key-value关联数组

需求: 使用declare定义关联数组并打印输出

演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drpHsNcB-1666788232541)(assets/image-20200701105943576.png)]

注意:使用参数-A 才是关联数组 , 关联数组无法使用索引获取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXyJ8Mue-1666788232541)(assets/image-20200708093710733.png)]

🚬 查看全部Shell变量与函数定义语法

declare [-fF]

declare 后无参数, 查询全部Shell变量与函数定义, 与set功能一模一样

-f 查询仅显示函数定义

-F 查询仅显示函数名字

🚭 示例4:查看当前Shell所有函数名

查看所有变量与所有函数

declare

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w08DWUlt-1666788232541)(assets/image-20200701093735283.png)]

查看所有函数与定义

declare -f

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxIqgDLD-1666788232542)(assets/image-20200701094119327.png)]

查询所有函数名列表

declare -F

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eA52xEgl-1666788232542)(assets/image-20200701094553443.png)]

🚬 小结

1、使用declare设置变量的属性(重点)

  • declare [+/-][aArxif] 变量名=变量值

2、使用declare查看全部Shell变量与函数

  • declare
  • declare -f 查询所有函数的定义
  • declare -F 查询所欲函数的名称列表

3、使用declare实现普通索引数组和关联数组变量(重点)

  • 索引数组: declare -a array_name=(item1 item2 …)

  • 关联数组: declare -A array_name=([字符串key1]=item1 [字符串key2]=item2 …)

🚏 Shell运算符

🚀 Shell运算符:算术运算符

目标:

  • 1、掌握算术运算符的使用

  • 2、掌握expr求值表达式命令

🚬 expr(求值表达式)命令

介绍:

  • expr 是 evaluate expressions 的缩写,译为“求值表达式”。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等, 后续讲解。

🚬 expr语法

计算语法

expr 算术运算符表达式

注意: 运算表达式

获取计算结果赋值给新变量语法

result=`expr 算术运算符表达式` #反引号 反引号可以执行里面的命令

反引号 反引号可以执行里面的命令

演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YmMrVgB3-1666790455086)(assets/image-20200701150021331.png)]

注意:

  • 运算符表达式中每个数字与符号之间要有空格

  • 只能进行整数的运算,不能进行小数的运算

🚬 算术运算符介绍

下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:

运算符说明举例
+加法expr $a + $b 结果为 3
-减法expr $a - $b 结果为 -1
*乘法expr $a \* $b 结果为 2
/除法expr $b / $a 结果为 2
%取余expr $b % $a 结果为 0
=赋值a=$b 将把变量 b 的值赋给 a

四则运算中如果使用了(), 也需要转义 \( 1 + 1 \),首个\(和数字之间需要有空格

演示:

operation1.sh脚本代码

#!/bin/bash
# 使用read命令读取输入两个数字
read -p "请输入第一个数字:"
read -p "请输入第二个数字:"

# 对两个数字进行算数运算
echo "a=${a} b=${b}"
echo "a + b = `expr $a + $b`"
echo "a * b = `expr $a \* $b`"
echo "a - b = `expr $a - $b`"
echo "a * b = `expr $a \* $b`"
echo "b / a = `expr $b / $a`"
echo "b % a = `expr $b % $a`"
echo "b * (a + a) = `expr $b \* \( $a + $a \)`"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGfs1dQB-1666790455088)(Shell%E7%AC%AC%E4%BA%8C%E5%A4%A9%E7%AC%94%E8%AE%B0.assets/image-20221026212014768.png)]

🚬 小结

1、常见算术运算符的使用

  • + - \* / %

2、expr执行运算命令

  • expr 表达式

  • 变量名=`expr 表达式`

🚄 Shell运算符: 比较运算符

目标:

  • 1、了解有哪些比较运算符

  • 2、掌握推荐使用哪个比较运算符

🚬 整数比较运算符

语法:

  • 下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:

执行方式一:单词方式[ ],执行过成功中,字符与字符之间,符号与符号之间是有空格的

执行方式二:符号(( )),不需要有空格

经常搭配if使用

运算符说明举例
-eqequals 检测两个数是否相等,相等返回 0, 否则返回1。[ $a -eq $b ] 返回 1。
-nenot equals检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 0。
-gtgreater than检测左边的数是否大于右边的,
是返回0, 否则1
[ $a -gt $b ] 返回 1。
-ltlower than检测左边的数是否小于右边的,
是返回0, 否则1
[ $a -lt $b ] 返回 0。
-gegreater equals检测左边的数是否大于等于右边的,
是返回0, 否则1
[ $a -ge $b ] 返回 1。
-lelower equals检测左边的数是否小于等于右边的,
是返回0, 否则1
[ $a -le $b ] 返回 0。
<检测左边的数是否小于右边的,
是返回0, 否则1
(($a<$b)) 返回0
<=检测左边的数是否小于等于右边的,
是返回0, 否则1
(($a<=$b)) 返回0
>检测左边的数是否大于右边的,
是返回0, 否则1
(($a>$b)) 返回1
>=检测左边的数是否大于等于右边的,
是返回0, 否则1
(($a>=$b)) 返回1
==检测左边的数是否等于右边的,
是返回0, 否则1
(($a==$b)) 返回1
!=检测左边的数是否不等于右边的,
是返回0, 否则1
(($a!=$b)) 返回0

注意:

  • 整数比较运算符只支持整数不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
  • 每个命令都有返回值, 这个后面我们会讲解退出状态再具体说明,返回0代表成功, 返回1代表失败

演示:

operation2.sh脚本代码

#!/bin/bash
a=1 b=2
echo "a=${a} b=${b}"
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"  # 输出这个
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"  # 输出这个
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"  # 输出这个
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"   # 输出这个
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"  # 输出这个
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"  # 输出这个
else
echo "$a -le $b: a 大于 b"
fi

if (($a > $b))
then
echo "$a > $b: a 大于 b"
else
echo "$a > $b: a 不大于 b"
fi
if (($a < $b))
then
echo "$a < $b: a 小于 b"
else
echo "$a < $b: a 不小于 b"
fi
if (($a >= $b))
then
echo "$a >= $b: a 大于或等于 b"
else
echo "$a >= $b: a 小于 b"
fi
if (($a <= $b))
then
echo "$a <= $b: a 小于或等于 b"
else
echo "$a <= $b: a 大于 b"
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVdiZqz0-1667005656264)(assets/image-20200704084311714.png)]

🚬 字符串比较运算符

可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串

语法:

  • 下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
  • 字符串比较可以使用[[ ]][ ] 2种方式
    • [] 大于号、小于号需要使用\转义,[[]]不需要转义
运算符说明举例
== 或 =相等。用于比较两个字符串或数字,相同则返回 0。可以使用=[ $a == $b ] 返回1
[ $a = $b ] 返回 1
[[ $a == $b ]] 返回1
[[ $a = $b ]] 返回1
!=不相等。用于比较两个字符串或数字,不相同则返回 0。[ $a != $b ] 返回 0
[[ $a != $b ]] 返回 0
<小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1[ $a \< $b ] 返回 0
[[ $a < $b ]] 返回 0
>大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1[ $a \> $b ] 返回 1
[[ $a > $b ]] 返回 1
-z检测字符串长度是否为0,如果长度为0返回则返回0, 否则返回1。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,如果长度不为 0 则返回0, 否则返回1。[ -n “$a” ] 返回 true。
$检测字符串是否为空,为空返回0,不为空返回1[ $a ] 返回 true。
  • 注意:字符串比较没有 <= 可以通过 [[ "a" < "b" && "a" == "b" ]]

演示:

operation6.sh脚本代码

#!/bin/bash

a="itheima" b="itcast" c=1 d=2
echo "a=${a},b=${b},c=${c},d=${d}"

if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi

if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi

if [[ $a > $b ]]
then
echo "$a > $b : a 大于 b"
else
echo "$a > $b: a 不大于 b"
fi

if [ $a \> $b ]
then
echo "$a > $b : a 大于 b"
else
echo "$a > $b: a 不大于 b"
fi

if [[ $c > $d ]]
then
echo "$c > $d : c 大于 d"
else
echo "$c > $d: c 不大于 d"
fi

if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi

if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi

if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfs1OoMo-1667005656265)(assets/image-20200704110751421.png)]

🚬 [[]] (推荐) 和 [] 的区别

比较运算符有个三个:[[]]、[]、(())

  • 不推荐使用(()) 原因:只能比较整数、字符串比较不了、小数也比较不了(不推荐)
🚭 区别1: word splitting(单词分割)的发生

区别说明:

  • [[]] 不会有word splitting发生
  • [] 会有word splitting发生

word splitting介绍:

  • 会将含有空格字符串进行分拆分割后比较

示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qsoWFNcy-1667005656265)(assets/image-20200704092823470.png)]

通过 $? 获取上一个命令的退出状态, 0代表成功, 1代表失败

🚭 区别2: 转义字符

区别说明:

  • [[]]< 不需要转义, 格式为 [[ 字符串1 < 字符串2 ]]
  • [] 需要对 <,> 转义 , 格式为 [ 字符串1 \< 字符串2 ]

示例:

[] 执行效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgWpVOau-1667005656266)(assets/image-20200704100701687.png)]

[[]] 执行效果, 不需要转义执行结果正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fqWq2oFN-1667005656266)(assets/image-20200704100843230.png)]

🚬 小结

1、了解有哪些比较运算符

整数比较运算符

比较方式: [](())

方式1: [ 整数1 options 整数2 ]

options: -eq -gt -ge -lt -le -ne

方式2: ((整数1 options 整数2))

options: < <= > >= == != 注意判断等于不可以使用 = ,等于在(())里面是赋值的含义

字符串,数字比较运算符

介绍: 可以比较2个变量, 变量的类型可以为字符串, 数字(整数,小数)

比较方式: [][[]]

方式1: [ 变量1 options 整数2 ]

options: <,>,==,=,!=

<,> 需要转义

会发生word splitting

方式2: [[ 变量1 options 变量2]]

options: <,>,==,=,!=

<,> 不需要转义

不会发生word splitting

2、推荐使用哪个比较运算符?

  • [[ 表达式 ]] 即可以实现数字和字符串比较, 并且不需要转义, 不会word splitting
  • 缺点:没有直接的小于等于,只能通过两个表达式来实现

🚒 Shell运算符: 布尔运算符

目标:

  • 1、掌握布尔运算符的使用

介绍:

运算符说明举例
!非运算,取反, 表达式为 true 则返回 false,
否则返回 true。
[ ! 表达式 ] 取反。
-oor 或运算,有一个表达式为 true 则返回 true。[ 表达式1 -o 表达式2 ]
-aand 与运算,两个表达式都为 true 才返回 true。[ 表达式1 -a 表达式2 ]

注意:布尔运算符放在[ ]或 与test 命令配合使用才有效

布尔运算符常与与test命令配合使用, 后续讲解

演示:

operation4.sh脚本代码脚本代码

#!/bin/bash
a=1 b=2

if [ $a -lt 2 -a $b -gt 10 ]
then
echo "$a 小于 2 且 $b 大于 10 : 返回 true"   
else
echo "$a 小于 2 且 $b 大于 10 : 返回 false"  # $b -gt 10不成立, 输出这个表达式
fi

if [ $a -lt 10 -o $b -gt 10 ]
then
echo "$a 小于 10 或 $b 大于 10 : 返回 true"  # $a -lt 10 成立, 输出这个表达式
else
echo "$a 小于 10 或 $b 大于 10 : 返回 false"
fi

if [ ! $a -gt $b ]
then
echo "$a 大于 $b 取反 : 返回 true"
else
echo "$a 大于 $b 取反 : 返回 false"   # $a -gt $b 为true , 取反为false, 输出这个表达式
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vcj72TJf-1667007228285)(assets/image-20200701170127507.png)]

🚬 小结

布尔运算符的使用

  • ! 取反
  • -o or, 或者, 只要有一个表达式成立返回0, 那么就返回0
  • -a and, 并且, 需要多个表达式必须全部成立才返回0, 否则返回1
  • 布尔运算符必须与[]使用 或者 与test命令一起使用, 后续讲解test命令

🚤 Shell运算符: 逻辑运算符

目标:

  • 1、能够使用逻辑运算符

  • 2、能够理解逻辑运算符与布尔运算符区别

介绍:

运算符说明举例
&&逻辑的 AND[[ 表达式1 && 表达式2 ]]
``
!逻辑非[[ ! 表达式 ]]

注意:

  • 1、使用&&|| 的运算符必须放在 [[]](())中才有效, 否则报错
  • 2、! 可以用在[],[[]]中, 不可以在(())

演示:

operation5.sh脚本代码

#!/bin/bash

a=1 b=2

if [[ $a -lt 10 && $b -gt 10 ]]
then
echo "返回 true" 
else
echo "返回 false"  # $b -gt 10 不成立, 输出false
fi

if [[ $a -lt 10 || $b -gt 10 ]]
then
echo "返回 true"   # $a -lt 10 成立,  输出true
else
echo "返回 false"  
fi

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkphWJXE-1667007228287)(assets/image-20200701172201560.png)]

🚬 小结

1、使用逻辑运算符

  • ! 逻辑非
  • && 逻辑与
  • || 逻辑或

2、理解逻辑运算符与布尔运算符区别

  • 布尔运算符: ! -o -a
    • 必须有[] 或test命令执行
  • 逻辑运算符: ! || &&
    • || && 必须有[[]] 或 (()) 执行
    • ! 可以用在 [] 或 [[]] , 不可以用在(())

🚗 Shell运算符: 文件测试运算符(重要)

目标:

  • 1、能够使用常用文件测试运算符检查文件
  • 例如: 文件是否存在\是否可读\是否可执行\是否为空\是否可写\是否是目录\是否是普通文件

🚬 linux系统文件类型介绍

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件

块设备文件: 比如计算机硬盘/dev/sda
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUyevRwi-1667007228288)(assets/image-20200708123349968.png)]

字符设备文件: 比如计算机的USB文件/dev/usb
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJwHnVk6-1667007228288)(assets/image-20200708123407345.png)]

设备文件都是对应计算机硬件的, 不同的设备文件代表不同的传输数据方式

  • p:管道文件

介绍:

文件测试运算符用于检测文件的各种属性。

属性检测描述如下:

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d filedirectory, 检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f filefile, 检测文件是否是普通文件(既不是目录,也不是设备文件)
,如果是,则返回 true。
[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,
则返回 true。
[ -k $file ] 返回 false。
-p file检测文件是否是有名管道文件,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r fileread,检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w filewrite,检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x fileexecute, 检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s filesize, 检测文件是否为空(文件大小是否大于0)
,不为空返回 true。
[ -s $file ] 返回 true。
-e fileexists, 检测文件(包括目录)是否存在,如果是,
则返回 true。
[ -e $file ] 返回 true。
file1 -nt file2new than(nt), file1是否比file2新[ file1 -nt file2 ]
file1 -ot file2old than(ot), file1是否比file2旧[ file1 -ot file2 ]

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: link, 检测文件是否存在并且是一个符号链接。

语法:

[ options 文件路径字符串][[ options 文件路径字符串 ]]

演示:

operation6.sh脚本代码

#!/bin/bash

file="/root/operation1.sh"
# 测试文件是否可写
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
# 测试是否可读
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
# 测试是否执行
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
# 测试文件是什么类型的文件
if [ -f $file ]
then
echo "文件是普通文件"
else
echo "文件是特殊文件"
fi
# 测试文件是否为空
if [ -s $file ]
then
echo "文件不是空"
else
echo "文件是空"
fi
# 测试文件是否存在
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
# 测试文件是否是目录
if [ -d $file ]
then
echo "文件是目录"
else
echo "文件不是目录"
fi

# 判断文件的新旧
file2="/root/operation2.sh"
if [ file -nt file2 ]
then
echo "operation1.sh文件比operation2.sh文件新"
else
echo "operation1.sh文件不比operation2.sh文件新"
fi

运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vSnO3ALr-1667007228289)(assets/image-20200703085454524.png)]

operation1.sh文件不可执行, 因为没有可执行权限

查看operation1.sh文件权限


在这里插入图片描述

给operation1.sh添加执行权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PMfkLGe-1667007228289)(assets/image-20200703085602758.png)]

重新执行operation6.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g9mVzG9p-1667007228290)(assets/image-20200703085719905.png)]

🚬 小结

常用文件测试运算符

  • 1、文件是否存在: -e
  • 2、是否可读 : -r
  • 3、是否可执行: -x
  • 4、是否为空: -s
  • 5、是否可写: -w
  • 6、是否是目录: -d
  • 7、是否是普通文件: -f
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: shell 字符串长度可以使用以下命令获取: ${#string} 其中,string为要获取长度的字符串。例如: str="hello world" echo ${#str} 输出结果为: 11 ### 回答2: 在Shell中,我们可以使用不同的方法来获取字符串的长度。 1. 使用`expr length`命令来获取字符串的长度。例如,假设我们有一个字符串`str="Hello World"`,我们可以使用以下命令来获取它的长度: ``` length=$(expr length "$str") echo "字符串的长度为:$length" ``` 输出将是:`字符串的长度为:11`。 2. 使用`${#string}`来获取字符串的长度。同样以字符串`str="Hello World"`为例,我们可以使用以下命令来获取它的长度: ``` length=${#str} echo "字符串的长度为:$length" ``` 输出也将是:`字符串的长度为:11`。 这两种方法都能够有效地获取字符串的长度,并且在Shell脚本中经常被使用。需要注意的是,如果字符串中包含特殊字符,可能会影响长度的计算结果。因此,在处理特殊字符时需要格外小心。 ### 回答3: 在shell脚本中,可以通过多种方法来获取字符串的长度。 1. 使用expr命令:使用expr命令可以通过求解表达式来获取字符串的长度,具体的操作如下: ``` string="Hello World" length=$(expr length "$string") echo "字符串长度为:$length" ``` 输出结果为:字符串长度为:11 2. 使用#操作符:在shell脚本中,可以使用#操作符来获取字符串的长度,具体操作如下: ``` string="Hello World" length=${#string} echo "字符串长度为:$length" ``` 输出结果为:字符串长度为:11 3. 使用awk命令:awk命令是用于处理文本数据的工具,也可以用于获取字符串的长度,具体操作如下: ``` string="Hello World" length=$(awk '{print length}' <<< "$string") echo "字符串长度为:$length" ``` 输出结果为:字符串长度为:11 以上是在shell脚本中获取字符串长度的几种方法。可以根据具体的需求选择适合自己的方法来获取字符串的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gh-xiaohe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值