Funções de script de shell (incluindo casos de aplicação)

Prefácio

Na verdade, a função do shell é muito simples.É uma brisa para alunos que aprenderam outras linguagens de programação.

O que é uma função

  • O shell permite que um conjunto de comandos ou instruções formem um pedaço de código utilizável, esses blocos de código são chamados de funções de shell

  • Dê a este trecho de código um nome chamado nome de função, e então você pode chamar diretamente a função deste trecho de código

  • A modularização de código pode ser usada para definir funções no shell para facilitar a reutilização de código

  • As funções devem ser definidas antes que possam ser usadas

Como definir uma função

método um

函数名()
{
    
    
  函数体(一堆命令的集合,来实现某个功能)   
}

Método Dois

function 函数名()
{
    
    
   函数体(一堆命令的集合,来实现某个功能)
}

Familiarizado com a escrita de funções

  1. fatorial
#!/bin/bash
factorial() {
    
    
factorial=1
for((i=1;i<=5;i++))
do
        factorial=$[ $factorial * $i ]
        echo "$factorial"
done
echo "5的阶乘是:$factorial"
}
factorial

#!/bin/bash
function factorial {
    
    
a=1
for ((i=1;i<=10;i++))
do
        a=$[ $a * $i ]
        echo "$a"
done
echo "10的阶乘是:$a"
}
factorial
  1. Parâmetros de transferência
#!/bin/bash
factorial() {
    
    
factorial=1
for((i=1;i<=$1;i++))
do
        factorial=$[ $factorial * $i ]
        echo "$factorial"
done
echo "$1 的阶乘是:$factorial"
}

factorial $1
factorial $2
factorial $3

# 执行函数
bash factorial.sh 10 8 5
10 的阶乘是:3628800
8 的阶乘是:40320
5 的阶乘是:120


#!/bin/bash
factorial() {
    
    
a=1
for i in `seq $1`
do    
        let a*=$i				
        echo "$a"
done
echo "$1 的阶乘是:$a"
}

factorial $1

# 执行函数
[root@maomao ~]# bash cheng.sh 10
1
2
6
24
120
720
5040
40320
362880
3628800
10 的阶乘是:3628800


#!/bin/bash
fun () {
    
    
read -p "请输入一个数字计算他的阶乘:" num 
fun=1
for((i=1;i<=$num;i++))
do
        fun=$[ $fun * $i ]
        echo "$fun"
done

}
fun $num

Valor de retorno da função

  • O valor de retorno da função é uma funçãoUltimo comando
  • O maior valor de retorno do shell é255
#!/bin/bash
re() {
    
    
read -p "enter num:" num 
return $[2*$num]
}

re
echo "re return value:$?"


#!/bin/bash
fun() {
    
    
read -p "enter num:" num 
echo $[2*$num]
}

result=`fun`
echo "fun return value:$result"		
#这个返回值不是真的返回值

FunçãoRetornaDescrição:

  • O retorno pode encerrar uma função. Semelhante à instrução de controle do loop break (finalizar o loop atual e executar o código por trás do corpo do loop).
  • Por padrão, return retorna o valor de status do último comando na função.O valor do parâmetro também pode ser fornecido, e o intervalo está entre 0-256.
  • Se não houver um comando de retorno, a função retornará o valor de status de saída do último comando.

retorno pode encerrar uma função

#!/bin/bash
fun(){
    
    
	echo 'maomao'
	echo 'zhuzhu'
	return
	echo 'niuniu'
}
fun

# 执行脚本
[root@maomao ~]# bash test.sh
maomao
zhuzhu

return retorna o valor de status do último comando na função por padrão

#!/bin/bash
fun(){
    
    
	echo 'zhuzhu'
	echo 'maomao'
	return 88
	echo 'niuniu'
}
fun

# 执行脚本
[root@maomao ~]# bash test1.sh
zhuzhu
maomao
[root@maomao ~]# echo $?
88

Parâmetro de função passando parâmetro posicional

