一、变量的介绍
1、什么是变量?
1、量指的是记录事物的状态/
2、变指的是事物的状态是可以发生变化的/
3、变量本质就是一种数据存取的机制,变量的数据都是存放于内存中的
2、为何要有变量?
PS:程序运行的本质就是一系列状态的变化
程序=数据+功能,
程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态以及状态的变化。
二、变量的使用
1、先定义、后使用
1、变零先定义: # 1、语法:变量名=值 # 2、注意:等号左右两边不能有空格!!! # 3、例如: [root@nj-mg-10-11-20-8 day01]# name=magb 2、后引用: [root@nj-mg-10-11-20-8 day01]# name=magb [root@nj-mg-10-11-20-8 day01]# echo $name magb [root@nj-mg-10-11-20-8 day01]# ip="10.21.10.17" [root@nj-mg-10-11-20-8 day01]# echo $ip 10.21.10.17
2、删除变量的方法:
[root@nj-mg-10-11-20-8 day01]# x=123456 [root@nj-mg-10-11-20-8 day01]# echo $x 123456 [root@nj-mg-10-11-20-8 day01]# unset x [root@nj-mg-10-11-20-8 day01]# echo $x [root@nj-mg-10-11-20-8 day01]#
三、变量
1、变量的三大组成部分
1、变量名:用来访问到变量值的
2、赋值符号:将变量值的内存地址绑定给变量名
3、变量值:即我们存的数据
2、变量的命名规范
PS:定义变量把数据存到内存中不是目的,目的是以后要取出来用,而变量名就是用来取变量值的,而变量的名字直接表明了所存值的意义,可见变量名的命名非常重要
变量名的命令应该见名知意,同时遵循如下规则:
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线,
最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件名的命名最好在末尾加上拓展名
例如: sql_bak.tar.gz,log_bak.tar.bz2
5、不要带有空格、?、*等特殊字符
6、不能使用bash中的关键字,例如if,for,while,do等
7、不要和系统环境变量冲突
3、变量的三种来源
3.1、直接赋值
[root@nj-mg-10-11-20-8 day01]# today=`date +%F` [root@nj-mg-10-11-20-8 day01]# echo $today 2021-06-16 [root@nj-mg-10-11-20-8 day01]# today1=$(date +%F) [root@nj-mg-10-11-20-8 day01]# echo $today 2021-06-16 [root@nj-mg-10-11-20-8 day01]# url="www.baidu.com" [root@nj-mg-10-11-20-8 day01]# ping -c1 $url PING www.wshifen.com (103.235.46.39) 56(84) bytes of data. 64 bytes from 103.235.46.39: icmp_seq=1 ttl=42 time=271 ms --- www.wshifen.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 271.180/271.180/271.180/0.000 ms
3.2、从位置参数获取变量值
[root@nj-mg-10-11-20-8 day01]# sh 01.sh 1 2 3 4 5 6 7 8 9 10 01.sh 1 2 3 4 5 6 7 8 9 10 [root@nj-mg-10-11-20-8 day01]# cat 01.sh #!/bin/bash echo $0 echo $1 echo $2 echo $3 echo $4 echo $5 echo $6 echo $7 echo $8 echo $9 echo ${10} PS:从调用脚本时传入的位置参数获取变量值:./b.sh a1 a2 a3 需要用到$n获取第n个位置参数值,超过10需要用${n},
3.2、与用户交互获取值
[root@nj-mg-10-11-20-8 day01]# ./first.sh please input your name: magb please input your password: 123 magb && 123 [root@nj-mg-10-11-20-8 day01]# [root@nj-mg-10-11-20-8 day01]# cat first.sh #!/bin/bash read -p "please input your name: " user_name read -p "please input your password: " user_pwd echo "${user_name} && ${user_pwd}" [root@nj-mg-10-11-20-8 day01]# 何为交互,即输入、输出 ?# 一:read接收用户的输入,即从键盘读入变量值 read 变量名 read -p "提示信息: " 变量名 read -t 5 -p "提示信息: " 变量名 # -t指定秒数 read -n 2 变量名 # -n读取的字符个数 ? =======》应用示例:vim first.sh back_dir1=/var/backup read -p "请输入你的备份目录: " back_dir2 echo $back_dir1 echo $back_dir2 ?企业使用:可以根据需求调整变量值,可以便于新员工快速掌握企业脚本使用 ? # 二:输出 # 2.1 echo命令,详解情况:https://www.cnblogs.com/linhaifeng/articles/13976349.html [root@egon ~~]# name="egon" [root@egon ~~]# age=18 [root@egon ~~]# echo -e "my name is $name my age is $age" my name is egon my age is 18 ? 还可以输出带颜色(了解即可) 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.2 prinf命令(C语言风格) %s %d %7.3f 打印浮点数,总宽度为7,小数位保留3位,并且四舍五入 [root@egon ~~]# name="egon" [root@egon ~~]# age=18 [root@egon ~~]# printf "my name is %s my age is %s\n" $name $age my name is egon my age is 18 ?[root@egon ~]# salary=3.3339 [root@egon ~]# printf "my name is %s my age is %7.3f\n" $name $salary my name is egon my age is 3.334
3.3、预定义变量
$* 所有的参数 $@ 所有的参数 $# 参数的个数 $$ 当前进程的PID # 此外,可以使用只读变量来获取父进程的PID:$PPID、获取执行脚本的用户ID:$UID $? 上一个命令的返回值 0表示成功 ? ?示例1: [root@egon ~]# chmod +x b.sh [root@egon ~]# ./b.sh a1 a2 a3 a4 a5 a1 a2 a3 a4 a5 a1 a2 a3 a4 a5 5 18988 1 [root@egon ~]# cat b.sh #!/usr/bin/env bash echo $* echo $@ echo $# echo $$ ? ping -c1 192.168.11.10 &>/dev/null echo $? ? 示例2: [root@egon ~]# 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@egon ~]# chmod +x ping.sh [root@egon ~]# ./ping.sh 192.168.11.10
3.4、了解的知识点:
如果我们想从命令行中获取脚本调用者传入的参数值,用$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 ~]# [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 ~]# [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 ~]# 但此时为$*就会把所有位置参数识别成一个整体,所以总结如下: 当脚本调用者的传参形式如下时 [root@localhost ~]# ./script.sh 命令1 命令2 "命令3 参数" ? 需要使用"$@"来分别获取一个个完整的命令 for i in "$@" do echo $i done ? 其余情况$*与$@完全一致
3.5、常量
相对于变量,常量就是不可以被改变的量,即只能读不能改,所以又称之为只读变量: 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 ? [root@egon ~]# x=111 [root@egon ~]# readonly x [root@egon ~]# x=666 -bash: x: 只读变量