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

shell常用语法

一、shell变量

定义变量语法:

变量名=值  # 等号两边不能有空格

示例:

#!/bin/bash
name="Alice"
echo "Hello, $name!"  # 使用变量

使用变量-语法:

两种方式:
第一种:${变量名}
第二种:$变量名

示例: 

代码示例:1 #! /bin/bash2 3 #定义变量的方式有两种4 #第一种:${变量名}5 name="Tom"6 echo "你好呀!${name}"7 8 #第二种:$变量名9 echo "你好呀!$name" 

 二、shell的数据类型

1.字符串

基本语法:

定义:str=”hello shell”
长度:${#str}
切片:${str:1:4}

代码示例:

#! /bin/bash
#定义字符串并赋值
str="I LOVE Shell!"
#取值
echo "str:${str}" 
#获取长度
echo "Length the str is ${#str}"
#获取字符串的切片
echo "str[1:6] is ${str:1:6}"

运行效果:

2. 数组

基本语法:

定义: arr=(vl v2 v3 v4 v5 v6)
通过索引获取元素: ${arr[0]}
获取列表所有元素:${arr[*]}
获取列表的长度:${#arr[*]}

代码示例:

1 #! /bin/bash
2 
3 #定义一个数组
4 zoo=(
5         Dog
6         pig
7         Monkey
8         Panda
9         lion
10 )
11 #输出所有元素:${变量名[*]}
12 echo "All Animal are ${zoo[*]}"
13 #输出数组长度(数组中元素的个数):${#变量名[*]}
14 echo "Length the zoo is ${#zoo[*]}"
15 #输出某个元素:${变量名[n]} n<=数组的长度-1
16 n=3
17 echo "zoo的第${n}个元素是:${zoo[$[n]]}"
18 #组合应用:
19 echo "zoo的最后一个元素是:${zoo[((${#zoo[*]})-1)]}"

 运行结果:

三、shell的逻辑判断

1.if else

基本语法:

if [ 条件 ]; then命令
elif [ 条件 ]; then命令
else命令
fi

示例:

#!/bin/bash
echo "请输入一个数字:"
read numif [ $num -gt 10 ]; thenecho "这个数字大于10"
elif [ $num -eq 10 ]; thenecho "这个数字等于10"
elseecho "这个数字小于10"
fi

运行结果:

请输入一个数字:
8
这个数字小于10

** 补充:文件目录的判断 **

1 #! /bin/bash
2 
3 path=$1
4 
5 #-e 判断文件是否存在
6 if [ -e $path ]
7 then
8         echo "$path 存在"
9 else    
10         echo "$path 不存在"
11 fi12 #-f 判断是否是文件
13 if [ -f $path ]
14 then
15         echo "$path 是文件"
16 else    
17         echo "$path 不是文件"
18 fi      19 #-d 判断是否是目录
20 if [ -d $path ]
21 then
22         echo "$path 是目录"
23 else
24         echo "$path 不是目录"
25 fi

运行结果:

if else小结

表达式使用: condition 和中括号之间,一定要有空格

2.case

语法:

case $变量名 in
"值 1") 操作;;
esac

四、shell的循环

1. for循环

for val in ${list[*]}:
docommandcommand
done

代码示例:

1 #! /bin/bash
2 
3 list=(
4         service1
5         service2
6         service3
7         service4
8         service5
9 )
10 
11 for service in ${list[*]}
12 do
13         echo "检查服务:${service}"
14 done

运行结果:

2. while循环

语法:

while condition
docommandcommand
done

五、shell函数

1. 语法:

[ function ] funname [()]{action;[return int;]}

说明:

  • 1、可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255).

2. 代码示例:

#!/bin/bashdemoFun(){echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

输出结果:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----

下面定义一个带有 return 语句的函数:

代码示例:

#!/bin/bashfunWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

输出结果:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 ! 

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

注意: return 语句只能返回一个介于 0 到 255 之间的整数,而两个输入数字的和可能超过这个范围。

要解决这个问题,您可以修改 return 语句,直接使用 echo 输出和而不是使用 return:

funWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumsum=$(($aNum + $anotherNum))echo "两个数字分别为 $aNum 和 $anotherNum !"echo $sum  # 输出两个数字的和
}

六、函数参数

 在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数$2表示第二个参数...

 1. 带参数的函数示例:

#!/bin/bashfunWithParam(){echo "第一个参数为 $1 !"echo "第二个参数为 $2 !"echo "第十个参数为 $10 !"echo "第十个参数为 ${10} !"echo "第十一个参数为 ${11} !"echo "参数总数有 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数:

参数处理说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
http://www.xdnf.cn/news/6546.html

相关文章:

  • 晶振的核心参数
  • 会计要素+借贷分录+会计科目+账户,几个银行会计的重要概念
  • 从 Vue3 回望 Vue2:组件设计升级——Options API vs Composition API
  • OpenResty Manager 介绍与部署(Docker部署)
  • C++算法(22):二维数组参数传递,从内存模型到高效实践
  • ERP知识手册【第三弹:INV(库存管理)】
  • Windows软件插件-写mp3
  • 2021-10-25 C++三的倍数含五
  • 动态规划之数列
  • 前端缓存策略
  • 【数据结构】栈与队列
  • Redis6为什么引入了多线程?
  • 20、工业协议转换与数据采集中间件 (模拟) - /数据与物联网组件/protocol-converter-middleware
  • std::deque 底层实现结构
  • 老字号焕新案例:天猫代运营如何让传统品牌年轻化破圈
  • SEO双核驱动:关键词与长尾词优化
  • JAVA:多线程使用哈希表
  • Web前端入门:JavaScript 的应用领域
  • [数据结构]7. 堆-Heap
  • undefined reference to vtable for DeviceAllocator‘
  • 【补充笔记】修复“NameError: name ‘ZhNormalizer‘ is not defined”的直接方法
  • Python基础
  • 吴恩达机器学习笔记:特征与多项式回归
  • springboot AOP中,通过解析SpEL 表达式动态获取参数值
  • 第二十五天打卡
  • GUI图形化演示
  • 【测试】用例篇
  • 免疫浸润分析
  • 哲学物理:太极图和莫比乌斯环有什么关系?
  • 【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)