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

shell函数与数组

时间:2023-08-15 17:56:50浏览次数:38  
标签:10 shell 函数 echo sh bash 数组 root localhost

目录

shell函数与数组

shell函数

函数定义

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列

shell函数定义

  • 使用函数可以将大模块分割成小模块

函数的组成:函数名、函数体

[root@localhost ~]#help function  #函数帮助


函数定义:
function 函数名{
    命令序列
}

函数名(){
     命令序列
}

function 函数名(){
     命令序列
}
[root@localhost ~]#test () { ls; cd /opt; }
[root@localhost ~]#test
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost opt]#

调用函数的方法

[root@localhost ~]#vim test.sh
#!/bin/bash
os () {
 if grep -qi 'centos' /etc/os-release
 then
 echo "centos"
 elif grep -qi 'ubuntu' /etc/os-release
 then
 echo "ubuntu" 
 else
 echo "this system not support"
fi
}

os
if [ `os` = centos ]
then
yum install httpd -y
elif [ `os` = ubuntu ]
then
apt install apache2 -y
else
echo "不支持"
fi

[root@localhost ~]#bash test.sh
centos
已加载插件:fastestmirror, langpacks
base                                               
  正在安装    : httpd-2.4.6-99.el7.centos.1.x86_64                                                              3/3 
  验证中      : httpd-2.4.6-99.el7.centos.1.x86_64                                                              1/3 
  验证中      : mailcap-2.1.41-2.el7.noarch                                                                     2/3 
  验证中      : httpd-tools-2.4.6-99.el7.centos.1.x86_64                                                        3/3 

已安装:
  httpd.x86_64 0:2.4.6-99.el7.centos.1                                                                              

作为依赖被安装:
  httpd-tools.x86_64 0:2.4.6-99.el7.centos.1                      mailcap.noarch 0:2.1.41-2.el7                     

完毕!

[root@localhost ~]#scp test.sh 192.168.8.106:/opt/





[root@localhost ~]#vim hello.sh
#!/bin/bash
h () {
echo "hello"
}
nihao () {
echo `h`  `w`
}

w () {
echo "world"
}

nihao


[root@localhost ~]#bash hello.sh
hello world
[root@localhost ~]#bash -x hello.sh
+ nihao
++ h
++ echo hello
++ w
++ echo world
+ echo hello world
hello world


[root@localhost ~]#vim sum.sh
#!/bin/bash
sum (){
   echo $1
   echo $2
   echo $3
}
sum $2 $3 $1
#外面脚本的位置变量

[root@localhost ~]#cat sum.sh
#!/bin/bash
sum (){
   echo $1
   echo $2
   echo $3
}
sum $2 $3 $1
[root@localhost ~]#bash sum.sh a b c
b
c
a


[root@localhost data]#name=lj
[root@localhost data]#test () { name=tu; }
[root@localhost data]#echo $name
lj
[root@localhost data]#test
[root@localhost data]#echo $name
tu

[root@localhost data]#vim com.sh
#!/bin/bash
read -p "请输入你要计算的阶乘数值(正整数)" num
sum=1

for i in `seq $num`
do
sum=$[ i*sum ]

done

echo $sum

[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)5
120
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)4
24
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)3
6


函数递归

函数调用自己本身的函数

阶乘

[root@localhost data]#cat fact.sh
#!/bin/bash
#求5的阶乘,需要5-1=4 (1*2*3*4)*5

fact () {
read -p "请输入要求的阶乘:" num
if [ $num -eq 0 -o $num -eq 1 ]
then
echo 1
else
   temp=$[$num-1]
   #求前一个数
   result= $(fact $temp)
   #求前一个数阶乘结果
   echo  $[ $num * $result ]
   #求现在的数的阶乘
fi
}
fact $num

题目

1.DNS作用是实现IP地址和主机名(域名)之间的映射,Linux系统   文件定义了DNS的Nameserver
/etc/resolv.conf

2.结束后台进程的命令是   
kill

3.为脚本指定执行权的命令及参数是
chmod +x

4.欲发送10个分组报文测试与主机 www.aliyun.com 的连通性,应使用的命令和参数是
ping -c 10

5.使用命令   (当前目录)config_(要求完整命令) 对 config 目录做归档压缩,生成 config.tar.gz 文件
tar   zcvf ./config  config.tar.gz

6.Linux系统中,使用命令(非ping)测试DNS服务器是否能够正确解析域名。
host
dig
nslookup

7.当局域网没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问,应配置文件
/etc/hosts

8.永久改变主机名
hostnamectl set-hostname 名字

9.查看 10.0.0.1 机器上提供的网络文件 NFS 服务
showmount -e 10.0.0.1

10使用LVM 进行磁盘分区挂载
mount 
11.LVM相关命令有哪些
pvcreate
vgcreate
lvcreate

pvdisplay
vgdisplay
lvdisplay

pvscan
vgscan
lvscan

pvextend
vgextend
lvextend

pvremove
vgremove
lvremove

12.某文件的权限为:drw-r--r--,用数值形式表示该权限为: 644
该文件属性是:目录
可读不可写不可执行:属组和其他

13.某系统网卡名为eth0,在文件中配置静态网络 (包括ip、掩码、网关等)

shell数组

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

数组定义方法

1.数组名=(value0 value1 value2…)

2.数组名=([0]=value [1]=value [2]=value…)

3.列表名=“value0 value1 value2…”

  数组名=($列表名)

