美文网首页
Shell入门03 -- 变量

Shell入门03 -- 变量

作者: YanZi_33 | 来源:发表于2021-09-28 18:12 被阅读0次
  • 变量:用一个固定的字符串去表示不固定的内容;

自定义普通变量

  • 定义变量:变量名=value,可使用驼峰命名法,但不允许使用数字命名,不能使用横杠命名;
  • 引用变量:$变量名 或者 ${变量名}
  • 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界;
  • 创建一个脚本文件ping.sh,文件内容如下:
#!/bin/bash
  
NetWork_IP=192.169.63.177
ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error"

  • #!/bin/bash:指明脚本执行的解释器;
  • NetWork_IP=192.169.63.177:自定义普通变量NetWork_IP并初始化;
  • ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error":ping指定的网址ping 192.169.63.177,如果ping成功就打印ip $NetWork_IP ok,如果ping失败就打印ip $NetWork_IP error
  • 然后执行脚本文件 sh ping.sh,终端输出如下:
image.png
  • 查看变量:echo $变量名 或者 set|grep $变量名
  • 取消变量:unset 变量名
    image.png
  • 终端定义一个变量k且赋值为100;
  • echo $k:查的变量k的值为100;
  • set|grep $k:过滤查询关于k的所有结果,如上所示;
  • unset k取消变量k,再次查询变量k时,发现其值已经不存在了;

系统环境变量

  • 系统的环境变量:就是系统预先给我们定义的变量,其作用域是全局的,脚本文件是直接可以调用的,常见的系统环境变量有如下:
    • HOME:用户目录;
    • PATH:命令所示路径,以冒号为分隔符;
    • SHELL:当前shell类型;
    • USER:当前用户名;
    • PWD:当前路径;
    • TERM:当前终端类型;
    • HOSTNAME:当前主机名;
      image.png
  • 创建一个脚本文件ping3.sh,编辑内容如下:
#!/bin/bash
# 在脚本文件中直接访问系统的环境变量PATH
echo "${PATH}"            
  • 执行sh ping.3.sh,结果如下:

    image.png
  • 下面演示一种场景,定义两个脚本文件分别为ping.shping2.sh,脚本内容如下:

  • ping.sh脚本

#!/bin/bash
#定义了一个普通变量NetWork_IP
NetWork_IP=192.169.63.177

ping -C1 $NetWork_IP &>/dev/null && echo "ip $NetWork_IP ok" || echo "ip $NetWork_IP error"
  • ping2.sh脚本
#!/bin/bash

#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
  • 执行脚本ping2.sh,结果如下:
    image.png
  • 看到可以打印出系统环境变量HOME,没有打印出ping.sh中的普通变量NetWork_IP,也就是在ping2.sh中不能直接访问ping.sh中的普通变量NetWork_IP
  • ping2.sh中加入source ./ping.sh可实现在ping2.sh中访问ping.sh中的普通变量NetWork_IP,修改后的ping2.sh内容如下:
#!/bin/bash

source ./ping.sh

#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
  • 执行ping2.sh,结果如下:
    image.png
  • source ./ping.sh相当于将ping.sh中内容,拷贝到ping2.sh中,通过指令sh -vx ping2.sh可查看ping2.sh脚本的执行过程,如下所示:
    image.png

自定义环境变量

  • 定义临时系统变量:export 变量名=value
  • 引用临时系统变量:$变量名${变量名}
  • 查看临时系统变量:echo $变量名env|grep 变量名
  • 取消临时系统变量:unset 变量名
  • 临时系统变量的作用范围:在当前shell子shell 中有效;
  • 定一个临时环境变量IPHONE,如下所示:
    image.png
  • ping2.sh中引用临时系统变量IPHONE,如下所示:
#!/bin/bash

source ./ping.sh

#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
#引用临时环境变量IPHONE
echo $IPHONE
  • 然后执行ping2.sh,结果如下:

    image.png
  • 若定义一个普通变量Android,如下所示:

    image.png
  • ping2.sh中引用普通变量Android,如下所示:

#!/bin/bash

source ./ping.sh

#打印系统环境变量HOME
echo $HOME
#打印ping.sh脚本中定义的普通变量NetWork_IP
echo "test $NetWork_IP"
#引用临时环境变量IPHONE
echo $IPHONE
#引用普通变量Android
echo $Android
  • 执行ping2.sh,结果如下:

    image.png
  • 普通变量Android没有打印出来,这里就能看出普通变量系统变量之间的区别了;

  • 此外选中终端,按Command + T组合键,会出现一个新的终端窗口,在新的终端窗口也执行sh ping2.sh,会发现不能访问定义的系统环境变量IPHONE,如下所示:

    image.png
  • 表明定义的临时系统环境变量是存在作用范围的,只会在当前shell终端中生效;

  • 将自定义的环境变量写到系统配置文件中 -> 使之永久生效

  • 终端执行vim /etc/profile,进入如下所示:

    image.png

