深入浅出Shell编程: Shell 变量【ZT】
1 系统变量
Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量
表示方法 | 描述 |
---|---|
$n | $1 表示第一个参数,$2 表示第二个参数 ... |
$# | 命令行参数的个数 |
$0 | 当前程序的名称 |
$? | 前一个命令或函数的返回码 |
$* | 以"参数1 参数2 ... " 形式保存所有参数 |
$@ | 以"参数1" "参数2" ... 形式保存所有参数 |
$$ | 本程序的(进程ID号)PID |
$! | 上一个命令的PID |
其中使用得比较多得是 $n $# $0 $? ,看看下面的例子: BeautifierPlugin Error: Unable to handle "bash" syntax.
#!/bin/sh #This file is used to explain the shell system variable. echo "the number of parameter is $# "; echo "the return code of last command is $?"; echo "the script name is $0 "; echo "the parameters are $* "; echo "\$1 = $1 ; \$2 = $2 ";
下面是运行结果:
BeautifierPlugin Error: Unable to handle "bash" syntax.
-bash-2.05b$ ./chapter2.1.sh winter stlchina the number of parameter is 2 the return code of last command is 0 the script name is ./chapter2.1.sh the parameters are winter stlchina $1 = winter ; $2 = stlchina
这个例子太简单了,一点也不实用,下面来个实用的,如果你看不懂,没有关系,后面的内容会有详细解释。 BeautifierPlugin Error: Unable to handle "bash" syntax.
#!/bin/sh if [ ] ; then echo "Usage: $0 string file"; exit 1; fi grep $1 $2 ; if [ ] ; then echo "Not Found \"$1\" in $2"; exit 1; fi echo "Found \"$1\" in $2";
上面的例子中使用了$0 $1 $2 $# $? 等变量,下面是程序的解释:
- 判断运行参数个数,如果不等于2,显示使用"用法帮助", 其中 $0 表示就是脚本自己。
- 用grep 在$2 文件中查找$1 字符串。
- 判断前一个命令运行后的返回值(一般成功都会返回0, 失败都会返回非0)。
- 如果没有成功显示没找到相关信息,否则显示找到了。
- 其中\"表示转义,在"" 里面还需要显示"号,则需要加上转义符\" .
下面运行的例子:
BeautifierPlugin Error: Unable to handle "bash" syntax.
./chapter2.2.sh usage chapter2.2.sh Not Found "usage" in chapter2.2.sh -bash-2.05b$ ./chapter2.2.sh Usage chapter2.2.sh echo "Usage: $0 string file"; Found "Usage" in chapter2.2.sh
2 Shell用户变量
2.1 基础
不管系统变量有多少,对于需求来说,总是不够的。用户变量是最常用到的变量,使用也十分简单。
用户定义的变量必须由字母数字及下划线组成,并且变量名的第一个字符不能为数字, 与其它UNIX名字一样,变量名是大小写敏感的. 对于用户变量,用户可按如下方式赋值: BeautifierPlugin Error: Unable to handle "bash" syntax.
name="Winter"
在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值,如: BeautifierPlugin Error: Unable to handle "bash" syntax.
name="Winter" WINTER=$name echo "Hello $WINTER !"
输出结果应该很清楚:Hello Winter !
这里需要注意一点:变量和'='之间不要有空格,'='和赋值也不要有空格,否则shell不会认为变量被定义。掌握了基本的使用方法,你可以完全开始你的编程工作了。不过有时候需要未雨绸缪,下面介绍用户变量的一些技巧。
2.2 使用技巧
也可以用变量和其他字符组成新的字,这时可能需要把变量用{}括起,如: BeautifierPlugin Error: Unable to handle "bash" syntax.
SAT=Satur echo Today is ${SAT}day
输出结果是: Today is Saturday
有时候为了避免变量名和别的字符产生混淆,你最好养成习惯把变量名用{}括起来。
对于未赋值的变量, Shell以空值对待, 用户也可以用unset命令清除给变量赋的值.看一个例子: BeautifierPlugin Error: Unable to handle "bash" syntax.
#!/bin/sh echo "a=$a" ; a=2 echo "a=$a" ; unset a echo "a=$a" ;
先猜猜结果是什么? BeautifierPlugin Error: Unable to handle "bash" syntax.
-bash-2.05b$ ./test.sh a= a=2 a=
如果你懂C++,你应该知道有个变量修饰符"const",用于避免程序一不小心对变量进行修改。在shell中,对于用户变量,你可以使用同样的修饰符"readonly", 如果我把上面的例子修改成这样: BeautifierPlugin Error: Unable to handle "bash" syntax.
#!/bin/sh echo "a=$a" ; #下面增加了readonly readonly a=2 echo "a=$a" ; unset a echo "a=$a" ;
其结果当然会不一样了: BeautifierPlugin Error: Unable to handle "bash" syntax.
-bash-2.05b$ ./test.sh a= a=2 a=2
2.3 shell 中的数组
shell变量中还能设置数组,但是不同的shell版本有不同数组赋值方法,而bourne shell 中不支持数组方式。因此,如果不是十分需要,还是建议你不要使用数组。若你的数据结构十分复杂,必须要使用数组,那么我建议你还是选择别的语言吧,shell不是万能的。
shell有两种赋值方式,第一种是直接用下标赋值: BeautifierPlugin Error: Unable to handle "bash" syntax.
name[0]="Tom" name[1]="Tomy" name[2]="John" ...
另一种方式对于不同的shell版本不一样。bash中赋值: BeautifierPlugin Error: Unable to handle "bash" syntax.
#!/usr/local/bin/bash name=("Tom" "Tomy" "John") for i in 0 1 2 do echo $i:${name[$i]} ; done;
上面两种赋值方式达到的效果一样。另外,你看见访问数组元素的方法了吗?使用${name[index]}的方式。注意第一行使用的是#!/usr/local/bin/bash, 和以前有些不一样哦。其输出结果是: BeautifierPlugin Error: Unable to handle "bash" syntax.
-bash-2.05b$ ./test.sh 0:Tom 1:Tomy 2:John
3 shell 环境变量
shell 环境变量是所有shell 程序都会接受的参数。shell程序运行时,都会接收一组变量,这组变量就是环境变量。常用的环境变量:
名称 | 描述 |
PATH | 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是, 当前目录不在系统路径里 |
HOME | 用户home目录的路径名,是cd命令的默认参数 |
COLUMNS | 定义了命令编辑模式下可使用命令行的长度 |
EDITOR | 默认的行编辑器 |
VISUAL | 默认的可视编辑器 |
FCEDIT | 命令fc使用的编辑器 |
HISTFILE | 命令历史文件 |
HISTSIZE | 命令历史文件中最多可包含的命令条数 |
HISTFILESIZE | 命令历史文件中包含的最大行数 |
IFS | 定义SHELL使用的分隔符 |
LOGNAME | 用户登录名 |
指向一个需要SHELL监视其修改时间的文件.当该文件修改后, SHELL将发消息You hava mail给用户 | |
MAILCHECK | SHELL检查MAIL文件的周期,单位是秒 |
MAILPATH | 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息 |
SHELL | SHELL的路径名 |
TERM | 终端类型 |
TMOUT | SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出 |
PROMPT_COMMAND | 指定在主命令提示符前应执行的命令 |
PS1 | 主命令提示符 |
PS2 | 二级命令提示符,命令执行过程中要求输入数据时用 |
PS3 | select的命令提示符 |
PS4 | 调试命令提示符 |
MANPATH | 寻找手册页的路径,以冒号分隔 |
LD_LIBRARY_PATH | 寻找库的路径,以冒号分隔 |
这些变量,要关注的最多的就是PATH, 其重要性不要我说了吧?
如果你希望把你定义的变量让其他所有的shell程序都能使用,也就是定义新的环境变量。你只要使用export关键词就可以了。例如: BeautifierPlugin Error: Unable to handle "bash" syntax.
export MY_NAME=Winter export PATH=/home/winter/bin:$PATH
上面的程序中,第一行输出MY_NAME变量,第二行是在环境变量PATH中增加一个路径/home/winter/bin 。如果你希望这些设置在你登陆unix/linux都有效,你需要把他们加入到你的shell启动脚本中, 如果是使用bash BeautifierPlugin Error: Unable to handle "bash" syntax.
~/.bash_profile
其他版本你看一眼就知道了,在你的home目录下,以"."开头的文件,一般都会隐藏起来,你需要使用'ls -al'命令来显示。
深入浅出Shell编程: Shell 变量【ZT】相关推荐
- Shell编程: Shell 变量
深入浅出Shell编程: Shell 变量 先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量.其中用户变量在编程过程中使用最多,系统变量在对参数 ...
- Linux学习——shell编程之变量
shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...
- linux系统——Shell编程之变量解释
linux系统--Shell编程之变量解释 - Shell能做什么 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略-) 自动化批量软件部署程序 (LAMP,LNMP,Tomca ...
- (二)shell编程之变量定义与使用
shell编程之变量定义与使用 SHELL编程模块课程目标 ① Shell的基本语法结构 如:变量定义.条件判断.循环语句(for.until.while).分支语句.函数和数组等: ② 基本正则表达 ...
- Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- SHELL编程之变量定义
SHELL编程 学习前奏 1. 文件处理工具 1.1 grep工具 1.2 cut工具 1.3 sort工具 1.4 uniq工具 1.5 tee工具 1.6 paste工具 1.7 tr工具 小试牛 ...
- linux写程序四则运算,Shell编程之变量及四则运算
Shell的学习目标 Shell的基本语法结构: 如:变量的定义.条件判断.循环语句(for.until.while).分支语句.函数和数组等. 基本正则表达式的应用 文件处理:grep.sed.aw ...
- Shell编程之变量
一 Bash变量与变量分类 Bash是Linux中的标准Shell,因此经常称Bash为Shell. 1. 变量命名规则 变量名可以由字母.数字.下划线组成,但必须以字母与下划线开头: 变量名的长度不 ...
- linux利用位置参数数组,Shell编程1_变量、参数和数组
目录 一.从变量开始 1.环境变量 export命令 2.系统自带的环境变量 3.变量的定义和赋值 二.使用参数 参数的获取 三.数组的基本使用 1.数组的定义 2.数组的删除 3.数组的切片和替换 ...
最新文章
- 90后大龄女考研二战失败 该何去何从
- ​软件推荐:17 款必备Chrome浏览器插件,值得一试!
- CentOS 7安装TigerVNC Server
- Hdu 1496 Equations
- oj2894(贝尔曼福特模板)
- [BI项目记]-搭建代码管理环境之客户端
- 第十三届蓝桥杯2022各组完整真题(可评测)
- Python字符串逆序输出
- 坚持#第303天~补起昨天的、顺便写今天的(昨天又在公司搞zabbix搞到了凌晨1点,结果搞忘了写博客),主要是zabbix监控
- 问题解决:系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的about_Execution_Policies
- 人体骨骼关键点检测综述
- Camera中onPreviewFrame()方法的视频方向旋转
- Python数学问题17:鸡兔同笼问题
- 基于stm32f407的示波器
- 01-RobotStudio新建系统
- 用jQuery打造个性网站
- waf和web应用防火墙的区别
- HTTP头注入漏洞测试(X-Forwarded-for)
- Hadoop、Spark、Storm对比
- FOC之park变换推导笔记
热门文章
- java web 抓取_java做web抓取
- http 阮一峰_互联网协议入门(二)
- 小区移动基站安全吗?会杀人于无形吗?
- M0最高优先级的中断设计
- 嵌入式·实时操作系统 xos介绍
- linux screen 命令是 ssh 的有效补充
- 火遍全网,却被广东人嫌弃!昔日“百亿网红”,快被打回原形了
- 罗永浩开了一家直播界的新东方
- 美团工程师回应“频繁定位”:常用App权限开启时检测结果基本一致
- 小鹏全新中大型SUV谍照曝光,智能驾驶+纯电SUV+睡眠舱?期待值拉满