シェル関数と配列(非常に詳細な関数と配列の例)

1つ:シェル関数

  Shell関数の本質は、再利用可能なスクリプトコードであり、このコードは事前に記述され、指定された場所に配置され、使用時に直接呼び出すことができます。
  シェルの関数は、C ++、Java、Python、C#などの他のプログラミング言語の関数と似ていますが、構文の詳細が異なります。
シェル関数定義の構文形式は次のとおりです。

function name() {
    
          #function是shell中的关键字,专门用来定义函数  name是函数名
  statements           #statements是函数要执行的代码,也就是一组语句;
  [return value]       #return value表示函数的返回值,其中return是shell关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
}                      #由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

1.1:関数定義の簡略化された記述

問題がある場合は、関数を定義するときにfunctionキーワードを省略できます。

name() {
    
    
  statements
  [return value]
}

functionキーワードを記述する場合は、関数名の後の括弧も省略できます。

function name {
    
    
  statements
  [return value]
}

このスクリプトを誰が書いても理解できるように、標準的な記述を使用することをお勧めします。

[root@localhost opt]#vim jia.sh
#!/bin/bash
sum () {
    
    
s=`expr 5 + 3`
echo $s
}
sum
[root@server1 ~]# sh a.sh 
8
sum () {
    
    
s=`expr $1 + $2`
echo $s
}
sum 5 6
[root@server1 ~]# sh a.sh 
11
在这里插入代码片
sum () {
    
    
 return $(($1 + $2))
}
sum 3 4
echo $?
[root@server1 ~]# sh a.sh 
7
function sum(){
    
    
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  SUM=$[$num1+$num2]
  echo "和:$SUM"
}
sum
[root@server1 ~]# sh a.sh 
请输入第一个整数: 5
请输入第一个整数: 4
和:9
function sum(){
    
    
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  SUM=$[$num1+$num2]
  echo $SUM
}
tom=`sum 4 2`
let tom+=1
echo $tom
[root@server1 ~]# sh a.sh 
请输入第一个整数: 6
请输入第一个整数: 3
10

1.2:関数のスコープ

  • シェルスクリプトの関数は、現在のシェル環境でのみ有効です
  • ShelIスクリプトの変数は、デフォルトでグローバルに有効です
  • localコマンドを使用して、変数を関数に制限します

  • 関数の内部変数はローカルで実装されています

  • myfun関数を定義して、ローカル変数iをその中に設定します。

  • 関数の内部と外部に値を割り当てて結果を確認します

function sh(){
    
    
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  s=$[$num1+$num2]
  jerry=20
  echo 函数内$jerry
  echo 和:$s
}
sh
  echo 函数外$jerry
[root@server1 ~]# sh a.sh 
请输入第一个整数: 2
请输入第一个整数: 3
函数内20
和:5
函数外20

localはグローバル変数を定義します

function sh(){
    
    
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  s=$[$num1+$num2]
  local jerry=20     #local定义全局变量
  echo 函数内$jerry
  echo 和:$s
}
sh
  echo 函数外$jerry
[root@server1 ~]# sh a.sh 
请输入第一个整数: 2
请输入第一个整数: 4
函数内20
和:6
函数外

1.3:再帰関数

独自の関数を呼び出す

再帰的にディレクトリをトラバースする
再帰的な関数list_filesを定義してRealize

#!/bin/bash
function list_files(){
    
    
 for s in `ls $1`
 do
 if [ -d "$1/$s" ]
  then
     echo "$2$s"
     list_files "$1/$s" "$2"
   else
     echo "$2$s"
   fi
   done
}
list_files "/var/log"
#$1表示/var/log
#$s表示/var/log下一个目录
#$2表示指定格式 子目录一定要做一个首行缩进
[root@server1 ~]# sh bianli.sh 
amanda
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-j10KNj.log
ks-script-mW8ioG.log
packaging.log
program.log
……

2:シェル配列

2.1:アプリケーションシナリオには、

  1. アプリケーションシナリオパッケージの長さ
  2. 配列の長さを取得する
  3. 要素の長さを取得
  4. 要素を反復する
  5. 要素スライス
  6. エレメント交換
  7. 要素の削除

2.2:配列の説明

