funçã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
- 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
- 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
- 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
- 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
- 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
- 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
- Quando o usuário seleciona o host correspondente, o login direto sem senha é bem-sucedido
- Se o usuário não inserir, o usuário será solicitado a inserir até que opte por fazer logout
Análise abrangente
- Coloque o script no arquivo .bashrc no diretório inicial do usuário yunwei (/shell05/jumper-server.sh)
- Defina o menu como uma função [Menu Imprimir], que é conveniente para chamadas posteriores
- Use a instrução case para realizar a escolha do usuário [definir variáveis interativamente]
- Quando o usuário seleciona um determinado servidor, pergunte ao usuário o que precisa ser feito caso ... esac defina variáveis interativamente
- Use loops para perceber que os usuários não optam por continuar escolhendo
- 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