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

Shell脚本编程基础篇(2)

        在上一篇博客中,我们已经对Shell编程有了初步的认识,并对Shell的一些知识进行了梳理和应用,在这篇博客中,将衔接上一篇的内容,继续对Shell编程进行较为基础的讲解。如有需要的朋友,可以访问如下链接,参考学习上一篇的内容:

Shell脚本编程基础篇(1)-CSDN博客https://blog.csdn.net/weixin_49337111/article/details/146092297?spm=1001.2014.3001.5502

1、shell数组

        一个数组中可以存放多个值,但在bash shell中,仅支持一维数组。在初始化时不需要定义数组大小,同C/C++类似,shell数组的下标也是从0开始,获取shell数组中的元素值时,需要借助下标实现。

(1)、定义数组

        用括号( )来定义表示数组,数组中各个元素之间用"空格"符号分割开。

#!/bin/bash

#方法1
buf_demo1=(val1 val2 val3 val4)

#方法2
buf_demo2=(
val1
val2
val3
val4    
)

#方法3
buf_demo3[0]="Hello world.";
buf_demo3[1]="Good bye!";
buf_demo3[2]="Thank you";
buf_demo3[3]=".....";

(2)、读取数组

        获取shell数组元素的值,一般使用美元符号加大括号包围住数组名

①、读取数组的单个元素值:${array[index]}

#!/bin/bash

buf_demo=(5 4 3 2 1)

echo "buf_demo[0]: ${buf_demo[0]}"
echo "buf_demo[1]: ${buf_demo[1]}"
echo "buf_demo[2]: ${buf_demo[2]}"
echo "buf_demo[3]: ${buf_demo[3]}"
echo "buf_demo[4]: ${buf_demo[4]}"

 ②、读取数组的全部元素:${array[*]}${array[@]}

#!/bin/bash

buf_demo=(9 'a' 7 6 5 'das' 3 2 d 0)

echo "method1: ${buf_demo[@]}"
echo "method2: ${buf_demo[*]}"

(3)、获取数组长度

        在shell中,获取数组长度的方法和获取字符串长度的方法是一样的。相比于获取数组的全部元素命令,获取数组长度操作需要借助符号#

