首页 > 系统相关 >shell脚本——函数与数组

shell脚本——函数与数组

时间:2023-11-23 19:55:52浏览次数:39  
标签:shell 函数 echo 数组名 数组 阶乘 bash

函数

函数和别名很像

有些脚本会被反复使用

alias 脚本比较复杂

函数 脚本的别名

使用函数可以避免代码重复,增加可读性,简化脚本

定义

函数名 () {

脚本

}

function 函数名 (){

脚本

}

先定义在调用

#!/bin/bash
os () {
if grep -iq centos /etc/os-release
then
echo "该系统是centos"
elif grep -iq ubuntu /etc/os-release
then
echo "该系统是ubuntu"
else
echo "该系统既不是centos,也不是ubuntu"
fi
}

os

 #用“.”(source)不用bash

函数的返回值

加 local 关键字 可以让 变量 只在函数中生效,不会影响外部环境

local:只在函数内部生效,外部不生效

return:自定义返回值(0~255)

如果使用函数 那么 $?使用就会受限

我们可以使用return自定义$?的返回值,来判断 函数中的命令是否成功

#!/bin/bash
user () {

if [ $USER = root ]
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi

}
user

函数的传递参数

需要注意

脚本的$1 $2

函数的$1 $2

是没有关系的

函数的$1$2是指跟在函数后面的值

 

 拓展:

阶乘:

#!/bin/bash
fact () {
   if [ $1 -eq 1 ]
   then
   echo 1
   else
   echo $[$1*`fact $[$1-1]`]
   fi
}
fact $1

 #求5的阶乘结果 120

4的阶乘结果 *5
3的阶乘结果 *4
2的阶乘结果 *3
1的阶乘结果 *2

1的阶乘结果是 1

#一个正整数的阶乘,是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!

n!=1✖2✖3✖...✖n

阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n

 

垃圾回收站:

#!/bin/bash
DIR=`mktemp -d /tmp/trash-$(date +%F_%H-%M-%S)XXXXXX`
mv $* $DIR
echo $* is move to $DIR
alias rm=/data/ljz.sh

 #将目录中不需要的文件用这个脚本删除,会在/tmp/这个目录下创建一个删除当成的日期、时间结尾为6个随机字符的文件夹,并收入

 数组

数据的集合称为数组

普通数组:下标是数子

关联数组:下标是有含义的字符串

变量:存储单个元素的内存空间  一 一对应

数组:存储多个元素的连续的内存空间,相当于多个变量的数据集合 一对多

数组名和索引下标

  • 索引的编号从0开始,属于数值索引
  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
  • bash的数组支持稀疏格式(索引可以不连续)

在使用数组前,先声明

declare -a 普通数组 (不需要手动 声明,系统帮你声明)

关联数组一定要手动声明

declare -A 数组名

定义数组的方法

1、数组名=(数组值 ,中间用空格隔开)

2、数组名[下标1]=值1

数组名[下标2]=值2

.......

数组名[下标n]=值n