アレイ:データ収集の同じタイプを置く多くあります。
アプリケーションのシナリオ:の等級と名前
のクラスメートは、[11,22,33,44]メモリ内の連続空間までオープン
使っ
配列名ARR ARR =(44) 、33,22,11)
配列要素:44 33 22 11は、すべてのある
配列の長さ:ARRは、4つの要素有する
配列の添字を:33個の要素が1未満である(例えば、11添字3 22添字は2である)
一時的ため配列内のスカラー

完了しました

2.3:配列定義メソッド

方法1

数组名=(shuai0 shuai1 shuai2...

方法2

数组名=([0]=shuai [1]=shuai [3]=shuai...[root@server1 test]# num=([0]=44 [1]=33 [2]=22 [3]=11)
[root@server1 test]# echo ${num[*]}
44 33 22 11

方法3

列表名="shuai0 shuai1 shuai2.."
数组名= ($列表名)
[root@server1 test]# tom=" 1 2 3 4 "
[root@server1 test]# num=($tom)
[root@server1 test]# echo ${num[*]}
1 2 3 4
#!/bin/bash
list=`cat test.txt`
echo $list
[root@server1 test]# sh test.sh
5 6 7 8
#!/bin/bash
list=`cat test.txt`
f=($list)
echo ${
    
    f[*]}
[root@server1 test]# sh test.sh
5 6 7 8


多くの場合、方法3は要素を置き換えることです

数组名[0]="shuai"
数组名[1]="shuai"
数组名[2]="shuai"
[root@server1 test]# num=([0]=2 [1]=5 [2]=6 [3]=8)
[root@server1 test]# echo ${num[*]}
2 5 6 8
[root@server1 test]# num[2]=10
[root@server1 test]# echo ${num[*]}
2 5 10 8

2.3.1:100アレイ

#!/bin/bash
for ((i=0;i<99;i++))
 do
 tom[$i]=$[$i+1]
 done
echo ${
    
    tom[*]} 
[root@server1 test]# sh 1_100.sh 
1 2 3 4 5 6 7 8 9 ……

2.3.2:1から100までの奇数配列を作成する

#!/bin/bash
for ((i=0;i<99;i+=2))
 do
 tom[$i]=$[$i+1]
 done
echo ${tom[*]}          
[root@server1 test]# sh 1_100.sh 
1 3 5 7 9 11 13 15 ……

方法2

#!/bin/bash
k=0
j=1
 for ((i=0;i<=100;i++));do
 k=$[ $i + $j ]
 let j++
  if [ $k -le 100 ];then
    tom[$i]=$k
  fi
done
echo ${
    
    tom[@]}
[root@server1 test]# sh 1_100.sh 
1 3 5 7 9 11 13 ……

2.3.3:任意の数と長さを作成し、顧客のニーズに応じて要素を追加します

#!/bin/bash
i=0
while true
do
  read -p "是否输入元素(yes/no):" e
  if [ $e == "no" ];then
  break
  fi
  read -p "请输入第$[$i+1]个元素:" f
  tom[$i]=$f
  let i++
done
echo ${
    
    tom[@]}
[root@server1 test]# sh 1_100.sh 
是否输入元素(yes/no):yes
请输入第1个元素:10
是否输入元素(yes/no):yes
请输入第2个元素:20
是否输入元素(yes/no):yes
请输入第3个元素:30
是否输入元素(yes/no):no
10 20 30

2.4.1:配列の長さと添え字の割り当てを取得する

[root@server1 test]# tom=(66 77 88)
[root@server1 test]# echo ${
    
    tom[@]}
66 77 88
[root@server1 test]# echo ${
    
    tom[1]}
77

2.4.2:次の値のセット、80未満の場合は100に追加

#!/bin/bash
num=(56 79 63 32 88)
#遍历数组
  for ((i=0;i<${
    
    #num[*]};i++))
  do
  if [ ${
    
    num[$i]} -lt 80 ];then
    new[$i]=100
  else
    new[$i]=${
    
    num[$i]}
  fi
done
echo ${
    
    new[*]}
[root@server1 ~]# sh shell.sh 
100 100 100 100 88

2.4.3:配列の最大値を見つける

#!/bin/bash
num=(12 63 43 52)
tom=0
   for ((i=0;i<${
    
    #num[*]};i++))
   do
  if [ ${
    
    num[$i]} -gt $tom ];then
   tom=${
    
    num[$i]}
 fi
done
echo $tom
[root@server1 ~]# sh max.sh 
63

おすすめ

転載: blog.csdn.net/qyf158236/article/details/108702285