Bash编程

目录:

  1. bash编程语法
  2. bash脚本编写

1.bash编程语法

Bash 编程基础

  • 变量
  • 引号
  • 数组
  • 控制语句
  • 函数

Bash 变量

语法: Variable_name=value

Bash 变量定义的规则

  • 变量名区分大小写,a和A为两个不同的变量。
  • 变量名可以使用大小写字母混编的形式进行编写。
  • 变量名与值之间的=两侧都不能有空格。
  • 在读取或打印变量时,需使用$+变量名。
  • 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换为变量值。

Bash 数据类型

在 Bash 中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型。

Bash 变量的类型

  • 系统定义的变量
    • 通常是以大写字母形式存在
    • 如 BASH、SHELL等
  • 用户定义的变量
    • 多数以小写字母参与命名
    • 但不具有大小写强制性规定

Bash 变量的定义与使用

letter_name="abc"

echo $letter_name

只读变量

a="123"

readonly a

删除变量

unset Variable_name

变量类型

字符串: your_name="Tom"

拼接字符串: greeting="hello, ${your_name},hello,hello"

数组array name=(value0 value1 value2 value3)

  • 取数组valuen=${array_name[n]}
  • 单独赋值array name[0]=value0

字符串的拼接

基本语法 str3="${str1}${str2}"

Bash 引号

  • 输入的内容为简单的字符串或文本时,单引号和双引号的作用没有任何区别
  • 输出一个已定义的变量,则需要使用双引号

数组

数组可以定义为相似类型元素的集合,在bash中数组不必是相似类型元素的集合

数组初始化

  • my_array=(A B "C" D)
  • echo "第一个元素为:${my_array[0]}"

数组单个定义

  • my_array[1]=B
  • echo "数组的元素为: ${my_array[*]}"
  • echo "数组的元素为: ${my_array[@]}"

索引数组的声明和赋值

declare -a Array_Name

索引数组

Array_Name[index_1]=value_1

Array_Name[index_2]=value_2

Array_Name=( [index_1]=value_1 [index_2]=value_2 )

关联数组的声明和赋值

declare -A Array_Name

关联数组

Array_Name[name1]=value_1

Array_Name[name2]=value_2

Array_Name=( [name1]=value_1 [name2]=value_2 )

数组的访问

declare -a arr1=( hello world )

echo ${arr1[0]}

declare -A arr2=( [key1]=hello [key2]=world )

echo ${arr2[key1]}

取出所有元素

declare -a arr=( hello world )

echo ${arr[@]}

echo ${arr[*]}

数组的长度

declare -a arr=( hello world )

echo "arr length is ${#arr[@]}"

向数组中添加元素

declare -a arr=( hello world )

arr+=(Tom)

arr[5]=harry

echo ${arr[*]}

输出索引

declare -a arr=( hello world )

arr+=(Tom) arr[5]=harry

echo "arr indexs is ${!arr[@]}"

控制语句 if

单条件

if [ expression ];

then statements fi

多条件与

if [ expression_1 ] && [ expression_2 ];

then statements fi

多条件或

if [ expression_1 ] || [ expression_2 ];

then statements fi

多分支

if [ expression_1 ] ;

then statements

elif [ expression_2 ] ;

then statements

else

statements fi

循环语句 for

for variable in list

do

commands

done

//或

for (( expression1; expression2; expression3 ))

do

commands

done

for 循环范围

for num in {10..0..1}

do

echo $num

done

for 循环数组

arr=( "Welcome" "to" "zhangjiakou" )

for i in "${arr[@]}"

do

echo $i

done

for i in ${arr[@]}

do

echo $i

done

for i in ${arr[*]}

do

echo $i

done

for i in "${arr[*]}"

do

echo $i

done

表达式 for 循环

for ((i=1; i<=10; i++))

do

echo "$i"

done

while 循环

while [ expression ];

do

commands;

multiple commands;

done
i=1

while(($i<=5))

do

echo $i

let "i++"

done

break 与 continue

  • break 语句可以终止 for 循环的重复性任务
  • continue 语句在 for 循环中以特定条件跳过该条件下给定的特定语句

函数

function_name() { commands }

变量的作用域

  • 默认情况下所有变量都定义为全局变量,即使在函数内部声明也是如此。
  • local关键字在函数内部声明局部变量,该变量只能够在该函数内部使用。

返回值

  • Bash 函数中,其返回值是执行的最后一个语句的状态。1-255(十进制)范围内表示失败,除此之外表示成功。
  • 想要从函数中返回任意实际的值,最简单的选择是将函数的执行结果分配给一个全局变量
  • 更好的选择是将值发送到 stdout 再打印输出

参数传递

  • $0 为函数本身
  • $1、2 ·  · ·n 参数传递的顺序位
  • $#保存传递给函数的函数的位置参数或数量
  • 当前进程ID号

  • $?显示最后一个命令的退出状态,0表示正常,其他表示错误退出

2.bash脚本编写

read命令

  • read命令是用于从终端或者文件中读取输入的内部命令。
  • 读取整行输入
  • 每行末尾的换行符不被读入

read命令使用

  • 从标准输入读取输入并赋值给变量
    • read var
  • 从标准输入读取多个内容
    • read var1 var2 var3
  • 不指定变量(默认赋值给REPLY)
    • read

脚本参数传递

  • $0脚本名称
  • 1\~n获取参数
  • #传递到脚本的参数个数。$脚本运行的当前进程ID号
  • $*以一个单字符串显示所有向脚本传递的参数
  • $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

算术运算

  • a=10 b=20
    • 加法`expr a +b`结果为30
    • 减法'expr a - b`结果为-10
  • * 乘法`expr a \\\* b`结果为200
  • / 除法'expr b / a`结果为2
  • % 取余'expr a % b`结果为10
  • = 赋值 a=$b 将把变量b的值赋给a
  • == 相等相同则返回true: [ a == b ] 返回 false
  • != 不相等不相同则返回true:[ a !=b ]返回true
  • -eq 检测相等[ a -eq b ]返回false
  • -ne 检测不相等[ a -ne b ]返回true
  • -gt 检测左边是否大于右边「a -gt b ]返回false
  • -lt 检测左边是否小于右边[ a -lt b ]返回true
  • -ge 检测左边是否大于等于右边[a -ge b ]返回false
  • -le 检测左边是否小于等于右边[ a-le b ]返回true

创建目录并生成文件

  • mkdir test
  • cd test
  • echo "hello" > test.txt
  • ls

Bash编程:

  1. 使用 bash 实现自动创建目录并生成文件。
  2. 使用 bash 判断目录是否存在。
相关推荐
机器视觉知识推荐、就业指导2 小时前
面试问题详解五:Qt 信号与槽的动态管理
开发语言·qt
四维碎片8 小时前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
IT码农-爱吃辣条8 小时前
Three.js 初级教程大全
开发语言·javascript·three.js
☺����9 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
染翰9 小时前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸9 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
兔老大RabbitMQ10 小时前
git pull origin master失败
java·开发语言·git
tt55555555555510 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
xiao助阵10 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python
科大饭桶10 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器