既然是变量,自然分变量名和变量值,在使用的时候一定要注意哪些地方需要用变量名,哪些地方需要用变量的值。

自定义变量

shell变量不需要声明,随用随定义,给变量赋值的时候要注意

  • shell是空格敏感的
  • 使用{}确定变量的范围是个好习惯
$NEWENV =123                #等号前面有空格,不行
NEWENV: command not found
$NEWENV= 123 #等号后面有空格,不行
123: command not found
$NEWENV=123 #RIGHT
$BRACE=123
$echo $BRACEEEE $echo ${BRACE}EEE
123EEE

位置变量

指shell脚本的命令参数,shell script将执行的命令放在存储在0,命令之后的参数依次存储在1,2...,可以通过取值(eg$0)利用这些变量,就可以编写带参数的脚本,当参数值大于9时,需要使用{}括起来,否则$10就相当于在$1之后加了字符0。注意,定义函数的参数列表也使用$1, $2 etc,注意与命令行的参数相区分,函数内的$1etc是用来传参的,但$0还是保持原来的含义

$cat ./shell.sh
#!/bin/bash
echo "$10"
echo "${10}"
$./*.sh 11 22 33 44 55 66 77 88 99 00
110
00

内嵌变量

#

目前进程的参数个数,可以通过$# 获得其值,多用在循环中

 while [ $# != 0 ]
do
case $1 in
...
esac
shift
done

@

传递给当前进程的命令行参数,如果置于双引号内,会展开为个别的参数, $@ 代表命令后接的每一个参数字符串,类似"$1", "$2", "$3". 否则和$*都是一样的。

*

当前进程的命令行参数,$* 代表命令后接的参数的集合字符串,类似"$1c$2c$3", c为分隔符,默认为空格键,加上" "表示一个字符串,不加和$@一样, 这两个参数可以用来将参数传递给其他脚本或函数

$cat ./shell.sh
#!/bin/bash
my(){
echo $#
}
echo "$(my $@)"
echo "$(my "$@")"
echo "$(my $*)"
echo "$(my "$*")"
$./*.sh 11 "22 33" 44
4
3
4
1

-

在引用时给予shell的选项

?

  • 前一个命令的退出状态,$?IMPORTANT,只和上一条命令有关
  • 如果上一条命令的执行成功,里面的值是0,否则里面的值是一个正数
  • 上一条test语句的返回结果,如果test结果为真,则为0,如果test结果为假,则为1
  • shell的函数的返回值只能使用$?接收

$

shell的进程编号(PID),可以通过$$获得其值

$echo $$
3730

最近一个后台命令的进程编号,以此方式存储进程编号,即在终端中的histroy命令,可通过wait供之后使用

环境变量

我们所执行的任何一个程序,都是由父进程fork出来的一个子进程,子进程结束之后,将返回发哦父进程中去,当子进程被产生的时候,将会从父进程那里获得一定的资源分配,以及(更重要的是)继承父进程的环境。环境变量就是传递给子进程的变量,"遗传性"是区分本地变量和环境变量的决定性指针,环境变量只能从父进程到子进程单向继承,换句话说,在子进程中的环境如何变更,均不会影响父进程的环境。下面是几个比较常用的缺省继承环境变量的值,当前终端下更多环境变量的值可以使用export -p查看

ENV

一般引用则仅用于交互式shell中,展开为读取和启动时要执行的第一个文件的完整路径名称

HOME

表示家目录

IPS

分隔符,默认为空格,tab和换行

LINENO

刚执行过的行在脚本或函数的行编号

PPID

父进程的PID

PS1

主要的命令提示符,默认是$

PS2

行继续的命令提示符,默认是>

PS4

set +x 设置的执行跟踪的提示字符串,默认是+

PWD

当前的工作目录

$echo $LANG
en_AU.UTF-8
$echo "$LINENO"
8
$echo "$PATH"
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/linux/toolchain/gcc-4.6.4/bin:.
$echo "$PPID"
2647
$ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
linux 2647 0.0 2.2 110152 11540 ? Rl 07:51 0:01 gnome-terminal
$echo "$PWD"
/home/linux

数组

shell使用形如arr=(var1 var2...)的形式定义,即元素使用空格分开,使用${arr[n]}访问数组编号为n的元素

$arr=(0 1 2 var)
$echo "${arr[0]}"
0
$echo "${arr[3]}"
var

我们也可以对元素进行单独赋值

$arr[3]=qq
$echo "${arr[3]}"
qq

显示数组的所有元素

$echo "${arr[@]}"
0 1 2 qq
$echo "${arr[*]}"
0 1 2 qq

显示数组中元素的个数

$echo "${#arr[@]}"
4
$echo "${#arr[*]}"
4

shell脚本变量的更多相关文章

  1. SHELL脚本--变量(基础)

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$ ...

  2. shell脚本--变量与数组

    Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量 本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用. 普通变量 ...

  3. SHELL脚本--变量

    环境变量 环境变量就是运行在"环境"上下文的,在这个上下文都可以引用.例如,常见的cd.ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环 ...

  4. shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义

    本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...

  5. shell脚本变量定义注意别跟系统变量重名了……

    写了个很简单的脚本,执行结果却很奇怪.   1 #!/bin/bash PATH=$HOME/vlc_transplant4 rm -f $PATH/vlc ln -s $PATH/bin/vlc-s ...

  6. Shell脚本变量与判断

    变量 环境变量 局部变量 declare 定义变量类型 本地变量 local 在函数中使用 变量类型: 数值型: 1.整形 2.浮点型 3.布尔型 0 1 (真 假) (true false) 字符串 ...

  7. shell脚本变量的参数

    https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables mkdir f ...

  8. shell 脚本 变量使用,取消一个变量,echo

    1. 用户自定义变量,直接使用,赋值的时候等号两边不能有空格 A=100 echo "\$A = $A" # $是取变量A 中的值 "" 号中 \$ 是转译,此 ...

  9. 《Linux命令行与shell脚本编程大全》 第六章环境变量

    很多程序和脚本都通过环境变量来获取系统信息.存储临时数据和配置信息. 6.1 什么是环境变量: bash shell用一个叫环境变量(environment variable)的特性来存储有关shel ...

随机推荐

  1. springmvc 配置多视图,返回jsp,velocity,freeMarker,tiles(模板)等等

    springmvc-servlet.xml配置 <!-- Velocity --> <bean id="velocityViewResolver" class = ...

  2. 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...

  3. Discuz X2任务开发

    简单描述 由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到: 1.由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中完成指定的试题[1] ...

  4. java 编译时的初始化顺序

    有的时候,java的初始化会对我的工作照成很大影响,所以简单介绍一下, 首先介绍简单的变量的初始化:在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量定义散布于方法定义之间,它也会先于构造器和 ...

  5. PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引

    一.框架的由来  快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.N ...

  6. java内存模型-final

    与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问.对于final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个 final 域的写入,与随后把 ...

  7. Hibernate框架(未完待续······)

        作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...

  8. 经典网页设计:20个华丽的 iPhone 应用程序演示网站

    一个物品销售很好,重要的原因之一是它的包装,因为这是最重要的细节,可以把一个人转变成购买者.一个好的包装设计和良好的表现比产品本身更重要,因此被分配了大量的金钱和资源,以创造伟大的东西. 因此,为了销 ...

  9. windows 端口 任务

  10. 编写jquery常用插件的基本格式

    写jquery插件需要明白的那些知识点 1.jquery中$是神马?$.fn又是神马? 稍微有jquery经验的都知道在jquery中$等价于jQuery,在控制台一试便知: 我们在jquery(1. ...