#!/bin/bash
if [ $# -ne 3 ];then
        echo "useage:`basename $0` par1 par2 par3"
        exit
fi

fun3() {
    
    
        echo "$(($1 * $2 * $3 ))" 
}

result=`fun3 $1 $2 $3`		这个$1 $2 $3是外面的参数赋给函数里的$1 $2 $3
echo "$result"				你传给程序 程序传给函数

# 执行脚本
[root@maomao ~]# bash parameter.sh 1 2 3
6
[root@maomao ~]# bash parameter.sh 2 3 4
24

如果result=`fun3 $3 $3 $3`  	三个$3相乘 3*3*3
[root@maomao ~]# bash parameter.sh 1 2 3
27

Variável de grupo de parâmetros de passagem de função

Calcule a multiplicação dos valores na matriz

#!/bin/bash
num1=(1 2 3 4 5)
num2=(2 4 6 8 10) 
array() {
    
    
        local array=1
        for i in $*
        do  
                array=$[ array * $i ]
        done
        echo "$array"
}

array ${num1[*]}    
array ${num2[@]}

# 执行脚本
[root@maomao ~]# bash array.sh 
120
3840

Os parâmetros de passagem de array tornam-se um novo array

#!/bin/bash
num=(1 2 3 4 5)
num2=(2 4 6 8 10)
array() {
    
    
        local newarray=($*)
        local i
        for((i=0;i<$#;i++))
        do  
                outarray[$i]=$(( ${newarray[$i]} * 5 ))
        done
        echo "${outarray[*]}"
}
result=`array ${
     
     num[*]}`
echo ${result[*]}

result=`array ${
     
     num2[@]}`
echo ${result[@]}

# 执行脚本
[root@maomao ~]# bash array1.sh
5 10 15 20 25
10 20 30 40 50

Muda o valor do array original

#!/bin/bash
num=(2 4 6 8 10)
array() {
    
    
        local newarray=()
        local i
        for i
        do
                newarray[i++]=$[ $i * 10 ]
        done
        echo "${newarray[*]}"

}
result=`array ${
     
     num[*]}`
echo "${result[*]}"

# 执行脚本
[root@maomao ~]# bash array2.sh 
20 40 60 80 100


  • A função aceita parâmetros posicionais $ 1 $ 2 $ 3… $ n
  • A função aceita variáveis ​​de array $ @ $ *
  • A função receberá todos os parâmetros atribuídos ao array newarry = ($ *)

Formulários

  1. Escreva um script para coletar as informações básicas (nome, sexo, idade) inseridas pelo usuário, se você não inserir, sempre será solicitado que você insira
  2. Por fim, produza o conteúdo correspondente de acordo com as informações do usuário
#!/bin/bash
#该函数实现用户如果不输入内容则一直循环直到用户输入为止,并且将用户输入的内容打印出来
input_fun()
{
    
    
  input_var=""
  output_var=$1
  while [ -z $input_var ]
    do
    	read -p "$output_var" input_var
    done
    echo $input_var
}

input_fun 请输入你的姓名:

或者
#!/bin/bash
fun()
{
    
    
    read -p "$1" var
    if [ -z $var ];then
        fun $1
    else
        echo $var
    fi
}


#调用函数并且获取用户的姓名、性别、年龄分别赋值给name、sex、age变量
name=$(input_fun 请输入你的姓名:)
sex=$(input_fun 请输入你的性别:)
age=$(input_fun 请输入你的年龄:)

#根据用户输入的性别进行匹配判断
case $sex in
            man)
            if [ $age -gt 18 -a $age -le 35 ];then
                echo "中年大叔你油腻了吗?加油"
            elif [ $age -gt 35 ];then
                echo "保温杯里泡枸杞"
            else
                echo "年轻有为。。。"
            fi
            ;;
            woman)
            xxx
            ;;
            *)
            xxx
            ;;
esac

Caso abrangente

