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 ]