用shell脚本实现一个对数组求和的函数,数组通过实参传递给函数,写一个函数,输出当前用户的uid和gid,并使用变量接收结果

news2025/1/14 18:44:35

目录

1.实现一个对数组求和的函数,数组通过实参传递给函数

结果为:

2.写一个函数,输出当前用户的uid和id,并使用变量接收结果

 结果为:

shell脚本指令前七个网页链接:

八、shell中的分支语句

【1】if···else分支

【2】test指令

1、创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用if判断文件有哪些权限 

2、终端输入年份,判断闰平年(四年一闰,百年不闰,四百年再闰) 

3、终端输入一个.sh文件名,判断文件是否存在,如果存在判断文件是否有可执行权限,如果有执行脚本,如果没有添加可执行权限,如果文件不存在,创建脚本文件

4、终端输入一个.c文件名,判断文件中是否有内容,如果有内容编译该文件,如果没有内容删除文件

5、终端输入两个文件名,判断文件的时间戳哪一个更新

【3】case···in语句

1、终端输入学生成绩,判断等级100-90A,90-80B,80-70C,70-60D,其他不及格

2、终端输入一个字符,判断是字母还是数字字符

3、终端输入年,月,判断该月有多少天,1-12以外的月份,输入不合理

总结:

九、循环语句

【1】while

1、求1-100的和,5050

2、终端输入数组,使用while循环,实现数组中元素的求和

3、终端输入行数,打印直角三角形

【2】for

1、求100-1000内的水仙花数,(个位^3+十位^3+百位^3=数本身)

2、定义一个稀疏数组,求数组中元素的和

3、求家目录下目录文件和普通文件个数的和 

 使用连续列表的情况

【3】select···in

【4】select···in和case···in结合

1、终端输入一个游戏名,让用户选择是否下载,如果用户选择的是Y|YES|y|yes就下载该游戏,N|NO|n|no就不下载该游戏。 

十、辅助控制关键字

【1】break

十一、函数

【1】定义

【2】函数的调用

【3】函数如何获取外部参数 

【4】获取函数的返回值

 【5】没有返回值的函数怎么接收结果

【6】local在函数中的使用


1.实现一个对数组求和的函数,数组通过实参传递给函数

#!/bin/bash
function sumarr()
{
	sum=0
	arr=($*)
	for i in ${arr[*]}
	do
		((sum+=i))
	done
	echo "数组的和为:"$sum
}
sumarr 100 100 10 20 30 40

结果为:

2.写一个函数,输出当前用户的uid和id,并使用变量接收结果

#!/bin/bash
function getuidgid()
{
	uid=`id -u`
	gid=`id -g`
	echo "uid为:$uid"
	echo "gid为:$gid"
}
ugid=`getuidgid`
echo $ugid

 结果为:

shell脚本指令前七个网页链接:

https://blog.csdn.net/ck0056/article/details/132745232

八、shell中的分支语句

【1】if···else分支

[]就是test指令
#单分支结构
if [ test语句 ]    -----> if  test 表达式 
then
    语句块
fi

#双分支
if [ test语句 ]    -----> if  test 表达式 
then
    语句块
else 
    条件不成立执行的语句块
fi

#多分支语句
if [ test语句 ]    -----> if  test 表达式 
then
    语句块
elif [ test语句 ]   ------> elif test 表达式 
then
    条件不成立执行的语句块
fi

#!/bin/bash
num1=90
num2=300
#if [ $num1 -le $num2 ]
if test $num1 -le $num2
then
    echo "num1<=num2"
fi

【2】test指令

test是一个终端指令,用于条件判断

man test

字符串:------>test对于字符串的判断,需要给字符串加""
string1 = string2:判断字符串1和字符串2是否相等
string1 != string2:判断字符串1和字符串2是否不相等
-n string1:判断字符串1不为空
-z string1:判断字符串1为空

整形数据的判断:
-eq:两个数相等
-ne:两个数不相等
-gt:第一个大于第二个数
-ge:第一个数大于等于第二个数
-lt:第一个数小于第二个数
-le:第一个数小于等于第二个数

文件相关的操作:
file1 -nt file2:1的时间戳比2更新
file1 -ot file2:1的时间戳比2更旧
file1 -ef file2:1和2有相同的inode号
-b:文件存在且为块设备文件
-c:文件存在且为字符设备文件
-L/-h:文件存在且为软链接文件
-S:文件存在且为套接字文件
-s:文件存在且有内容  
-e:文件存在
-f:文件存在且为普通文件
-r:存在且有可读权限
-w:文件存在且有可写权限
-x:文件存在且有可执行权限  

