第二章 Shell变量定义
Posted _妙︶"
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 Shell变量定义相关的知识,希望对你有一定的参考价值。
1. Shell变量概述
1. 什么是变量
变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用。
2.变量命令规范
变量定义时名称有要求:字母、数字、下划线几个组成,尽量字母开头,变量名最好具备一定的含义。
ip=10.0.0.100
ip1=10.0.0.100
Hostname_Ip=10.0.0.100
hostname_IP=10.0.0.100
等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要与系统命令出现冲突。
3. Shell变量定义的方式
01)用户自定义变量:人为定义的变量名称。
02)系统环境变量:保存的是和系统操作环境相关的数据。
03)位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。
04)预定义的变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4. Shell变量定义实践
01.用户自定义变量示例,当前Shell有效
#1.定义变量,变量名=变量值。不能出现"-横岗"命令
#定义变量有空格时,必须使用引号
[root@cc ~]# cc="hello shell"
#2.引用变量,$变量名 或 ${变量名}
[root@cc ~]# echo $cc
hello shell
[root@cc ~]# echo $cc_test
[root@cc ~]# echo ${cc}_test
hello shell_test
#3.查看变量,set显示所有变量,包括自定义变量和环境变量
[root@cc ~]# set |grep cc
HOSTNAME=cc
cc='hello shell'
#只显示系统的环境变量
[root@cc ~]# env|grep cc
HOSTNAME=cc
#4.取消变量,作用范围:仅在当前Shell中有效。
[root@cc ~]# unset cc
[root@cc ~]# set |grep cc
HOSTNAME=cc
#5.注意事项,引用变量时注意事项,单双引号和不加引号的区别。
[root@cc ~]# var=$(hostname)
[root@cc ~]# echo $var
cc
[root@cc ~]# var="$(hostname)"
[root@cc ~]# echo $var
cc
[root@cc ~]# var='$(hostname)'
[root@cc ~]# echo $var
$(hostname)
[root@cc ~]# echo "$var"
$(hostname)
[root@cc ~]# echo '$var'
$var
[root@cc ~]# name=cc
[root@cc ~]# echo $name
cc
[root@cc ~]# echo $name money is $10000000000
cc money is 0000000000
[root@cc ~]# echo "$name money is $10000000000"
cc money is 0000000000
[root@cc ~]# echo '$name money is $10000000000'
$name money is $10000000000
[root@cc ~]# echo $name money is $10000000000
cc money is $10000000000
[root@cc ~]# echo "$name money is $10000000000"
cc money is $10000000000
[root@cc ~]# echo '$name money is $10000000000'
$name money is $10000000000
[root@cc ~]# echo $name money is '$10000000000'
cc money is $10000000000
总结:
单引号 #所见即所得,吃啥吐啥,原封不动的输出。
双引号 #与单引号类似,特殊符号会被解析(运行):$ $() ``
不加引号 #与双引号类似,如果出现空格,不会算作一个整体。
反引号 #先执行反引号里面的命令,把执行的结果显示出来。
02. 系统环境变量示例,在当前Shell和子Shell有效
#1.定义环境变量:export 变量,将自定义变量转换成环境变量。
[root@cc ~]# echo $name
cc
[root@cc ~]# cat test.sh
#!bin/bash
echo $name
#执行脚本时,会调用另一个bash执行,就访问不到$name的值。
[root@cc ~]# sh test.sh
#将变量转换为环境变量
[root@cc ~]# export name=cc
#再次执行脚本
[root@cc ~]# sh test.sh
cc
#注意:
使用export可以在当前用户的所有环境生效。
将export定义变量写入/etc/bashrc,对所有用户永久生效。
将exprot定义变量写入.bashrc,只对该用户永久生效。
#2.使用系统已定义好的环境变量
[root@cc ~]# cat env.sh
#!/bin/bash
echo "用户的家目录: $HOME"
echo "当前主机名是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口是: $SSH_CONNECTION"
[root@cc ~]# sh env.sh
用户的家目录: /root
当前主机名是: cc
当前所在目录: /root
当前连接服务器使用的地址和端口是: 10.0.0.1 62881 10.0.0.98 22
03. 预先定义的变量参数示例,系统内置变量的使用方法。
1.脚本如下:
#!/bin/bash
echo "#当前shell脚本的文件名: $0"
echo "#第1个shell脚本位置参数:$1"
echo "#第2个shell脚本位置参数:$2"
echo "#第3个shell脚本位置参数:$3"
echo "#所有传递的位置参数是: $*"
echo "#所有传递的位置参数是: $@"
echo "#总共传递的参数个数是: $#"
echo "#当前程序运行的 PID 是: $$"
echo "#上一个命令执行的返回结果: $?"
2.执行结果如下:
[root@cc ~]# sh variable.sh linux python mysql
#当前shell脚本的文件名: variable.sh
#第1个shell脚本位置参数:linux
#第2个shell脚本位置参数:python
#第3个shell脚本位置参数:mysql
#所有传递的位置参数是: linux python mysql
#所有传递的位置参数是: linux python mysql
#总共传递的参数个数是: 3
#当前程序运行的 PID 是: 25285
#上一个命令执行的返回结果: 0
3.这里需要注意 (*和)@的区别
可以看到不加引号时,二者都是返回传入的参数,但加了引号后
$*把参数作为一个字符串整体(单字符串)返回,
$@把每个参数作为一个一个字符串返回
#测试脚本如下:
[root@cc ~]# cat test.sh
#!/bin/bash
test() {
echo "未加引号,二者相同"
echo $*
echo $@
echo "加入引号后对比"
for N in "$*"
do
echo $N
done
echo "----------"
for N in "$@"
do
echo $N
done
}
test 123 456 789
#执行结果如下:
[root@cc ~]# sh test.sh
未加引号,二者相同
123 456 789
123 456 789
加入引号后对比
123 456 789
----------
123
456
789
04. 位置是什么?在执行脚本的时候,在脚本后面写入的内容,按空格分隔。
[root@cc ~]# /etc/init.d/network
Usage: /etc/init.d/network {start|stop|status|restart|force-reload}
#status就算第一个位置参数 $1其它位置变量:$2..$9 ${10}
[root@cc ~]# /etc/init.d/network status
05. 补充: 将命令执行的结果传递给变量。(命令替换)
#根据系统时间,打印今年时间和明年时间
[root@cc ~]# echo "This is $(date +%Y) year"
This is 2019 year
[root@cc ~]# echo "This is $(($(date +%Y)+1)) year"
This is 2020 year
#自定义变量运算
[root@cc ~]# age=18
[root@cc ~]# echo $age
18
[root@cc ~]# echo $(($age+1))
19
#命令的嵌套使用,使用$($())
[root@cc ~]# mkdir oldboy
[root@cc ~]# touch oldboy/{1..5}.txt
[root@cc ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt"))
tar: Removing leading `/' from member names
[root@cc ~]# echo $data
/root/oldboy/1.txt /root/oldboy/2.txt /root/oldboy/3.txt /root/oldboy/4.txt /root/oldboy/5.txt
2. Shell变量赋值
除了自定义变量,以及系统内置变量,还可以使用read命令通过交互式方式传递变量
01.read示例语法
#示例脚本:
[root@cc ~/shell]# cat read1.sh
#!/bin/bash
read -p "提示信息:" var
echo "你输入的变量是: $var "
#执行脚本
[root@cc ~/shell]# sh read1.sh
提示信息:oldboy
你输入的变量是: oldboy
02.read示例语法,简单备份场景
#示例脚本:
[root@cc ~/shell]# cat read2.sh
#!/bin/bash
read -p "你要备份的目录是:" back
echo "你要备份的目录是: $back "
echo "-------------backuping $back ---------------"
echo "-------------backup done $back -------------"
#执行脚本
[root@cc ~/shell]# sh read2.sh
你要备份的目录是:/data
你要备份的目录是: /data
-------------backuping /data ---------------
-------------backup done /data -------------
03. read示例语法,测试用户输入的IP是否通
1)执行脚本时,提示:请输入ip.
2)使用ping命令去探测用户输入的IP是否通.
3)如果通则返回存活,如果不通则返回失败.
#示例脚本:
[root@cc ~/shell]# cat read3.sh
#!/bin/bash
#1.提示用户输入一个IP地址
read -p "请输入需要检测的IP地址: " IP
#2.使用ping命令检测IP地址是否通讯
ping -W1 -c1 $IP &>/dev/null
rc=$?
#3.检查上一次命令执行返回的状态码是否正常
if [ $rc -eq 0 ];then
echo "$IP 能正常通信"
else
echo "$IP 无法正常通信"
fi
#执行脚本
[root@cc ~/shell]# sh read3.sh
请输入需要检测的IP地址: 223.5.5.5
223.5.5.5 能正常通信
[root@cc ~/shell]# sh read3.sh
请输入需要检测的IP地址: 233.5.5.5
233.5.5.5 无法正常通信
#echo命令输出颜色。
echo -e "