Shell 变量分为3部分,分别是用户自定义变量、位置变量和预定义变量。

一.   自定义变量

  那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell变量。y=3a+2b,就是把3a+2b这个值赋予y。变量名是以字母或下线符打头的,可以从第二位开始加入数字,并且大小写字母意义不同。如dir与Dir是不同的变量。变量名的长度不受限制。比如:expert=Bill,就是将Bill赋值给expert,后来脚本读取变量$expert时,会取值为Bill

  注意!!!

  1. 在赋值语句中,赋值号“=”的两边不能有空格,否则在执行时会引起错误,这一点就没有python爽。如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。例如, names="abc dd ff"
  2. 变量可以使用数字、大小写字母、下划线,但是不能以数字开头。

  可以将一个命令的执行结果赋值给变量。有两种形式的命令替换:一种是使用倒引号(esc下面的案件)引用命令,其一般形式是:`命令`。和$(命令)相同

  例如:将当前工作目录的全路径名存放到变量dir中,输入以下命令行:

  $ dir=`pwd`

  另一种形式是:$(命令表)。上面的命令行也可以改写为:

  $ dir=$(pwd)

交互变量

  利用read命令可以从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是:read  [ 变量1] [ 变量2]… 例如:

  1. read v1 v2 v3

  如果需要提示用户输入,可以使用 -p 参数 例如

  1. read -p "Please input the info to user" v1 v2 v3

  输入数据时,数据间以空格或制表符作为分隔符。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串。

自定义变量所有例子如下。

  1. [root@Hao hadoop]# vi variable.sh
  2. #!/bin/bash
  3. expert=Bill #给变量expert赋值
  4. echo $expert #输出expert的值
  5.  
  6. 2ndexp=Neo #给变量2ndexp赋值失败,失败原因:变量名为数字开头
  7. echo $2ndexp
  8.  
  9. thirdexp=Adm Smith #给变量thirdexp赋值失败,失败原因:等号右边有空格
  10. echo $thirdexp
  11.  
  12. lsdir=`ls /home` #将ls /home命令的返回值赋值给变量lsdir
  13. echo $lsdir
  14.  
  15. read -p "Please Input The favorite 3 letters : " FL1 FL2 FL3 #通过read命令 获取交互变量
  16. echo "The letters you input is: $FL1 $FL2 $FL3" #输出交互变量

运行结果

  1. [root@Hao hadoop]# ./variable.sh
  2. Bill
  3. ./variable.sh: line 5: 2ndexp=Neo: command not found
  4. ndexp
  5. ./variable.sh: line 8: Smith: command not found
  6.  
  7. hadoop hao moninca.sh zabbix zenoss digd
  8. Please Input The favorite 3 letters :a b c
  9. The letters you input is: a b c

下面来说说两个重要的变量,一个是位置变量,另一个则是预定义变量。

二.位置变量

  执行Linux命令或Shell 脚本时可以带有参数。相应地,在Shell脚本中应有变量。执行Shell程序时,用实参去替代这些变量。

  在Shell脚本中这类变量的名称很特别,分别是0、1、2……这类变量称作位置变量,因为它们与命令行上具体位置的实参相对应:命令名(脚本名)对应位置变量0,第一个实参对应位置变量1,第二个实参对应位置变量2……如果位置变量是由两个或更多个数字构成,那么,必须把它们用一对花括号括起来,如{10}、{11}。命令行实参与脚本中位置变量的对应关系。  

  一个简单的例子:

  1. [root@Hao hadoop]# vi variable.sh
  2. #!/bin/bash
  3. echo "The letters you like is: $1 $2 $3" #输出3个位置参数

运行结果

  1. [root@Hao hadoop]# ./variable.sh Z W J #运行脚本,并带有3个参数 $1=Z、$2=W、$3=J
    The letters you like is: Z W J

  再比如:重启网络服务命令,/etc/init.d/httpd status,status是/etc/init.d/httpd status命令的第一个位置变量的参数,同样的位置变量$1可以使用参数 start 、stop等等,那我们来看看此脚本是什么样的。

  1. [root@Hao /]# cat /etc/init.d/httpd | grep -v ^# |grep -v ^$
  2. case "$1" in
  3. start)
  4. start
  5. ;;
  6. stop)
  7. stop
  8. ;;
  9. status)
  10. status -p ${pidfile} $httpd
  11. RETVAL=$?
  12. ;;
  13. restart)
  14. stop
  15. start
  16. ;;
  17. condrestart|try-restart)
  18. if status -p ${pidfile} $httpd >&/dev/null; then
  19. stop
  20. start
  21. fi
  22. ;;
  23. force-reload|reload)
  24. reload
  25. ;;
  26. graceful|help|configtest|fullstatus)
  27. $apachectl $@
  28. RETVAL=$?
  29. ;;
  30. *)
  31. echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
  32. RETVAL=2
  33. esac
  34. exit $RETVAL

  此处case了第一个位置变量的取值以及对应的操作。