1、创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用if判断文件有哪些权限 

#!/bin/bash
touch 1
chmod 241 1
if [ -r 1 ]
then
    echo "文件1有可读权限"
fi
if [ -w 1 ]
then
    echo "文件1有可写权限"
fi
if [ -x 1 ]
then
    echo "文件1有可可执行权限"
fi

2、终端输入年份,判断闰平年(四年一闰,百年不闰,四百年再闰) 

#!/bin/bash
read -p "请输入一个年份" year

#对年份的判断
#year对4\100和400取余都是算术运算,需要借助于(())\$[]\let\expr
#test指令内不能使用&&和||进行运算,test提供了-a进行逻辑与,-o进行逻辑或
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]
#if [ $((year%4)) -eq 0 ] && [ $((year%100)) -ne 0 ]  || [ $((year%400)) -eq 0 ]
#if [ $((year%4==0&&year%100!=0||year%400==0)) -eq 1 ]
then
    echo "$year是一个闰年"
else
    echo "$year不是一个闰年"
fi

3、终端输入一个.sh文件名,判断文件是否存在,如果存在判断文件是否有可执行权限,如果有执行脚本,如果没有添加可执行权限,如果文件不存在,创建脚本文件

#!/bin/bash
read -p "请输入.sh文件" var
if [ -e "$var" ]
then
    echo "文件存在"
     if [ -x "$var" ]
     then
      bash $var
else 
         chmod 777 $var
fi
else
    echo"文件不存在"
    touch $var
fi

4、终端输入一个.c文件名,判断文件中是否有内容,如果有内容编译该文件,如果没有内容删除文件

#!/bin/bash
read -p "请输入一个.c文件" filename
if [ -s $filename ]   #判断文件是否存在且有内容
then
    gcc $filename
else
    if [ -e $filename ]   #如果文件存在
    then
        rm $filename
        echo "$filename已删除"
    else 
        echo "$filename不存在"
    fi
fi

5、终端输入两个文件名,判断文件的时间戳哪一个更新

#!/bin/bash
read -p "请输入两个文件名"  filename1 filename2
if [ $filename1 -nt $filename2 ]
    #如果条件成立,-nt参数表示前面文件的时间戳更新
then
    echo "$filename1更新"
else
    echo "$filename2更新"
fi

【3】case···in语句

case $变量名 in
    常量1)
        语句
        ;;       ------->类似于C中break的作用,;;除了最后一条分之外,都不能省略
    常量2)
        语句
        ;;
    ····   
    常量n)
        语句
        ;;
    *)         ------->类似于C中default,但是*表示通配所有情况,只能放在最后
        语句
esac    
 
case···in中常量可能的形式:
1|2|3|4):满足1,2,3,4中任一个即可
[0-9]):满足0-9中任一个
[0-3]|4):满足0-3和4中的任一个   

1、终端输入学生成绩,判断等级100-90A,90-80B,80-70C,70-60D,其他不及格

#!/bin/bash
read -p "请输入成绩" score
ret=$((score/10))
: 'case $score in
    1??|9?)
        echo "A"
        ;;
    8?)
        echo "B"
        ;;
    7?)
        echo "C"
        ;;
    6?)
        echo "D"
        ;;
    *)
        echo "不及格"
esac'

case $ret in
    10|9)
        echo "A"
        ;;
    8)
        echo B
        ;;
    7)
        echo C
        ;;
    6)
        echo D
        ;;
    *)
        echo "不及格"
esac

2、终端输入一个字符,判断是字母还是数字字符

read -p "请输入一个字符" var
case $var in
    [0-9])
        echo "是一个数字"
        ;;
    [A-Z]|[a-z])
        echo "是一个字母"
        ;;
    *)
        echo 不是数字也不是字母
esac    

3、终端输入年,月,判断该月有多少天,1-12以外的月份,输入不合理

总结:

  1. case···in语句,判断变量的值,$变量名
  2. 在shell中;;不能不写,最后一个分支可以不写
  3. *通配所有情况,如果想使用*表示其他分支的情况,不能把*放在上面

九、循环语句

【1】while

while [ test语句 ]   ------>while test 表达式
do
    循环体
done

#!/bin/bash
i=0
while [ $i -lt 5 ]
do
    echo hello world
    ((i++))
done

1、求1-100的和,5050

2、终端输入数组,使用while循环,实现数组中元素的求和

3、终端输入行数,打印直角三角形