4.数组名[0]="value"

  数组名[1]="value"

  数组名[2]="value"
[root@localhost ~]#a={10,20,30,40,50}
[root@localhost ~]#echo $a
{10,20,30,40,50}
[root@localhost ~]#a=(10,20,30,40,50)
[root@localhost ~]#echo $a
10,20,30,40,50
[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#b=([0]=apple [1]=grape [2]=orange [3]=strawberry [4]=banana)
[root@localhost ~]#echo $b
apple
[root@localhost ~]#echo ${b[*]}
apple grape orange strawberry banana
[root@localhost ~]#c="10 20 30 40 50"
[root@localhost ~]#d=$c
[root@localhost ~]#echo ${d[*]}
10 20 30 40 50
[root@localhost ~]#echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#for i in ${b[@]};do echo $i;done;
apple
grape
orange
strawberry
banana
  • 普通数组可以不事先声明,直接使用
基本数组
[root@localhost ~]#vim num.sh
#!/bin/bash
a=(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz)

j=`echo $[RANDOM%6]`

n=$[j+1]

echo "选中的人是$n"

echo ${a[$j]}

[root@localhost ~]#bash num.sh
选中的人是5
eee


  • 关联数组必须先声明,再使用
关联数组
[root@localhost ~]#declare -A f   #声明关联数组
[root@localhost ~]#f[name]=tss
[root@localhost ~]#f[address]=China
[root@localhost ~]#echo ${f[name]}
tss
[root@localhost ~]#echo ${f[address]}
China

[root@localhost ~]#declare -a   #查看数组
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="1")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
declare -a b='([0]="apple" [1]="grape" [2]="orange" [3]="strawberry" [4]="banana")'

冒泡排序

[root@localhost ~]#vim mp.sh
#!/bin/bash
a=( 10 30 50 70 133 )
#取出上面的数组的最大值

max=${a[0]}
l=${#a[@]}

for ((i=0;i<=l;i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done

echo $max

[root@localhost ~]#bash mp.sh
133


#求最小值
[root@localhost ~]#vim min.sh
#!/bin/bash
read -p "请输入数组以空格隔开" num
a=($num)

min=${a[0]}
l=${#a[@]}

for ((i=0;i<$l-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"

[root@localhost ~]#bash min.sh
请输入数组以空格隔开 4 2 5 6 3
最小值是2


标签:10,shell,函数,echo,sh,bash,数组,root,localhost
From: https://www.cnblogs.com/LJ69/p/17631267.html

相关文章

  • python中 函数中的self是什么?
      self可视为类的实例,在使用类创建实例时,我们可能需要强制传入一些参数。所以一般在构造函数_init_里给实例的属性赋值。classStudent(obiect):def__init__(self,name,score):self.name=nameself.score=scoredefprint_score(self):......
  • 无涯教程-Perl - setpwent函数
    描述此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。语法以下是此函数的简单语法-setpwent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perlwhile(($name,$passwd,$uid,$gid,$quota,$com......
  • 排名函数rank、dense_rank、row_number
    rank():返回一个连续的排名值,相同的值将具有相同的排名,可能会有空缺。如果存在两个相同的值,则下一个排名与当前值的排名相同,并且下一个排名将相应地增加。使用场景:当需要按照某个特定的列对数据进行排序,但不需要为相同值分配连续的排名时,可以使用rank()函数。 dense_rank():返回......
  • chatGPT用C++写的HMAC-SHA256函数
    以下内容全为chatGPT生成:#include<openssl/hmac.h>#include<openssl/sha.h>#include<iostream>#include<iomanip>std::stringhmac_sha256(conststd::string&key,conststd::string&data){unsignedcharhash[SHA256_DIGEST_L......
  • 力扣- 删除有序数组中的重复项
    给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改......
  • 无涯教程-Perl - setprotoent函数
    描述该函数应在第一次调用getprotoent之前调用。STAYOPEN参数是可选的,在大多数系统上未使用。当getprotoent()检索协议数据库下一行的信息时,setprotoent会将枚举设置(或重置)为主机条目集的开头。语法以下是此函数的简单语法-setprotoentSTAYOPEN返回值此函数不返回......
  • JavaScript 如何封装一些常见的函数来提高工作效率
    前言为什么要封装函数JavaScript封装函数的主要目的是为了保护代码的安全性和可维护性。封装可以隐藏实现细节:将函数内部的实现细节封装起来,只暴露给外部必要的接口,可以使代码更加安全,防止意外修改或者滥用。封装可以提高代码的可维护性:将功能模块封装成函数,可以使代码更加模......
  • 指向成员函数的指针
    title:"指向成员函数的指针"date:2023-08-15T14:05:25+08:00tags:["C++"]categories:[]draft:falsec++-HowdoItypedefafunctionpointerwiththeC++11usingsyntax?-StackOverflow#include<iostream>classA{public:void......
  • 无涯教程-Perl - setpriority函数
    描述此函数设置进程(PRIO_PROCESS),进程组(PRIO_PGRP)或用户(PRIO_USER)的优先级。参数WHICH指定要为其设置优先级的实体,WHO是要设置的进程ID或用户ID。WHO的值为0定义了当前流程,流程组或用户。在不支持系统setpriority()函数的系统上产生致命错误。优先级是代表优先级级别......
  • 无涯教程-Perl - setnetent函数
    描述该函数应在第一次调用getnetent之前调用。STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。语法以下是此函数的简单语法-setnetentSTAYOPEN返回值此函数不返回任何值......