位置参数变量

  • 位置参数变量主要应用于脚本参数传参$1,$2,$3,$4,$5,$6,$7,$8,$9,${10}
  • 执行脚本文件时,后面最多可以输入10个参数;
  • 创建一个脚本文件ping6.sh,脚本内容如下:
#!/bin/bash
  
echo $1
echo $2
echo $3
echo $4

ping -c1 $1 &>/dev/null

if [ $? -eq 0 ]; then
   echo -e "\033[32m IP $1 is OK! \033[0m"
else
   echo -e "\033[31m IP $1 is Error! \033[0m"
fi
  • 执行脚本 sh ping6.sh li yan yan shen xian,结果如下所示:
    image.png
  • 看出执行脚本后面跟的 li yan yan shen xian 分别对应$1,$2,$3,$4,$5这五个参数,$5这个参数在脚本中没有使用所以无效;
  • 脚本参数传参时,每个参数以空格间隔开;
  • 创建一个脚本文件ping7.sh,脚本内容如下:
#!/bin/bash
  
read -p "please is Ping Network IP: " ip

ping -c1 $ip &>/dev/null

if [ $? -eq 0 ]; then
   echo -e "\033[32m IP $ip is OK! \033[0m"
else
   echo -e "\033[31m IP $ip is Error! \033[0m"
fi
  • 执行脚本 sh ping7.sh,如下所示:
    image.png
  • read -p "please is Ping Network IP: " ip:含义为让用户手动输入IP地址,用变量ip来接收用户输入的IP内容;

预先定义变量

  • $0:表示脚本文件名;

  • $*:表示执行脚本 传入的所有参数;

  • $@:表示执行脚本 传入的所有参数;

  • $#:表示执行脚本 传入的所有参数的个数;

  • $$:表示执行脚本 当前进程的PID;

  • $!:上一个后台进程的PID;

  • $?:上一个命令的返回值,0 表示成功;

  • 创建脚本文件yxbl.sh,脚本内容如下:

#!/bin/bash
  
echo "脚本名称是:$0"

echo "第三个位置参数是:$3"
echo "第四个位置参数是:$4"
echo "第五个位置参数是:$5"

echo "所有参数:$*"
echo "所有参数:$@"
echo "所有参数的个数:$#"

echo "当前进程的 PID 是:$$"
  • 执行脚本 sh yxbl.sh 1 2 3 4 5 6 7 8 9 10,执行结果如下:
    image.png
  • 脚本sh yxbl.sh的路径为:/Users/liyanyan33/soft/scripts/day01/sh yxbl.sh,若到/Users/liyanyan33/soft路径下执行脚本sh scripts/day01/yxbl.sh 1 2 3 4 5 6 7 8 9 10,执行结果如下:
    image.png
  • 看到脚本名称$0会将执行路径也打印出来,若实现不论在什么路径下执行目标脚本,只打印脚本名称,脚本内容做如下修改:
#!/bin/bash
  
echo "脚本名称是:$(basename $0)"

echo "第三个位置参数是:$3"
echo "第四个位置参数是:$4"
echo "第五个位置参数是:$5"

echo "所有参数:$*"
echo "所有参数:$@"
echo "所有参数的个数:$#"

echo "当前进程的 PID 是:$$"
  • 执行脚本sh scripts/day01/yxbl.sh 1 2 3 4 5 6 7 8 9 10,结果如下:
    image.png

变量赋值方式

第一种:显示赋值
  • 创建脚本test1.sh,脚本内容如下:
#!/bin/bash
  
IP=192.168.55.11
school="QingHuaDaXue"
today_time1=`date +%F`
today_time2=$(date +%F)

echo $IP
echo $school
echo $today_time1
echo $today_time2
  • 执行脚本sh test1.sh,结果如下:
    image.png
  • today_time1中的中引号是反引号`` 而不是 单引号'',通常使用today_time2=$(date +%F)这种方式赋值;
第二种:read 从键盘读入变量值
  • read -p "提示信息: " 变量名:表示提示输入信息,输入的内容赋值给右侧的变量;

  • read -t 5 -p "提示信息: " 变量名:表示提示输入信息,输入的内容赋值给右侧的变量,若用户在5秒内没有输入,就会自动退出;

  • 创建脚本文件test2.sh,脚本内容如下:

#!/bin/bash
  
back_dir1=/var/backup

read -p "请输入你的备份目录:" back_dir2