#!/bin/bash
read -p "请输入行数" line
i=1
j=1
while [ $i -le $line ]
do
    j=1    #每一次进入内层循环前j都从1开始
    while [ $j -le $i ]
    do
        echo -n "*"
        ((j++))
    done
    echo ""   #每行输出结束需要换行
    ((i++))
done

【2】for

第一种:类似于C的格式
for ((表达式1;表达式2;表达式3))
do
    循环体
done

第二种:shell中的格式
for 变量名 in 字符串列表
do
    循环体
done

for i in aa bb cc dd 
do
    echo $i
done

执行逻辑:
   让变量循环遍历,字符串列表中的每一种情况,遍历结束后结束循环,
循环的次数和字符串列表中字符串的个数有关

1、求100-1000内的水仙花数,(个位^3+十位^3+百位^3=数本身)

#!/bin/bash
#for i in `seq 100 999`
for i in {100..999}   #{1..3}展开1-3内的每一个数
do
    x=$((i%10))  #求个位
    y=$((i/10%10)) #求十位
    z=$((i/100)) #求百位
    if [ $((x**3+y**3+z**3)) -eq $i ]
    then
        echo $i是一个水仙花数
    fi

done

2、定义一个稀疏数组,求数组中元素的和

arr=([0]=12 [5]=78 [7]=23)
sum=0
for j in ${arr[*]}
do
    ((sum+=j))
done
echo $sum

3、求家目录下目录文件和普通文件个数的和 

#!/bin/bash
fnum=0
dnum=0
for i in `ls ~`
do
    if [ -d ~/$i ]
    then
        ((dnum++))
    fi
    if [ -f ~/$i ]
    then
        ((fnum++))
    fi
done
echo $((dnum+fnum))

 
  
#!/bin/bash
#var1和var2都是软连接文件
var1=2
var2=test1
#对软连接文件判断是,实际是在判断源文件
if [ -f $var1 ]
then
    echo "$var1是一个普通文件"
fi

if [ -d  $var2 ]
then
    echo "$var2是一个目录文件"
fi   

 使用连续列表的情况

1、seq 起始值 间隔值 终止值 ---->在终端回显,起始到终止值间的连续序列
seq 1 1 100 --->输出1-100    
seq 如果后面只有一个数,默认是终止值,起始值和间隔值默认为1
拿到seq的结果需要使用命令置换符
`seq 1 1 100`
2、{1..3} ---->展开1-3内的每一个数,中间是两个.不能多写

【3】select···in

select 变量名 in 选项列表
do
    语句块
done

执行逻辑:
会在终端打印选项列表,让用户选择,用户选择是需要选择对应的序号,
如果用户不输入直接回车,会再打印一次选项列表,
如果选择错误,变量就获取到空值

#!/bin/bash
select i in aa bb cc dd
do
    echo $i
done

运行的结果
1) aa
2) bb
3) cc
4) dd
#?

如果想要退出select···in语句,直接使用ctrl+c

【4】select···in和case···in结合

#!/bin/bash 



#select```in和case ```in结合
#可以通过用户的不同选择执行不同的指令
select i in linux wins macos q Q
do
    case $i in
        linux)
            echo "打开的是Linux系统"
            ;;
        wins)
            echo "打开的是wins系统"
            ;;
        macos)
            echo "打开的是macos系统"
            ;;
        q)
            break
            ;;
        Q)
            exit
            ;;
        *)
            echo "选择错误"
    esac
done

echo hello world

1、终端输入一个游戏名,让用户选择是否下载,如果用户选择的是Y|YES|y|yes就下载该游戏,N|NO|n|no就不下载该游戏。 

#!/bin/bash
read -p "请输入游戏名" gname

select i in Y YES y yes N NO n NO
do
    case $i in 
        Y|YES|y|yes)
            echo "下载$gname"
            ;;
        N|NO|n|no)
            echo "不下载$gname"
            exit
    esac
done

十、辅助控制关键字

【1】break

C中:退出本层循环

continue n ------->退出n层本次循环

continue 1 ------->1可以不写

#!/bin/bash
for((i=1;i<3;i++))
do
    echo "进入第一层循环 i=$i*******************"
    echo 
    for j in `seq 1 1 2`
    do
        echo "进入第二层循环 j=$j------------------"
        echo 

        for k in {1..3}
        do
            echo "进入第三层循环 k=$k /"
            echo 

            if [ $k -eq 2 ]
            then
                echo "准备跳出循环"
                #break 3 
                continue 3  
            fi

            echo "退出第三层循环 k=$k/"
            echo 
        done
        echo "退出第二层循环 j=$j------------------"
        echo 
    done
    echo "退出第一层循环 i=$i*******************"
    echo 