Plano de fundo da tarefa
Embora o trampolim existente tenha realizado uma entrada unificada para acessar o servidor de produção, o usuário yunwei tem muita autoridade para operar todos os arquivos de diretório no trampolim e há um risco de segurança de exclusão acidental de dados, então espero que você faça algumas estratégias de segurança para garantir o trampolim O uso normal da máquina.

Requisitos específicos

  1. Permitir apenas que usuários yunwei se conectem remotamente ao servidor de aplicativos em segundo plano por meio do trampolim para fazer algumas operações de manutenção
  2. Quando o pessoal de operação e manutenção da empresa se conecta remotamente ao trampolim por meio de um usuário yunwei, o seguinte menu aparecerá para seleção:
欢迎使用Jumper-server,请选择你要操作的主机:
3. DB1-Master
4. DB2-Slave
5. Web1
6. Web2
h. help
q. exit
  1. Quando o usuário seleciona o host correspondente, o login direto sem senha é bem-sucedido
  2. Se o usuário não inserir, o usuário será solicitado a inserir até que opte por fazer logout

Análise abrangente

  1. Coloque o script no arquivo .bashrc no diretório inicial do usuário yunwei (/shell05/jumper-server.sh)
  2. Defina o menu como uma função [Menu Imprimir], que é conveniente para chamadas posteriores
  3. Use a instrução case para realizar a escolha do usuário [definir variáveis ​​interativamente]
  4. Quando o usuário seleciona um determinado servidor, pergunte ao usuário o que precisa ser feito caso ... esac defina variáveis ​​interativamente
  5. Use loops para perceber que os usuários não optam por continuar escolhendo
  6. Restringir os usuários para fechar diretamente a saída do terminal após sair
#!/bin/bash
# jumper-server
# 定义菜单打印功能的函数
menu()
{
    
    
cat <<-EOF
欢迎使用Jumper-server,请选择你要操作的主机:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
    EOF
}
# 屏蔽以下信号
trap '' 1 2 3 19
# 调用函数来打印菜单
menu
#循环等待用户选择
while true
do
# 菜单选择,case...esac语句
read -p "请选择你要访问的主机:" host
case $host in
    1)
    ssh [email protected]
    ;;
    2)
    ssh [email protected]
    ;;
    3)
    ssh [email protected]
    ;;
    h)
    clear;menu
    ;;
    q)
    exit
    ;;
esac
done


将脚本放到yunwei用户家目录里的.bashrc里执行:
bash ~/jumper-server.sh
exit

Melhorar ainda mais a demanda
A fim de aumentar ainda mais a segurança do trampolim, a equipe visita o ambiente de produção por meio do trampolim, mas não pode permanecer no trampolim.

#!/bin/bash
#公钥推送成功
trap '' 1 2 3 19
#打印菜单用户选择
menu(){
    
    
cat <<-EOF
欢迎使用Jumper-server,请选择你要操作的主机:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
EOF
}

#调用函数来打印菜单
menu
while true
do
read -p "请输入你要选择的主机[h for help]:" host

#通过case语句来匹配用户所输入的主机
case $host in
    1|DB1)
    ssh [email protected]
    ;;
    2|DB2)
    ssh [email protected]
    ;;
    3|web1)
    ssh [email protected]
    ;;
    h|help)
    clear;menu
    ;;
    q|quit)
    exit
    ;;
esac
done

自己完善功能:
1. 用户选择主机后,需要事先推送公钥;如何判断公钥是否已推
2. 比如选择web1时,再次提示需要做的操作,比如:
clean log
重启服务
kill某个进程

suplemento

1) SIGHUP             重新加载配置    
2) SIGINT            键盘中断^C
3) SIGQUIT          键盘退出
9) SIGKILL             强制终止
15) SIGTERM            终止(正常结束),缺省信号
18) SIGCONT           继续
19) SIGSTOP           停止
20) SIGTSTP         暂停^Z

Acho que você gosta

Origin blog.csdn.net/Cantevenl/article/details/115306150
Recomendado
Clasificación