echo $back_dir1
echo $back_dir2
  • 执行脚本 sh test2.sh,结果如下:

    image.png
  • 创建脚本文件test3.sh,脚本内容如下:

#!/bin/bash
  
read -p "输入IP:" ip

ping -c1 $ip &>/dev/null

if [ $? -eq 0 ]; then
   echo "host $ip is OK!!!"
else
   echo "host $ip is Err!!!"
fi
  • 执行脚本 sh test3.sh,结果如下:

    image.png
  • 创建脚本文件test5.sh,脚本内容如下:

#!/bin/bash
  
read -t 5 -p "Please name: " name

echo "Use Name: $name"
  • read -t 5 -p "Please name: " name:表示提示用户输入姓名,并赋值给变量name,若用户在5秒内没有输入,就会自动退出;
  • 注意事项1⚠️:定义或引用变量时使用单引号双引号的区别 ,终端直接输入定义变量,如下所示:
    image.png
  • 使用双引号会解析出变量的值,而使用单引号不会解析变量的值,保持原样在引用特殊字符的时候应使用单引号,使用双引号会出现解析报错,如下所示:
image.png
  • 注意事项2⚠️:反引号 等价于 $()
  • touch $(date +%F)_file2.txttouchdate +%F_file1.txt 等价 `以日期时间创建文件;
总结:
  • 双引号:会解析变量;
  • 单引号:不会解析变量,输入等于输出;
  • 反引号:是用来解析shell命令的 其与 $()等价;

变量的数值运算

  • 整数运算方式一: expr + - \* / %,注意乘法要加上反义字符\,下面在终端中直接演示,如下所示:

    image.png
  • 整数运算方式二:$((+ - * / %)),注意这里乘法不需要加反义字符\,下面在终端中演示,如下所示:

    image.png
  • 整数运算方式三:$[+ - * / %],终端演示如下:

    image.png
  • 整数运算方式四:let xx= + - * / %echo $xx

    image.png
  • 小数运算:bc

  • echo "scale=2;6/4" |bc:输出结果为1.50,其中scale=2表示保留两位小数;

变量替代

  • ${变量名-新值}:表示变量的默认值为新值,即当变量有值时,取自己的值,当变量为空值时,取默认值,如下所示:

    image.png
  • ${变量名-新值}:不能预断变量为空,只有设置unset才判断变量为空,取得默认值;

    image.png
  • ${变量名:-新值}:表示变量的默认值为新值,即当变量有值时,取自己的值,当变量为空值时,取默认值,如下所示:

    image.png
  • ${变量名:-新值}:能预断变量为空,则取得默认值,如下所示:

    image.png
  • 所以看出${变量名-新值}${变量名:-新值}之间最大的区别;

变量的自增

  • 创建脚本test6.sh,内容如下:
#!/bin/bash

ip=192.168.56.11
i=1
while [ $i -le 5 ]; do
  ping -c1 $ip &/dev/null
  if [ $? -eq 0 ]; then
    echo  "$ip is up ..."
  fi
  let i++
done
  • while循环,i <= 5 执行 循环体;
  • let i++:i自增

相关文章

  • Shell入门03 -- 变量

    变量:用一个固定的字符串去表示不固定的内容; 自定义普通变量 定义变量:变量名=value,可使用驼峰命名法,但不...

  • Shell 概述

    学习 Shell 主要包括的内容: Shell 脚本入门 Shell 变量 Shell 内置命令 Shell 运算...

  • Bash shell

    Shell脚本编程30分钟入门 1. $开头shell变量的含义: $1, $2, $3, ... are the...

  • shell 入门 01 变量

    变量 shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意...

  • shell 笔记 Day03

    shell 笔记 Day03 case语句:case 变量 in模式1)语句;;模式2)语句;;*)默认语句esa...

  • shell基础在工作中的应用

    shell编程基础:1. shell变量:环境变量、特殊变量、用户自定义变量2. shell输入输出3 shell...

  • Linux Shell:基础知识和Shell变量

    摘要:Linux,Shell 整理Shell内容要点: Shell基础知识 Shell变量的类型 Shell变量赋...

  • 03 - shell之变量

    定义变量 以固定的名称,存放可以能有变化的值 定义变量的格式变量名 = 变量值 取消变量的格式unset 变量名 ...

  • Shell常用命令(md格式方便阅读和复制粘贴)

    Shell Shell中的变量 系统变量 自定义变量 自定义变量规则 Shell特殊变量 运算符 条件判断 基本语...

  • shell第11章shell脚本

    什么是shell? Bash shell: 什么是shell脚本? 变量的介绍: 普通变量介绍: 环境变量介绍: ...

网友评论

      本文标题:Shell入门03 -- 变量

      本文链接:https://www.haomeiwen.com/subject/gbcrnltx.html