${#array[@]}

${#array[*]}

#!/bin/bash

buf_demo=('a' 1 'cat' 5 '666')

echo "buf lenth: ${#buf_demo[@]}"
echo "buf lenth: ${#buf_demo[*]}"

(4)、关联数组

        shell中可以使用关联数组。关联数组中引入了键值对概念,并且关联数组的键是唯一的

        关联数组可以使用一个任意的字符串或数字作为数组的下标,通过该字符串或数字即可访问关联数组的对应元素。

        在应用关联数组前,需要使用declare声明定义一个数组作为关联数组。

        declare -A array

#!/bin/bash

#方法1
declare -A buf_demo1=(["abc"]="123" ["def"]="456" ["hgk"]="789")

echo "${buf_demo1["abc"]}"
echo "${buf_demo1["def"]}"
echo "${buf_demo1["hgk"]}"

#方法2
declare -A buf_demo2=(
["111"]="aaaa"
["222"]="bbbb"
["333"]="cccc"
["444"]="dddd"
)

echo "${buf_demo2["111"]}"
echo "${buf_demo2["222"]}"
echo "${buf_demo2["333"]}"
echo "${buf_demo2["444"]}"

#方法3
declare -A buf_demo3

buf_demo3["hello"]="welcome to this world"
buf_demo3["heihei"]="hahahah a"
buf_demo3["flower"]="this is a blue"
buf_demo3["water"]="the weather is so hot!"

echo "${buf_demo3["hello"]}"
echo "${buf_demo3["heihei"]}"
echo "${buf_demo3["flower"]}"
echo "${buf_demo3["water"]}"

        在关联数组加一个感叹号 ! 可以获取数组的所有键

#!/bin/bash

declare -A buf_demo=(["abc"]="123" ["def"]="456" ["hgk"]="789")

echo "${!buf_demo[@]}"
echo "${!buf_demo[*]}"

2、shell输入获取

        read 命令是 Bash Shell 的内置命令,专门用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘中读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

        read 命令的语法格式如下:

read [options] [variables]

        read命令的常用选项

#读取输入一个值
read val1

#其中please input data为注释内容
read -p "please input data:" val1 val2 val3

#从文本输入
read val<1.txt 

3、shell注释

        以#开头的行,就是shell的注释行,即当前行被注释掉了。同样采取以#为注释的还有python

#!/bin/bash

echo hello world
#####################注释#####################
#--------------------------------------------
# Shell注释
# author:牛马大师兄
# date:2025/03/10 19:17

#--------------------------------------------

#

        多行注释

#!/bin/bash

echo hello world
#网上的教程较为常见的shell多行注释方法如下
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

#但经过实际的编程验证发现
#直接采用如下方法多行注释一样可行
<<COMMENT
内容1
内容2
...
内容n
COMMENT

: <<'COMMENT'
这是注释的部分。
可以有多行内容。
COMMENT



:<<!
内容1
内容2
...
内容n
!

4、shell命令

(1)、echo

        echo命令直接用于输出显示内容到终端或文件

        常用的输出格式为:echo str

#!/bin/bash

#显示普通字符串
echo "Welcom to Shell World!"    #字符串可选择是否加上引号
echo  Welcom to Shell World!

#显示转义字符
echo "\"hello world!\""
echo  \"hello world!\"

#显示变量
value=100
echo $value

#显示换行
echo -e "hello world!\n"
echo "hello world!"

#显示内容到文件中,临时重定向echo显示
echo "Byebye!">demo.txt

#显示命令执行结果
echo `date`    #显示当前日期时间

(2)、printf

        在shell脚本中的printf使用方式和C语言中的printf函数类似,实现的功能也是一样的。可以说shell的printf是对C语言printf的模仿和复现。

        shell中的printf 是由 POSIX 标准所定义的,故而使用 printf 的脚本比使用 echo 移植性好。

#使用方式
printf  format-string  [arguments...]

参数说明:
format-string: 一个格式字符串,它包含普通文本和格式说明符。
arguments: 用于填充格式说明符的参数列表。


#!/bin/bash
 
 #显示输出hello world!
 printf "Hello world!\n"
 echo -e "Hello world!\n"
 
 printf "Hello %s,today is %d %d %d %.2f\n" Tony 2025 3 10 20.58
 
 printf "dec:%d hex:%X oct:%o\n" 10 10 10       

(3)、test

        test命令用于判断两个条件是否成立,成立则输出为真,不成立输出非真。test测试判断的三种对象:字符串整数文件属性

①、数值测试

a -eq b: equal测试两个整数是否相等
a -ne b: not equal 测试两个是否不相等
a -gt b: greater 测试a是否大于b
a -ge b: greater or equal 测试a是否大于等于b
a -lt b: little 测试a是否小于b
a -le b: little or equal 测试a是否小于等于b

        代码中的 [] 执行基本的算数运算

#!/bin/bash

val1=100
val2=6

if test $[val1] -eq $[val2]
then
    printf "val1=val2"
else
    echo "val1!=val2"
fi

②、字符串测试

=         测试两个字符串内容是否完全一样
!=          测试两个字符串内容是否不一样
-Z(zero)    测试字符串是否为空,为空,返回true
-n(null)    测试字符串是否不为空,不为空,返回true

        在测试字符串变量时,需要防止字符串为空的技巧:

        引用变量后加一个额外的字符:test ${A}x = ${B}x

#!/bin/bash

str1="hello world!"
str2="byebye!"

if test $[str1] = $[str2]
then
    echo "str1 = str2"
else
    echo "str1 != str2"
fi

③、文件测试

-d         name 测试name是否是一个目录(dir) //  if  test -d  1.txt;then
-f         name 测试name是否是一个普通文件(file)
-L         name 测试name是否为符号链接文件(Link)
-r         name 测试name文件是否存在并可读(read)
-w         name 测试name文件是否存在并可写(write)
-x         name 测试name文件是否存在并可执行(excute)
-s         name 测试name文件是否存在并且长度不为0(size)
f1 -nt f2         测试f1 是否比f2更新(newer than)
f1 -ot f2         测试f1 是否比f2更旧(older than)

#!/bin/bash

 #单个文件检测
if test -e 1.txt
then
    echo '1.txt文件已存在!'
else
    echo '1.txt文件不存在!'
fi

#多个文件检测
if tets -e 1.txt -o -e 2.txt
then
    echo '1.txt或2.txt文件已存在!'
else
    echo '1.txt和2.txt文件均不存在!'
fi

        组合了两个或两个以上的表达式称为复合表达式,你可以用test([])内置的的操作符,也可以用条件操作符(&& || !)来实现。

test命令可以用[]来简写       

test expression [ expression ]

相关文章:

  • 前端 UI 框架发展史
  • 基于javaweb的JSP+Servlet学生请假管理系统设计和实现(源码+文档+部署讲解)
  • git 贮藏
  • flink cdc同步mysql数据
  • 万字深度剖析——JS数据结构(上)
  • Redis7——进阶篇(五)
  • 微型计算机的结构
  • 【知识】 LLM中的Scaling Laws是什么?
  • DeepSeek Kimi详细生成PPT的步骤
  • VSCode 2025最新前端开发必备插件推荐汇总(提效指南)
  • 深度学习与大模型基础-向量
  • 文件系统调用─── linux第17课
  • STM32 CAN模块原理与应用详解
  • 为什么大模型网站使用 SSE 而不是 WebSocket?
  • 如何为服务设置合理的线程数
  • 第5节:交换技术与VLAN技术
  • 用python和Pygame库实现“跳过障碍”游戏
  • Spring Boot HikariCP数据库连接池入门
  • 【AI】Stable Diffusion安装
  • 文本处理Bert面试内容整理-BERT的缺点是什么?
  • 中国戏剧梅花奖终评结果公示,蓝天和朱洁静等15名演员入选
  • 海军“吉祥方舟”号医院船开展海上卫勤演练
  • 优质文化资源下基层,上海各区优秀群文团队“文化走亲”
  • 国家统计局:下阶段要继续发挥宏观政策作用,促进价格合理回升
  • 义乌至迪拜“铁海快线+中东快航”首发,物流成本降低18%
  • 浙江理工大学传播系原系主任刘曦逝世,年仅44岁