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