shell脚本--变量与数组
Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量
本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用。
普通变量
注意事项:
- 变量名以英文字母或者下划线开头,但是不能以数字开头
- 变量名区分大小写
- 变量名与等号之间,等号与变量值之间不要有空格
- 只有在使用变量的值的时候,才在变量名之前加$,其他情况,比如删除、赋值、循环迭代都不用加$
- 如果一行只有一条命令,则每一行不用以分号结尾,每一条命令以换行分隔
- 如果一行有多条命令,则每一条命令以分号分隔,但建议每行只有一条命令
#!/bin/bash
#文件名:test.sh
name="beyond"
echo $name
执行脚本:
ubuntu@ubuntu:~$ ./test.sh
beyond
ubuntu@ubuntu:~$
有时候在使用变量的时候,变量名后面会跟着一些字符,如果这些字符与变量名之间没有间隔,那么,这些字符也将被认为是变量的一部分,即$nameHello,解释器回去找$nameHello,而不是找$name,可已使用两种方法,一种是使用空格分隔,另外一种使用花括号将变量名括起来(不要将$括起来)。如下例
#!/bin/bash
#文件名:test.sh
name="beyond"
echo "one",$name
echo "two",$nameHello
echo "three",$name hello
echo "four",${name}hell
执行脚本:
ubuntu@ubuntu:~$ ./test.sh
one,beyond
two,
three,beyond hello
four,beyondhell
从用户键盘读取数据并赋值给变量,使用:read [-p "提示信息"] 变量名
#!/bin/bash
#文件名:test.sh #输出一段话,并等待用户输入,输入的内容赋值给后面的变量
read -p "please input your name:" name
echo "welcome ${name}"
执行脚本:
ubuntu@ubuntu:~$ ./test.sh
please input your name:beyond
welcome beyond
ubuntu@ubuntu:~$
单引号与双引号的区别:
1、在单引号中,变量不能被解析;在双引号中变量可以被解析。
2、转义字符在单引号和双引号中都不会转义,反引号的作用是将反引号括起来的命令(括起来的内容会被当成命令执行),然后将结果赋值给一个变量。
注意,使用反引号将命令括起来之后,如果不将运行整个命令赋值给一个变量,那么就会将反引号中的命令的执行结果当成shell命令执行。
#!/bin/bash
#文件名:test.sh name="beyond"
#双引号括起来的变量能解析
echo one,"$name" #双引号括起来的变量不能解析,会输出变量名
echo two,'$name' #转义字符在单引号和双引号中都不会转义
echo three,"$name\t hello"
echo four,'$name\t hello' #echo `${name} \t hello`
#上面这条命令会出错,因为bash会将beyond \t hello当做shell命令执行 str=`echo $name \t hello`
echo $str str=`date`
#date是在命令行中获取当前时间
echo "current time is $str"
执行脚本:
ubuntu@ubuntu:~$ ./test.sh
one,beyond
two,$name
three,beyond\t hello
four,$name\t hello
beyond t hello
current time is 2018年 01月 07日 星期日 18:50:59 CST
变量的删除使用unset 变量名,注意此时变量名之前不要加$符号
#!/bin/bash
#文件名:test.sh name="beyond" echo one,"$name" //使用unset来删除变量
unset name echo $name
执行脚本:
ubuntu@ubuntu:~$ ./test.sh
one,beyond ubuntu@ubuntu:~$
位置变量:
咱们平时使用ls 查看当前目录下的文件时,常常会带-l -a -i等参数,这些参数就是位置变量,使用这些的方法:用$加数字(0-9)来获取,如果数字大于9时,则会使用数字的最高位所代表的位置变量,然后这个位置变量会拼接上数字剩下的部分,所以说shell命令行最多可以传递9个参数(如果参数过多,可以将多个参数连接为一个参数来扩充),也可以使用${11}来获取第11个位置参数。
#!/bin/bash
#文件名:test.sh
echo $0
echo $1," ",$2," ",$3," ",$4," ",$5
echo $6," ",$7," ",$8," ",$9," ",$10
echo $11," ",$12
执行脚本:
ubuntu@ubuntu:~$ ./test.sh a b c d e f g h i j k
./test.sh
a, ,b, ,c, ,d, ,e
f, ,g, ,h, ,i, ,a0
a1, ,a2
ubuntu@ubuntu:~$
预定义变量:
| 预定义变量名 | 含义 |
| $0或者${0} | 当前执行的进程名/脚本名/程序名 |
| $#或者${#} | 命令行中位置参数的总数量 |
| $*或者${*} | 所有位置参数的内容 |
| $?或者${?} | 上一条命令执行的返回结果,0表示正常,非0表示异常或出错 |
#!/bin/bash
#文件名:test.sh echo "进程名:"$0
echo "位置参数的数量:"$#
echo "所有位置参数的内容:"$* #执行一条非法语句,执行异常,返回非0
`echo "hello world"`
echo "上一条命令的执行结果:"$? #执行一条合法语句,正常运行完毕,返回0
str=`echo "hello world"`
echo "上一条命令的执行结果:"$?
执行脚本:
ubuntu@ubuntu:~$ ./test.sh a b c d e f g
进程名:./test.sh
位置参数的数量:7
所有位置参数的内容:a b c d e f g
./test.sh: line 8: hello: command not found
上一条命令的执行结果:127
上一条命令的执行结果:0
ubuntu@ubuntu:~$
数组
shell脚本--变量与数组的更多相关文章
- SHELL脚本编程-普通数组(列表)和关联数组(字典)
SHELL脚本编程-普通数组(列表)和关联数组(字典) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组相关概述 变量: 存储单个元素的内存空间 数组: 存储多个元素的连续的 ...
- shell脚本变量
既然是变量,自然分变量名和变量值,在使用的时候一定要注意哪些地方需要用变量名,哪些地方需要用变量的值. 自定义变量 shell变量不需要声明,随用随定义,给变量赋值的时候要注意 shell是空格敏感的 ...
- 如何在shell脚本中导出数组供子进程使用
功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删除环境变量 ...
- shell脚本函数与数组
前言 之前写过一篇关于shell脚本流程控制总结,这次继续写关于shell脚本的问题.本篇文章主要包含shell脚本中的函数以及数组的用法介绍.同时也涵盖了一些字符串处理以及shell脚本比较使用的小 ...
- shell脚本函数及数组
函数介绍: 函数function是由若干条shell命令组成的语句块,实现代码重用和模块话编程. 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部 ...
- SHELL脚本--变量(基础)
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$ ...
- SHELL脚本--变量
环境变量 环境变量就是运行在"环境"上下文的,在这个上下文都可以引用.例如,常见的cd.ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环 ...
- shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义
本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...
- Shell脚本变量与判断
变量 环境变量 局部变量 declare 定义变量类型 本地变量 local 在函数中使用 变量类型: 数值型: 1.整形 2.浮点型 3.布尔型 0 1 (真 假) (true false) 字符串 ...
随机推荐
- vue框架简介
MVVM框架概述 什么是vue 是一套构建用户界面的渐进式(用到哪一块就用哪一块,不需要全部用上)前端框架,Vue 的核心库只关注视图层 vue的兼容性 Vue.js 不支持 IE8 及其以下版本,因 ...
- Maven Dependency Scope
官方API描述 Dependency scope 是用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态. 自从2.0.9后,新增了1种,现在有了 ...
- 2080 特殊的质数肋骨 USACO (深度优先搜索)
农民约翰的母牛总是产生最好的肋骨. 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个 ...
- rman restore spfile from backup
spfile一般在$ORACLE_HOME/dbs(linux)目录,如果你丢失了spfile并不会引起实例立刻停掉,你的实例可以继续操作,尽管当你restore spfile的时候需要关闭重启实例, ...
- shell编程之转义和引用
shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本:另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义. 一.转义 转义是指使用 ...
- Linux系统学习之软件安装
一.源码包编译安装 由于计算机无法直接执行用高级语言编写的源程序,因此想要运行程序,就需要一种机制来让计算机识别,这样程序才可能运行起来.一般来说,计算机中存在解释型和编译型两种语言. 所谓解释型语言 ...
- 剑指offer.在O(1)时间内删除链表节点
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点.假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节 ...
- AS导入一个工程出现Error:please select Android SDK的错误
导入一个新的工程出现:Error:please select Android SDK 的错误 现象描述:点击运行程序按钮,弹出一个“Edit Configure”的对话框,最下面报:Error:ple ...
- JAVA中map的分类和各自的特性
java为数据结构中的映射定义了一个接口java.util.Map,他实现了四个类,分别是:HashMap,HashTable,LinkedHashMapTreeMap Map不允许键重复,但允许值重 ...
- 解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题
如果你的操作系统是Win7 64位,在运行Skyline6.5提供的ITE3DWindowEx控件实现多球对比时,启动程序调试运行时,却自动运行了TerraExplorer软件, 这时候你会发现for ...