shell编程-变量

变量

一 变量介绍

  • 什么是变量?
    量指的是记录事物的状态
    变指的是事物的状态是可以发生变化的
    变量本质就是一种数据存取的机制,变量的数据都是存放于内存中的
  • 为何要有变量?
    程序运行的本质就是一系列状态的变化,
程序=数据+功能,
程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。
# 比如:
    英雄的等级为1,打怪升级(变)为10
    僵尸的存活状态True,被植物打死了,于是变为False
    人的名字为egon,也可以修改为Egon 

二 变量的使用

2.1 先定义、后引用

  • 先定义
语法:变量名=值
注意:等号左右两边不能有空格!!!

#例如:
[root@zabbix ~]# name="xuzhongxiang"
  • 后引用
[root@zabbix ~]# echo $name
xuzhongxiang

# 注意:如果是打印百分比,建议使用${变量名}%
[root@zabbix ~]# disk=55
[root@zabbix ~]# echo $disk%
55%
[root@zabbix ~]# echo ${disk}%
55%
[root@zabbix ~]# echo ${disk}7%
557%

2.2 删除变量

# 使用unset命令删除变量
[root@zabbix ~]# disk=1000
[root@zabbix ~]# echo $disk
1000
[root@zabbix ~]# unset disk
[root@zabbix ~]# echo $disk

三 变量的三大组成部分

基于上一小节我们得知,定义一个变量由三大部分组成

  • 1、变量名:用来访问到变量值的

  • 2、赋值符号:将变量值的内存地址绑定给变量名

  • 3、变量值:即我们存的数据

3.1 变量名的命名规范

定义变量把数据存到内存中不是目的,目的是以后要取出来用,而变量名就是用来取变量值的,而变量的名字直接表明了所存值的意义,可见变量名的命名非常重要

# 变量名的命令应该见名知意,同时遵循如下规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,最好遵循下述规范:
    1.以字母开头
    2.使用中划线或者下划线做单词的连接
    3.同类型的用数字区分
    4.对于文件名的命名最好在末尾加上拓展名
    
例如: sql_bak.tar.gz,log_bak.tar.bz2  
    5、不要带有空格、?、*等特殊字符
    6、不能使用bash中的关键字,例如if,for,while,do等
    7、不要和系统环境变量冲突

3.2 变量值的三种来源

(1)直接赋值

# 1. 显式赋值:变量名=变量值
示例:
ip=10.0.0.71
name="xuzhongxiang"
shijian=`date +%F`
shijian2=$(date +%F)

# 2、应用示例
示例1:
[root@zabbix ~]# url=http://www.baidu.com
[root@zabbix ~]# echo $url
http://www.baidu.com

示例2:
[root@zabbix ~]# url="www.baidu.com"
[root@zabbix ~]# ping $url
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.

(2)从位置参数获取变量值

从调用脚本时传入的位置参数获取变量值:./b.sh a1 a2 a3
需要用到$n获取第n个位置参数值,超过10需要用${n},如下
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

# 示例
[root@egon ~]# cat b.sh 
#!/usr/bin/env bash
echo ${0}
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
echo ${11}
echo ${12}
# 运行
[root@egon ~]# chmod +x b.sh 
[root@egon ~]# ./b.sh a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
./b.sh
a1
a2
a3
a4
a5
a6
a7
a8
a9
a10
a11
a12

# 企业使用:可以实现脚本的不同功能(服务程序管理脚本-启动功能 关闭功能 重启功能)
server.sh  start|stop|restart

(3)与用户交互获取值

何为交互,即输入、输出

一、read接收用户的输入,即从键盘读入变量值
read 变量名
read -p "提示信息: "  变量名
read -t 5 -p "提示信息: "  变量名   # -t指定秒数
read -n 2 变量名                   # -n读取的字符个数

# 应用示例
[root@lb01 scripts]# vim login.sh 
#!/usr/bin/env bash
db_username="xiaoxu"
db_password="123"
while true
do
read -p "请输入您的账号: " input_name
read -p "请输入您的密码: " input_pwd
if [ $input_name = $db_username ] && [ $input_pwd = $db_password ];then
    echo "登录成功"
    break
else
    echo "登录失败"
fi
done
企业使用:可以根据需求调整变量值,可以便于新员工快速掌握企业脚本使用

二、输出
# 2.1 echo命令,详解情况:https://www.cnblogs.com/linhaifeng/articles/13976349.html
[root@zabbix ~]# name="xuzhongxiang"
您在 /var/spool/mail/root 中有新邮件
[root@zabbix ~]# age=19
[root@zabbix ~]# echo -e "my name is $name my age is $age"
my name is xuzhongxiang my age is 19