三.预定义变量

  预定义变量,顾名思义,就是预先设置好的系统变量。

  $0 参考位置变量,即第0个变量,也就是当前脚本的名称。

  $# 命令行上实际参数的个数。

  $* 表示在命令行中实际给出的所有实参字符串。

  $? 上一条命令执行后的返回值(也称作 “退出码”)。它是一个十进制数。命令执行成功时,则返回值为0;如果执行失败,则返回非0值。(不同的失败有不同的返回值)

  $$ 当前进程的pid进程号。

  一个简单的例子:

  1. [root@Hao hadoop]# vi variable.sh
  2. #!/bin/bash
  3. echo "The letters you like is: $1 $2 $3" #输出位置变量的参数
  4. echo $0 #输出脚本名
  5. echo $# #输出参数数量,正确的输出为3
  6. echo $*      #输出所有参数 正确的输出为 ZN CN SJ
  7. echo $? #输出上一条命令(echo $*)的返回值(是否正确)
  8. #The last command is "print the members of the parameter"
  9. cd /hom      #切换至目录/home,此处输入错误,命令不生效
  10. echo $?      #上一条命令(cd /hom)执行失败,返回非0
  11. cd /home/hao      #切换至目录/home,此处输入正确了
  12. echo $?      #上一条命令(cd /home)执行成功,返回0
  13. echo $$      #当前进程的pid进程号。

  运行结果:

  1. 运行结果:
  2. [root@Hao hadoop]# ./variable.sh ZN CN SJ #运行脚本,并带有3个参数 ZN、CN、SJ
  3. The letters you like is: ZN CN SJ
  4. ./variable.sh
  5. 3
  6. ZN CN SJ
  7. 0
  8. ./variable.sh: line 8: cd: /hom: No such file or directory
  9. 1
  10. 0
  11. 5325

  另一个例子,这里用到了6个位置变量,有些位置变量的参数有空格,这里给出参数空格的处理方式(还有其他方式,我没有全部列出来,具体有什么方式,大家自行思考)。

  1. [root@Hao hadoop]# vi var_show.sh
  2. #!/bin/bash
  3. echo Running File is $0      #利用$0输出文件路径
  4. mkdir $1    #取第一个参数 /home/sss作为mkdir的参数并新建文件夹
  5. echo $1 is ready
  6. touch $1/file.$2.txt #取第一个和第二个参数$1、$2作为新建文件 file.$2.txt的文件路径及名称
  7. echo $1/file.$2.txt is ready
  8. ping $3 -c 1 >> $1/file.$2.txt    #ping 第三个参数 1次(本例为192.168.0.1)的,并追加结果至刚才新建的文件file.$2.tx
  9. str0=$?    #赋值给命令返回值,这里应该返回0
  10. echo >> $1/file.$2.txt
  11.  
  12. ping $3 -m 1 2>> $1/file.$2.txt   # ping 第三个参数 1次(本例为192.168.0.1)但是参数错误(-m),并报错信息追加至刚才新建的文件file.$2.txt
  13. str1=$?
  14. echo >> $1/file.$2.txt
  15.  
  16. pang $3 2>> $1/file.$2.txt # ping 第三个参数 1次(本例为192.168.0.1)但是命令错误(pang),并报错信息追加至刚才新建的文件file.$2.txt
  17. str2=$?
  18. echo >> $1/file.$2.txt
  19.  
  20. $4 2>> $1/file.$2.txt #执行命令,命令为第四个参数(本例为service)但是参数错误,并报错信息追加至刚才新建的文件file.$2.txt
  21. str3=$?
  22. echo >> $1/file.$2.txt
  23.  
  24. $5 >> $1/file.$2.txt #执行命令,命令为第五个参数(本例为service httpd)但是参数错误,并报错信息追加至刚才新建的文件file.$2.txt
  25.  
  26. str4=$?
  27. echo >> $1/file.$2.txt
  28.  
  29. $6 >> $1/file.$2.txt #执行命令,命令为第六个参数(本例为service httpd stop并将信息追加至刚才新建的文件file.$2.txt
  30. str5=$?
  31. echo >> $1/file.$2.txt
  32.  
  33. echo $str0 $str1 $str2 $str3 $str4 $str5 #输出所有命令的返回值。
  34. echo >> $1/file.$2.txt
  35. echo Now the system will sleep $# seconds.
  36. sleep $# #利用预定于变量 $# ,取位置参数的个数,并sleep相应的秒数。
  37. echo FINISH!!!

  运行命令 并加参数

  1. [root@Hao hadoop]# ./var_show.sh /home/sss demo 192.168.0.1 service 'service httpd' "service httpd stop"
    脚本 第一个参数 $2 第三个参数 $4 $5开始出现空格 $6也出现空格,需使用单引号和双引号

  查看结果:

  1. Running File is ./var_show.sh
  2. /home/sss is ready
  3. /home/sss/file.demo.txt is ready
  4. 0 2 127 1 2 0
  5. Now the system will sleep 6 seconds.
  6. FINISH!!!

  vi 刚才新建的文档

  1. [root@Hao home]# vi sss/file.demo.txt
  2. PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
  3. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=3.02 ms
  4.  
  5. --- 192.168.0.1 ping statistics ---
  6. 1 packets transmitted, 1 received, 0% packet loss, time 3ms
  7. rtt min/avg/max/mdev = 3.026/3.026/3.026/0.000 ms
  8.  
  9. ping: invalid option -- 'm'
  10. Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
  11. [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
  12. [-M mtu discovery hint] [-S sndbuf]
  13. [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
  14.  
  15. ./var_show.sh: line 15: pang: command not found
  16.  
  17. Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]
  18.  
  19. Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}
  20.  
  21. Stopping httpd: ^[[60G[^[[0;31mFAILED^[[0;39m]^M

  从这里看出,想要写好Shell脚本,熟练掌握和运用 位置变量和预定义变量是不可或缺的。

Shell 变量详解教程之位置变量与预定义变量。的更多相关文章

  1. Shell 变量详解教程之位置变量与预定义变量

    Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...

  2. 4、Ubuntu系统环境变量详解

    参考:Linux公社Ubuntu系统环境变量详解 UNIX/Linux系统中的环境变量和库文件的使用方法 由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,因此我们需要了解 ...

  3. 小鸟初学Shell编程(八)环境变量、预定义变量与位置变量

    环境变量 环境变量:每个Shell打开都可以获得到的变量. 我们知道通过export的方式打开可以让子进程读取父进程的变量的值,那怎么样才能让每一个进程都能读取到变量的值呢? 在这呢,系统有一些默认的 ...

  4. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  5. Make命令完全详解教程

    Make命令完全详解教程 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用m ...

  6. 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法

    1.展示这段shell命令 +详解 #================================================================================= ...

  7. Linux主要shell命令详解(上)

    [摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的 ...

  8. 【转】angular中$parse详解教程

    原文: https://yq.aliyun.com/ziliao/40516 ------------------------------------------------------------- ...

  9. 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解  更新时间:2017年10月27日 09:44:56   作者:铁锚   我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...

随机推荐

  1. Django创建模板、URL模式、创建视图函数

    1.在应用目录下创建模板(templates目录) 在模板目录下创建archive.html <!DOCTYPE html> <html lang="en"> ...

  2. 使用SVG基本操作API

    前面的话 本文将详细介绍SVG基本操作API,并使用这些API操作实例效果 基础API 在javascript中,可以使用一些基本的API来对SVG进行操作 [NS地址] 因为SVG定义在其自身的命令 ...

  3. none,hidden和opacity="0"设置元素不可见的区别

    none,hidden和opacity="0"均可设置元素为不可见的状态.其中none属于display的属性值,hidden属于visibility的属性值.使用none时元素不 ...

  4. PHP初入,基础知识点分享(a标签&表格的嵌套&文字的处理)

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  5. 微软为啥让免费升Win10?

           今天终于赶在截止日期之前把我的联想PC升到win10.微软这次对中国开放的持续一年的免费升级活动主要有两个原因.首先当然是"感恩Windows用户长久支持的回馈".微 ...

  6. CCIE-MPLS VPN-实验手册(下卷)

    10:跨域的MPLS VPN (Option A) 10.1 实验拓扑 10.1 实验需求 a.       R1 R2 R3 组成P-NETWORK R1 R2 R3 位于AS 1,底层协议采用EI ...

  7. 转: 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17382679 在<Java并发编程学习笔记之五:volatile变量修饰符-意料之外 ...

  8. 解决 SQL 注入的另类方法

    本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...

  9. Beta版本测试报告以及Beta版本发布说明

    Beta版本测试报告 请根据团队项目中软件的需求文档.功能说明.系统设计和Beta阶段的计划安排,写出软件的测试过程和测试结果,并回答下述问题. 在测试过程中总共发现了多少bug?每个类别的bug分别 ...

  10. 团队作业4——第一次项目冲刺 fOURth DaY

    项目冲刺--Quadra Kill 兄弟们,再坚持一下,再坚持一下,再给我一个头我就五杀了. 今天可谓是项目的一个转折点,因为跳转和数据库已经基本写好啦,鼓掌~[啪啪啪啪啪啪] 让我们来看看今天大家做 ...