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