done

十一、函数

【1】定义

shell中:
function  函数名()
{
    函数体
    return 返回值(如果实现函数时有返回值就写return)
}


shell中函数的注意事项:
1、function在定义函数时,可以加也可以不加(建议加)
2、()内不能添加任何内容,函数是否有参数根据调用来决定
3、如果函数有返回值,直接在函数的定义中写出return 
4、shell中的函数仍然满足先定义后调用的原则,shell中函数的定义和声明不能分开

【2】函数的调用

函数名 实参1 实参2 实参3 ···· (函数有参数的情况)

函数名 (没有参数)

【3】函数如何获取外部参数 

仍然通过位置变量获取  ${n}

脚本的外部传参和函数的外部传参互不干扰:
如果在函数中使用位置变量获取到的就是函数的外部参数,
如果在脚本中使用位置变量获取到的就是脚本的外部参数,$0只能获取脚本名

【4】获取函数的返回值

$? 获取函数的返回值 ----->使用$?的上一条指令一定是函数的调用

$?的本质是获取到上一条指令的执行结果,

#!/bin/bash
function fun()
{
    echo hello world
}

function add()
{
    echo $(($1+$2))
    echo $0
    a=258
    return $a   #返回值只能返回0-255之中的数
}
add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a

 【5】没有返回值的函数怎么接收结果

如果函数没有返回值,但是有输出语句,可以使用命令置换符接收

#!/bin/bash
function fun()
{
    echo hello world
}

a=90
function add()
{
    #echo $(($1+$2))
    #echo $0
    a=258
    return $a   #返回值只能返回0-255之中的数
}
: 'add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a  #可以访问a的值,a是一个全局变量
'
#如何接受fun函数的结果
ret=`fun`
echo $ret   #代码只有1行输出,fun中的输出已经被命令置换符接收了
add 
echo $a     #258,因为a在函数内被改变了

【6】local在函数中的使用

#!/bin/bash
function fun()
{
    echo hello world
}

a=90
function add()
{
    #echo $(($1+$2))
    #echo $0
    a=258
    local b=80   #被定义成了一个局部变量
    echo $b
    unset b     #unset是可以清空局部变量
    echo $b

    return $a   #返回值只能返回0-255之中的数
}
: 'add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a  #可以访问a的值,a是一个全局变量
'
#如何接受fun函数的结果
ret=`fun`
echo $ret   #代码只有1行输出,fun中的输出已经被命令置换符接收了
add 
echo $a     #258,因为a在函数内被改变了
echo $b     #空行,因为b在函数内是一个loacl类型的变量,局部变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CFTC可能比SEC更可怕,将监管炮口直接对准DeFi?

还未开始享受Uniswap在法庭上为DeFi行业带来的“胜利果实”&#xff0c;美国商品期货委员会&#xff08;CFTC&#xff09;在一个星期之后立即将其无情砸碎&#xff0c;并将其监管大炮直接对准了DeFi衍生品市场&#xff0c;乃至整个DeFi行业。 2023年9月7日&#xff0c;CFTC宣布…

【小程序/APP 备案】什么样的小程序/APP需要备案,备案要求是什么?

博主&#xff1a;_LJaXi 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;无 什么样的小程序需要备案&#xff1f; 根据最新相关政策规定&#xff0c;从2023年9月1日起&#xff0c;所有的移动应用程序&#xff08;APP&#xff09;和小程序都需要进行备案。这个政策…

网络安全之认识网络安全网格架构(CSMA)

“网络安全网格&#xff08;CyberSecurity Mesh&#xff09;”是 Gartner 提出的网络安全技术发展新趋势&#xff0c;近两年连续入选其年度重要战略技术趋势研究报告&#xff0c;成为当前网络安全领域流行的热词&#xff0c;受到网络安全从业者的高度关注。 一、概念产生的背景…

如何保持 SSH 会话不中断?

哈喽大家好&#xff0c;我是咸鱼 不知道小伙伴们有没有遇到过下面的情况&#xff1a; 使用终端&#xff08;XShell、secureCRT 或 MobaXterm 等&#xff09;登录 Linux 服务器之后如果有一段时间没有进行交互&#xff0c;SSH 会话就会断开 如果正在执行一些非后台命令&#…

十二要素数字高精度自动气象站——多要素预测,异常预警

