3. shell之函数编程

shell 编程之变量详解

shell编程语言是非类型的解释性语言 , shell给一个变量赋值 , 实际上就是定义了变量,在linux 支持的所有shell中, 都可以用赋值符号(=)为变量赋值

shell 变量分为两类: 局部变量和环境变量 。 局部变量只在创建他们的shell脚本中使用 , 而环境变量则可以在创建他们的shell及派生出来的任意子进程中使用 。 有些变量是用户创建的 , 其他则是专用shell变量

例如在脚本里面定义A=123 , 定义这样一个变量 ,前面变量名,后面是变量的值 。

引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?

#!/bin/bash
#Author rayon 2020
A=123
echo "Printf variables equal is $A"

执行脚本:sh test.sh 结果将会显示:

Printf variables equal is 123

简单的理解变量, 相当于定义一个别名-名称, 引用的时候加上$符号

例如定义变量name=rayon

执行echo $name 将会显示rayon

SHELL 常见的系统变量解析:

$0 当前的程序的名称
$n 当前程序的第n个参数, n=1,2,..9
$* 当前程序的所有参数(不包括程序本身)
$# 当前程序的参数个数(不包含程序本身)
$? 命令或程序执行完后的状态 , 一般返回0表示指向成功
$UID 当前用户的ID
$PWD 当前所在的目录

我们来测试一个常用变量的脚本: vi auto_var.sh

#!/bin/bash
#auto print variables
#by rayon 2020
echo -e '\033[32m]------------------\033[0m'
FILES=httpd-2.2.17.tar.bz2
URL=http://mirrors.cnnic.cn/apache/httpd
PRIFIX=/usr/local/apache2/
echo -e "\033[36mPlease Select Install Menu: \033[0m"
echo 
echo "1)官方下载Httpd 文件包。"
echo "2)解压apache源码包"
echo "3)编译安装Httpd服务器"
echo "4)启动HTTPD服务器。"
echo -e '\033[32m---------------------------\033[0m'
sleep 20

3.数组

首先来定义一个一维数组:

A=(test1 test2 test3),定义数组一般以括号的方式来定义, 数组的值可以随机定义。 如何来引用呢?
echo ${A[0]} ,代表引用第一个数组变量 , 结果会显示test1 , 数组引用从0开始, 代表第一个数组, 依次类推
echo ${A[1]} ,代表第二个数组变量, 结果会显示test2 ,数组引用也是从0开始计算的, 如何显示该数组所有参数呢?
echo ${A[@]}将显示所有参数test1 test2 test3
如果替换某个数组呢? 例如替换第二个test2 数组为test5: echo ${A[@]/test2/test5}
如何删除一个数组呢? 例如删除test3 数组命令为: unset A[2];echo ${A[@]}查看效果

那输入如何在编程来使用呢? 请看下面例子

#!/bin/bash
#auto make kvm virtualization
#auto config bond scripts
eth_bond()
{
	NETWORK=(
		HWADDR=`ifconfig eth0|egrep "HWaddr|Bcast"|tr "\n" "" | awk '{print $5,$7,$NF}' | sed -e 's/addr://g' -e 's/Mask://g'| awk '{print $1}'`
		IPADDR=`ifconfig eth0|egrep "HWaddr|Bcast"|tr "\n " " "| awk '{pint $5,$7$NF}' |sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'`
		NETMASK=`ifconfig eth0 | egrep "HWaddr|Bcast | tr "\n" "" | awk '{print $5,$7,$NF}'| sed -e 's/addr://g' -e 's/Mask://g |awk '{print $3}'`
		GATEWAY=`route -n | grep "UG"| awk '{print $2}'`
	)
	cat > ifcfg.bond0<<EOF
	DEVICE=bond0
	BOOTPROTO=static
	${NETWORK[1]}
	${NETWORK[2]}
	${NETWORK[3]}
	ONBOOT=yes
	TYPE=Ethernet
	NM_CONTROLLED=no
	EOF
}

如上脚本为定义三个数组变量, 然后分别来引用, 这样让脚本可读性更强, 更整洁,

#!/bin/bash
soft=(
	nginx
	mysql
	php
	/etc/sysctl.conf
)
echo "This soft total $(#soft[@])!"
tar -xzf ${soft[0];cd nginx; ./configure ;make ;make install}


4.函数

linux 什么是函数呢? 其实函数就相当于一个简单的命令所包括的很多命令的集合

格式

function command()
{
	a =123

}
command

例如我们来定义一个自动安装nginx这样的一个函数, 如果在脚本里面来定义呢?

Vim auto_nginx.sh

#!/bin/bash
NGX_FILES=nginx-1.6
DWN_URL=http://nginx.org/download/
MYSQL_FILE=mysql-5.1.17
func nginx install()
{
	wget -c $DWN_URL/${NGX_FILES}
	tar -xzf $NGX_FILES;cd nginx-1.6; ./configure --prefix=/usr/local/nginx/ && make && make install
	if [$? -eq 0];then
		echo "the nginx install success!"
	fi
}
function mysql_install()
{
	tar xzf $MYSQL_FILES; cd mysql;./configure --prefix=/usr/local/mysql; make; make install
	if [$? -eq 0];then
		echo "the mysql install success!"
	fi
}
function php_install()
{
	tar xzf $php_files; cd php-5.3;./configure --prefix=/usr/loacl/php5 --with-mysql=/usr/local/mysql; make; make install
	if [$? -eq 0]; then
		echo "the php install sucess !"
	fi
}

select i in "nginx" "mysql" "php"
do
	echo $i
  case $i in
    nginx)
      mysql_install;;

    mysql)
      mysql_install;;
    php)
      php_install;;
    *)
      echo "Usage: $0{nginx| mysql|php|help}"
      ;;
  esac
done

#!/bin/bash
stop_syuee(){
    cd /home/syuee/
    uwsgi --stop uwsgi/uwsgi.pid
}
backup_syuee(){
    cd /home/
    tar -zcf /data/uwsgi_appdir/syuee$(date +%F%H%M%S).tar.gz syuee/
}
clone_syuee(){
    cd /home/ 
    rm -rf syuee
    git clone https://gitee.com/RaYong8080/syuee.git
    cd /home/syuee/
    pip3 install -r requirements.txt 
}
start_syuee(){
    cd /home/syuee/
    uwsgi  --ini syuee.ini
}
main(){
    stop_syuee
    backup_syuee
    clone_syuee
    start_syuee
}
main

posted @ 2021-03-31 23:31  白色的番茄  阅读(72)  评论(0编辑  收藏  举报