# 2.2还可以输出带颜色(了解即可)
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[34m 黄色字 \033[0m"
echo -e "\033[41;33m 红底黄字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
 
# 2.3 printf命令(C语言风格)
%s
%d
%7.3f  打印浮点数,总宽度为7,小数位保留3位,并且四舍五入
[root@zabbix ~]# name="xuzhongxiang"
[root@zabbix ~]# age="19"
[root@zabbix ~]# printf "my name is %s my age is %s\n" $name $age
my name is xuzhongxiang my age is 19
       
[root@zabbix ~]# salary=3.3339
[root@zabbix ~]# printf "my name is %s my age is %7.3f\n" $name $salary
my name is xuzhongxiang my age is   3.334

三 预定变量

$*	所有的参数
$@ 	所有的参数
$# 	参数的个数
$$ 	当前进程的PID  # 还可以使用只读变量来获取父进程的PID:$PPID、获取执行脚本的用户ID:$UID
$?	上一个命令的返回值 0表示成功	

示例1:
[root@zabbix ~]# vim test.sh
#!/bin/bash
echo $*
echo $@
echo $#
echo $$
echo $?
[root@zabbix ~]# ./test.sh pas1 pas2 pas3 pas4 pas5
pas1 pas2 pas3 pas4 pas5   #所有参数
pas1 pas2 pas3 pas4 pas5   #所有参数
5						   #参数的个数
60268 				       #当前进程的PID 
0                          #上一个命令的返回值


[root@zabbix ~]# vim test.sh
#!/bin/bash
echo $*
echo $@
echo $#
echo $$
ping -c1 10.0.0.254 &>/dev/null
echo $?
[root@zabbix ~]# ./test.sh
0
60353
0

示例2:
[root@zabbix ~]# vim ping.sh
#!/bin/bash
ping -c2 $1 &>/dev/null
if [ $? = 0 ];then                                      
        echo "host $1 is ok"            
else                                                                                    
        echo "host $1 is fail"  
fi

[root@zabbix ~]# chmod +x ping.sh
[root@zabbix ~]# ./ping.sh 10.0.0.10
host 10.0.0.10 is fail
  • 了解:

如果我们想从命令行中获取脚本调用者传入的参数值,用$n可以取到,但如果脚本调用者在命令行传入的参数个数不固定,那么此时就需要用$*或$@来获取了
$*与$@获取的是所有位置参数,$0除外

当脚本调用者的传参形式如下是

[root@localhost ~]# ./script.sh 命令1 命令2 命令3

针对for循环语句:for i in 元素,for循环会按照空格作为分隔符来一个个取元素,所以此时$*$@并无区别

[root@localhost ~]# cat script.sh 
#!/bin/bash

for i in $*
do
    echo $i
done

echo "=================="

for i in $@
do
    echo $i
done

[root@localhost ~]# ./script.sh 命令1 命令2 命令3
命令1
命令2
命令3
==================
命令1
命令2
命令3

当脚本调用者的传参形式如下时

[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"

针对for循环语句:for i in 元素,for循环会按照空格作为分隔符来一个个取元素,所以此时$*$@如果不加引号,第三个命令:“命令3 参数”,为被以空格为分隔符识别成两部分

[root@localhost ~]# cat script.sh 
#!/bin/bash

for i in $*
do
    echo $i
done

echo "=================="

for i in $@
do
    echo $i
done
 
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1
命令2
命令3
参数
==================
命令1
命令2
命令3
参数

所以需要为$*$@加上引号

[root@localhost ~]# cat script.sh 
#!/bin/bash
for i in "$*"
do
    echo $i
done

echo "=================="

for i in "$@"
do
    echo $i
done
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"
命令1 命令2 命令3 参数
==================
命令1
命令2
命令3 参数

但此时为$*就会把所有位置参数识别成一个整体,所以总结如下:

当脚本调用者的传参形式如下时
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数"

需要使用"$@"来分别获取一个个完整的命令
for i in "$@"
do
    echo $i
done

其余情况$*与$@完全一致

四 常量

相对于变量,常量就是不可以被改变的量,即只能读不能改,所以又称之为只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

[root@zabbix ~]# name="xuzhongxiang"
[root@zabbix ~]# readonly name
[root@zabbix ~]# name="xiaoxu"
-bash: name: 只读变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值