例子
a=(10 20 30 40 50)
调用数组(单个调用)
echo ${a[0]}
10
echo ${a[1]}
20
echo ${a[2]}
30
...
全部调用
echo ${a[@]}
10 20 30 40 50
echo ${a[*]}
10 20 30 40 50
显示数组的值的个数
echo ${#a[@]}
显示数组的下标的个数
echo ${!a[@]}
删除数组
unset 数组名

关联数组

例子:
declare  -A f
f[name]=cjw
f[home]=js
f[people]=4

 

数组切片

a= (10 20 30 40 50)

echo ${a[@]:2:2} 他的结果是30 40

跳过前两个,再往后取两个值

如何遍历数组

a=(zs lisi ww jj)
for i in ${a[@]}
do
echo $i
done



r=`echo $[RANDOM%38]`
echo ${a[$r]}

最大值和最小值

#!/bin/bash
for i in {0..9}
do
  a[$i]=$RANDOM
  [ $i -eq 0 ] && min=${a[0]} && max=${a[0]}
  [ ${a[$i]} -gt $max ] && max=${a[$i]}
  [ ${a[$i]} -lt $min ] && min=${a[$i]}
done

echo "数组所有值为:" ${a[@]}

echo "最大值是:" $max
echo "最小值是:" $min

# 随机生成10个数,从中选出最大值和最小值

数组排序算法:

冒泡排序:

#!/bin/bash
#生成一个随机数组
for i in {0..9}
do
  a[$i]=$RANDOM
done
echo "原始数组为: ${a[@]}"
l=${#a[@]}
#定义变量l为数组a的长度10
for((i=1;i<$l;i++))
#需要比较的轮次
do
  for ((j=0;j<$l-$i;j++))
  #相邻的数需要比较的次数
  do
  first=${a[$j]}
  #数组的第一个数
  k=$[$j+1]
  #计算数组下一个数的下标
  second=${a[$k]}
  #下一个数
  if [ $first -gt $second ]
  then
  temp=$first
  a[$j]=$second
  a[$k]=$temp
  fi
  done
done

echo "排序后的数组: ${a[@]}"

冒泡 是通过数字比较 将大的数往后排 小的数往前面排
5个数字 5-1=4 需要比较4轮 才能知道每一个数字的具体位置
    a=(70 40 30 60 50)
轮次        总个数      需要比较的数        比几次       找到的数
第1轮    5      5个数      比4次    找到最大数
第2轮    5      4个数      比3次    找到第二大数
第3轮    5      3个数      比2次    找到第三大的数
第4轮    5      2个数      比1次    找到第四大的数

标签:shell,函数,echo,数组名,数组,阶乘,bash
From: https://www.cnblogs.com/chenjw0608/p/17852362.html

相关文章

  • 代码随想录-数组
    704.二分查找https://leetcode.cn/problems/binary-search/description/classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){......
  • Python Chap3 变量与函数
    #变量与函数##变量1.变量是一个**名字**,它所指代的是一段数据2.使用=来对这段数据的区域进行赋值x=53.新的值会覆盖掉旧的值4.新值的数据类型不必与旧值相同##变量命名规则1.必须以字母或者下划线_开头2.命名可由字母,数字或下划线组成3.大小写敏感4.尽量避免使......
  • JavaScript字符串函数,都在这里了
    先来一波JavaScript提供了许多内置的字符串函数,用于处理和操作字符串。下面是一些常用的字符串函数的总结:length:返回字符串的长度。varstr="Hello";varlen=str.length;//返回5concat:将多个字符串连接起来。varstr1="Hello";varstr2="World";varresul......
  • 变量与函数Variables and Functions
    Task04:变量与函数VariablesandFunctions变量Variables变量是一段数据,用"="对某个变量名赋值新的值会覆盖掉旧的值新值的数据类型不必与旧值相同x=5print(x)x="data"print(x)data变量命名规则:必须以字母或下划线(_)开头命名可由字母、数字和下划线组成大小写敏感......
  • Fortran 中write函数用法详解及格式化输出简介
    目录write函数用法详解及格式化输出简介write的最基础用法print格式化输出常用格式控制符详解Iw.[m]Fw.dEw.d[Ee]Dw.dAwnXLw字符串/不常用格式控制符详解Gw.d[Ee]TcTLnTRnSP,SSBN,BZkPBw[.m]Ow[.m]Zw[.m]使用print进行格式化输出附录format命令格式控制符号表参考write函数......
  • js 对象数组排序
    //排序,根据name名称中的数字排序sortList(a:any,b:any){if(a?.name&&b?.name){constaStr=a.name.replace(/[^\d]/g,'')constbStr=b.name.replace(/[^\d]/g,'')......
  • js 数组、字符串常用方法
    JavaScript数组的常用操作增:push()向数组的末尾添加一个或更多元素,并返回新的长度unshift()在数组开头添加任意多个值,然后返回新的数组长度splice()传入三个参数,分别是开始位置、0(要删除的元素数量)、插入的元素,返回空数组concat()首先会创建一个当前数组的副本,然后再把它......
  • 初识回调函数
    1、定义1)声明函数指针类型typedefint(*CallBackFunction)(inta,intb);2)定义函数指针对象CallBackFunctionCallBackFunction_PTR;3)初始化函数指针对象voidset_call_back(CallBackFunctioncbf){ CallBackFunction_PTR=cbf;......
  • Java8函数式接口, 方法引用, 构造器引用, 数组引用
    函数式(Functional)接口只包含一个抽象方法的接口,称为函数式接口。你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明我们可以在一个接口上使用@Functionallnterface注解,这样做可以检查......
  • 构造函数的执行顺序
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceBCode_Framework_ConsoleApp{classProgram{staticvoidMain(string[]args){Customercust......