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

  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]… 例如:

read v1 v2 v3 

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

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

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

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

[[email protected] hadoop]# vi variable.sh
#!/bin/bash
expert=Bill  #给变量expert赋值
echo $expert     #输出expert的值

2ndexp=Neo     #给变量2ndexp赋值失败,失败原因:变量名为数字开头
echo $2ndexp

thirdexp=Adm Smith  #给变量thirdexp赋值失败,失败原因:等号右边有空格
echo $thirdexp

lsdir=`ls /home`     #将ls /home命令的返回值赋值给变量lsdir
echo $lsdir

read -p "Please Input The favorite 3 letters : " FL1 FL2 FL3  #通过read命令 获取交互变量
echo "The letters you input is: $FL1 $FL2 $FL3"    #输出交互变量

运行结果

[[email protected] hadoop]# ./variable.sh
Bill
./variable.sh: line 5: 2ndexp=Neo: command not found
ndexp
./variable.sh: line 8: Smith: command not found

hadoop hao moninca.sh zabbix zenoss digd
Please Input The favorite 3 letters :a b c
The letters you input is: a b c

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

二.位置变量

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

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

  一个简单的例子:

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

运行结果

[[email protected] 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等等,那我们来看看此脚本是什么样的。

[[email protected] /]# cat /etc/init.d/httpd | grep -v ^# |grep -v ^$
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} $httpd
        RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;
  condrestart|try-restart)
        if status -p ${pidfile} $httpd >&/dev/null; then
                stop
                start
        fi
        ;;
  force-reload|reload)
        reload
        ;;
  graceful|help|configtest|fullstatus)
        $apachectl [email protected]
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
        RETVAL=2
esac
exit $RETVAL

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

三.预定义变量

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

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

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

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

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

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

  一个简单的例子:

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

  运行结果:

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

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

[[email protected] hadoop]# vi var_show.sh
#!/bin/bash
echo Running File is  $0            #利用$0输出文件路径
mkdir $1                             #取第一个参数 /home/sss作为mkdir的参数并新建文件夹
echo $1 is ready
touch $1/file.$2.txt                  #取第一个和第二个参数$1、$2作为新建文件 file.$2.txt的文件路径及名称
echo  $1/file.$2.txt is ready
ping $3 -c 1  >> $1/file.$2.txt     #ping 第三个参数 1次(本例为192.168.0.1)的,并追加结果至刚才新建的文件file.$2.tx
str0=$?                             #赋值给命令返回值,这里应该返回0
echo       >> $1/file.$2.txt    

ping $3 -m 1 2>> $1/file.$2.txt    # ping 第三个参数 1次(本例为192.168.0.1)但是参数错误(-m),并报错信息追加至刚才新建的文件file.$2.txt
str1=$?
echo       >> $1/file.$2.txt

pang $3  2>> $1/file.$2.txt          # ping 第三个参数 1次(本例为192.168.0.1)但是命令错误(pang),并报错信息追加至刚才新建的文件file.$2.txt
str2=$?
echo       >> $1/file.$2.txt

$4   2>> $1/file.$2.txt              #执行命令,命令为第四个参数(本例为service)但是参数错误,并报错信息追加至刚才新建的文件file.$2.txt
str3=$?
echo       >> $1/file.$2.txt

$5   >> $1/file.$2.txt               #执行命令,命令为第五个参数(本例为service httpd)但是参数错误,并报错信息追加至刚才新建的文件file.$2.txt 

str4=$?
echo       >> $1/file.$2.txt     

$6   >> $1/file.$2.txt                #执行命令,命令为第六个参数(本例为service httpd stop并将信息追加至刚才新建的文件file.$2.txt
str5=$?
echo       >> $1/file.$2.txt

echo $str0  $str1  $str2 $str3 $str4  $str5     #输出所有命令的返回值。
echo       >> $1/file.$2.txt
echo Now the system will sleep $# seconds.
sleep $#            #利用预定于变量 $# ,取位置参数的个数,并sleep相应的秒数。
echo FINISH!!!

  运行命令 并加参数

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

  查看结果:

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

  vi 刚才新建的文档

[[email protected] home]# vi sss/file.demo.txt
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=3.02 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 3.026/3.026/3.026/0.000 ms

ping: invalid option -- ‘m‘
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination

./var_show.sh: line 15: pang: command not found

Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]

Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}

Stopping httpd: ^[[60G[^[[0;31mFAILED^[[0;39m]^M

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

时间: 2024-12-19 23:48:41

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

PHP可变变量,预定义变量,综述,$_GET数组

可变变量 所谓可变变量,就是一个变量的名,又是一个变量. 可变变量的语法是php很特殊的语法--其它语言中少见. $v1 = "abc";    //这是一个字符串变量,其内容是字符串"abc" $abc = 10;      //这是一个普通变量,其内容是数字10 echo $$v1;      //此时,就是所谓的"可变变量" 怎么理解可变变量 1,凡是$符号出现,就会有可能理解为是一个变量 2,这里第一个"$"出现了,则

预定义变量的使用(五)

在 makefile 中存在一些预定义的变量,如自动变量:[email protected],$^,$< 等:还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等.下来我们先来解释下自动变量的意义:a> [email protected] 是指当前规则中触发命令被执行的目标:b> $^ 是指当前规则中的所有依赖:c> $< 是指当前规则中的第一个

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

Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这种变量中主要保存和系统操作环境相关的数据. 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的. 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的. Bash变量注意点 1.变量名称可以由字母.数字和下划线组成,但是不能以数字

Linux主要shell命令详解(上)

[摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash.本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性. 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把

shell script详解

shell script详解 定义 利用shell的功能写的一个"程序"(program),这个程序是纯文本文件,可以将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式.管道命令与数据流重定向. 用途 自动化管理.管理系统.入侵检测.连续命令单一化.简单的数据处理.跨平台使用等 规范 #!/bin/bash 声明这个文件内的语法是bash的语法,则系统会加载bash的相关配置文件来执行下面的命令 # Program: #       This program shows

linux主要shell命令详解

Linux主要shell命令详解 shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash.本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性. 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层.当从sh

Shell test命令(Shell [])详解,附带所有选项及说明

test 是 Shell 内置命令,用来检测某个条件是否成立.test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test. test 命令有很多选项,可以进行数值.字符串和文件三个方面的检测. Shell test 命令的用法为: test expression 当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值. test 命令也可以简写为[],它的用法为: [ expression ] 注意[]和expression之间的空格,这两个空格是必

PATH环境变量和CLASSPATH环境变量详解

大凡装过JDK的人都知道要安装完成后要设置环境变量,可是为什么要设置环境变量呢?环境变量有什么作用? 1)PATH详解: 计算机安装JDK之后,输入“javac”“java”之类的命令是不能马上被计算机正确执行的,因为计算机不知道到哪里去找这两个命令. 计算机如何查找命令呢?Windows操作系统根据PATH环境变量来查找命令.PATH环境变量的值是一系列路径,Windows操作系统将在这一系列的路径中依次查找命令,如果能找到这个命令,则该命令是可执行的:否则将出现“‘XXX’不是内部命令或外部

mysql show variables系统变量详解

mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选项来更改这些默认值.服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句可以更改动态全局变量.要想更改全局变量,必须具有SUPER权限. 服务器还为每个客户端连接维护会话变量.连接时使用相应全局变量的当前值对客户端会话变量进行初始化.客户可以通过SET SESSION var