在当今这个科技高度发达的时代&#xff0c;我们的生活已经与天气预报密不可分。从每天出门前查看天气预报&#xff0c;到规划周末活动&#xff0c;再到农业、航空、航海等领域的专业应用&#xff0c;天气对我们的影响无处不在。为了满足人们对于精准气象信息的需求&#xff0c;…

基于非合作博弈的微电网容量优化配置——附Matlab代码

目录 文章摘要&#xff1a; 研究背景&#xff1a; 微电网结构&#xff1a; 基于非合作博弈的容量配置方法&#xff1a; 基于粒子群算法的求解方法&#xff1a; 程序运行结果&#xff1a; Matlab代码数据下载&#xff1a; 文章摘要&#xff1a; 微电网容量优化配置是提高…

一文解析-通过实例讲解 Linux 内存泄漏检测方法

一、mtrace分析内存泄露 mtrace&#xff08;memory trace&#xff09;&#xff0c;是 GNU Glibc 自带的内存问题检测工具&#xff0c;它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下&#xff0c;其基本设计原理为设计一个函数 void mtrace ()&#x…

Gin框架之路由详解

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。 GET POST 以及获取 Get Post 传值 动态路由传值 r.GET("/list/:cid", func(c *gin.Context) {cid := c.Param("cid&…

XML解析 不允许有匹配 _[xX][mM][lL]_ 的处理指令目标

以上错误是在解析xml参数时候报出的。 我这里错误的原因在于&#xff0c;<?xml version\"1.0\" encoding\"UTF-8\"?>少了个空格&#xff0c;参考下图&#xff1a; 下面一行才是对的。

通过Power Platform自定义D365CE业务需求 - 1. Microsoft Power Apps 简介

Microsoft Power Apps是一个趋势性的、无代码和无代码的商业应用程序开发平台,配有一套应用程序、服务和连接器。其数据平台为构建适合任何业务需求的自定义业务应用程序提供了快速开发环境。随着无代码、少代码应用程序开发的引入,任何人都可以快速构建低代码应用程序,并与…

2023最全软件测试基础+字节大佬整理的面试笔记(超详细~)

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

hive的建表语句

hive建表语句CREATE TABLE ccwn_zh_event_push (customerid string,cardnumber string,accountnumber string,eventcode string,eventtime string,activities string,activityRefuseCode string,lables string)PARTITIONED BY(dt string)ROW FORMAT SERDE org.apache.hadoop.hi…

一文读懂java变量类型

前言 在学习和使用Java编程语言时&#xff0c;理解变量类型是至关重要的基础知识。Java是一种静态类型语言&#xff0c;强调变量必须先声明其类型&#xff0c;才能进行后续操作。因此&#xff0c;对于初学者来说&#xff0c;了解Java中不同的变量类型及其特性是迈向编程成功的…

不到5分钟就被赶出来的面试,我直呼太变态了......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到7月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直…

Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 在Unity开发中&#xff0c;性能优化是一个非常重要的方面。一个常见…

目标检测入门

一、目标检测任务对比 二、目标检测发展路线 基于深度学习的目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal)&#xff0c;直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一…

LightDB 23.3 通过GUC参数控制commit fetch

背景 commit游标提交之后&#xff0c;可以继续使用fetch进行结果集的操作。commit和fetch结合使用功能开发时不用考虑分布式。后续测试分布式时&#xff0c;发现持有portal后&#xff0c;会对querydesc进行非空判断&#xff0c;若querydesc为空&#xff0c;会造成崩溃。加上qu…

PHP 排序函数使用方法,按照字母排序等操作

详解PHP排序方法使用 一、sort() 函数 用于对数组单元从低到高进行排序。 //数组 $data array(D,F,A,C,B); //排序 sort($data); //输出排版标签 echo "<pre>"; //打印数据 print_r($data);die;输出结果&#xff1a; 二、rsort() 函数 用于对数组单元从高到…

得帆信息副总裁——孔金:低代码在医药行业的应用实践

医药行业作为国计民生的重点行业之一&#xff0c;受到法律法规的严格监管&#xff0c;其信息化程度普遍较高&#xff0c;也是较早通过ERP&#xff08;企业资源管理系统&#xff09;、WMS&#xff08;仓储管理系统&#xff09;、TMS&#xff08;物流管理系统&#xff09;、MES&a…

linux 系统资源命令

系统资源命令 当前系统负载 w查看的是整体的负载&#xff0c;可以来观察当前系统有没有压力 w 系统当前负载 第一行显示的内容依次为&#xff1a;时间、系统运行时间、登录用户数、平均负载(1分钟、5分钟、15分钟) 第二行后展示的信息为&#xff1a;当前登录的都有哪些用户、在…