Shell 变量详解教程之位置变量与预定义变量
Shell 变量分为3部分,分别是用户自定义变量、位置变量和预定义变量。
一. 自定义变量
那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell变量。y=3a+2b,就是把3a+2b这个值赋予y。变量名是以字母或下线符打头的,可以从第二位开始加入数字,并且大小写字母意义不同。如dir与Dir是不同的变量。变量名的长度不受限制。比如:expert=Bill,就是将Bill赋值给expert,后来脚本读取变量$expert时,会取值为Bill
注意!!!
- 在赋值语句中,赋值号“=”的两边不能有空格,否则在执行时会引起错误,这一点就没有python爽。如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。例如, names="abc dd ff"
- 变量可以使用数字、大小写字母、下划线,但是不能以数字开头。
可以将一个命令的执行结果赋值给变量。有两种形式的命令替换:一种是使用倒引号(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
输入数据时,数据间以空格或制表符作为分隔符。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串。
自定义变量所有例子如下。

[root@Hao 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" #输出交互变量

运行结果

[root@Hao 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}。命令行实参与脚本中位置变量的对应关系。
一个简单的例子:
[root@Hao hadoop]# vi variable.sh
#!/bin/bash
echo "The letters you like is: $1 $2 $3" #输出3个位置参数
运行结果
[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等等,那我们来看看此脚本是什么样的。

[root@Hao /]# 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 $@
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进程号。
一个简单的例子:
运行结果:
另一个例子,这里用到了6个位置变量,有些位置变量的参数有空格,这里给出参数空格的处理方式(还有其他方式,我没有全部列出来,具体有什么方式,大家自行思考)。

[root@Hao 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!!!

运行命令 并加参数
[root@Hao hadoop]# ./var_show.sh /home/sss demo 192.168.0.1 service 'service httpd' "service httpd stop"
脚本 第一个参数 $2 第三个参数 $4 $5开始出现空格 $6也出现空格,需使用单引号和双引号
查看结果:
vi 刚才新建的文档
从这里看出,想要写好Shell脚本,熟练掌握和运用 位置变量和预定义变量是不可或缺的。
转自:https://www.cnblogs.com/LinuxBlogs/p/4390659.html
Shell 变量详解教程之位置变量与预定义变量的更多相关文章
- Shell 变量详解教程之位置变量与预定义变量。
Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一. 自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...
- 4、Ubuntu系统环境变量详解
参考:Linux公社Ubuntu系统环境变量详解 UNIX/Linux系统中的环境变量和库文件的使用方法 由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,因此我们需要了解 ...
- 小鸟初学Shell编程(八)环境变量、预定义变量与位置变量
环境变量 环境变量:每个Shell打开都可以获得到的变量. 我们知道通过export的方式打开可以让子进程读取父进程的变量的值,那怎么样才能让每一个进程都能读取到变量的值呢? 在这呢,系统有一些默认的 ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
- Make命令完全详解教程
Make命令完全详解教程 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用m ...
- 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法
1.展示这段shell命令 +详解 #================================================================================= ...
- Linux主要shell命令详解(上)
[摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的 ...
- 【转】angular中$parse详解教程
原文: https://yq.aliyun.com/ziliao/40516 ------------------------------------------------------------- ...
- 如何查找YUM安装的JAVA_HOME环境变量详解
如何查找YUM安装的JAVA_HOME环境变量详解 更新时间:2017年10月27日 09:44:56 作者:铁锚 我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...
随机推荐
- qt5--树形控件QTreeWidget
需要 #include <QTreeWidget> #include <QTreeWidgetItem> #include " ...
- 18-Node.js学习笔记-Express-请求处理-构建模块化路由
构建模块化路由 const express = require('express') //创建路由对象 const home = express.Router(); //将路由和请求路径进行匹配 ap ...
- vue 项目, 通知子组件更新,父组件中每次点击按钮重新加载子组件,(重新生成dom 元素)
vue是组件化开发的项目,很多情况下会把公共组件提取出来,来减少代码量,提高开发效率,和以后更好的可维护性.很多情况下,父组件中都会引用子组件这种情况.通过给在父组件中引用的子组件标签上添加属性,来渲 ...
- 基于nc命令监控服务端口的Shell脚本
Shell代码: #!/bin/bash export LANG=en_US.UTF- #IP Address=127.0.0.1 #Port Port= #尝试的次数 n= #nc timeout, ...
- 51 Nod 不重叠的线段
#include<bits/stdc++.h> #define in(X) scanf("%d",&X) #define out(X) printf(" ...
- jQuery_替换操作
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- 浏览器使用小tip
谷歌浏览器截取长图 很多网页长图单个页面截不下来,那么需要如何解决? 首先,在谷歌浏览器chrome中打开需要截图的网页,等待需要截图的网页打开完毕,然后按F12 打开开发者工具,然后按组合键 Ctr ...
- 将JDBC查询出的数据转化为json格式返回
使用JDBC,json工具使用的org.json /** * ResultSet转JSON * * @param rs * @return * @throws SQLException * @thro ...
- Python中的不可变对象类型与可变对象类型
https://blog.csdn.net/answer3lin/article/details/86430074 其实各个标准资料中没有说明Python有值类型和引用类型的分类,这个分类一般是C++ ...
- python利器之切片
切片 切片的语法表达式为:[start_index : end_index : step],其中: start_index表示起始索引 end_index表示结束索引 step表示步长,步长不能为0 ...