Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量。有三种主要的变量类型:环境变量、内部变量和用户变量。

  • 环境变量(environment variable)是系统环境的一部分,不必去定义它们。可以在shell程序中使用它们,某些变量(比如PATH)还能在shell中加以修改。
  • 内部变量(built-in variable)是由系统提供的。与环境变量不同,你不能修改它们。
  • 用户变量(user variable)是你在编写shell脚本时定义的。可以在shell程序内任意使用它们和修改它们。

shell编程和其他编程语言的主要不同之处是:在shell编程中,变量是非类型性质的。也就是说,不必指定变量是数字还是字符串。

用户变量

Shell编程中,使用用户变量无需事先声明,同时变量名的命名须遵循如下规则:

1). 首个字符必须为字母(a-z,A-Z);
2). 中间不能有空格,可以使用下划线(_) ;
3). 不能使用标点符号 ;
4). 不能使用bash里的关键字(可用help命令查看保留关键字) 。

变量赋值

变量赋值的格式:

变量名=值

访问变量值

要取用一个变量的值,只需在变量名前面加一个$ 。

( ATTENTION: Don't keep blank between the variable with the equal operator '=' )

举例

#!/bin/bash
# 对变量赋值:
a="hello world"  #等号两边均不能有空格存在

# 打印变量a的值:
echo -e "A is: $a\n"

备注:

1). bash中变量赋值,等号两边均不能有空格存在;

使用自己喜欢的编辑器,输入上述内容,并保存为文件test_hello.bsh,然后执行 chmod +x test_hello.bsh使其具有执行权限,最后输入 ./test_hello或bash test_hello.bsh执行该脚本。

程序运行结果:

A is: hello world

有时候变量名可能会和其它文字混淆,比如:

num=1
echo "this is the $numst"

上述脚本并不会输出"this is the 1st"而是"this is the ";

这是由于shell会去搜索变量numnd的值,而实际上这个变量并未赋值。

我们可以用花括号来告诉shell把num变量跟其他部分分开:

num=1
echo "this is the ${num}st"

程序运行结果:

this is the 1st

位置参数

可以编写一个shell脚本,当从命令行或者从其他shell脚本中调用它的时候,这个脚本接受若干参数。这些选项是通过Linux作为位置参数
(position
parameter)提供给shell程序的。位置参数有由系统给出的专用名。存放在变量中的第一个参数名为1(数字1),在程序内可以使用$1来访问;
存放在变量中的第二个参数名为2,在程序中可以使用$2来访问,依此类推。在调用shell程序时,可以省略一个或几个数字大的位置 参数。

例如,如果shell程序mypgm1要求两个参数(比如名字和姓氏),那么可以只用一个参数(名字)来调用这个shell程序。但是,你不能只用第二个参数(姓氏)来调用shell程序。

  1. #!/bin/bash
  2. #name display program
  3. if [ $# -eq 0 ]; then
  4. echo "Name not provided."
  5. else
  6. echo "Your name is $1."
  7. fi

在bash中,可以像下面 这样执行mypgm1:

  1. # . mypgm1

那么会得到下面的输出:
Name not provided.
但是,如果像下面这样执行mypgm1:

  1. # . mypgm1 david

那么会得到下面的输出:
Your name is david.
shell程序mypgm1还说明了shell编程的另一个方面,即内部变量。在mypgm1中,变量$#是一个内部变量,它提供传送给这个shell程序的位置参数的数量。

内部变量

内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

部分内部变量总结如下:

表 1.1. 常用内部变量

$0 相当于C语言main函数的argv[0]
$1$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]argv[2]...
$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$? 上一条命令的Exit Status
$$ 当前Shell的进程号

为了说明这些变量的用法,这里有一个叫做mypgm2的示范程序:

  1. #!/bin/bash
  2. #my test program
  3. echo "Number of parameter is $#"
  4. echo "Program name is $0"
  5. echo "Parameters as a single string is $*"

在bash中,如果从命令行上执行mypgm2,如下所示:

  1. # . mypgm2 David Victor

那么会得到下面的结果:

    1. Number of parameters is 2
    2. Program name is mypgm2
    3. Parameters as a single string is David Victor

Linux —— Shell编程之变量赋值和引用的更多相关文章

  1. Linux Shell编程、变量、控制语句

    为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理. 2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些 ...

  2. linux shell编程之变量和bash配置文件(第一篇)

    编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不用 ...

  3. shell编程之变量赋值

    1.变量赋值: name=lbg 等号前后不能有空格 name="Lebron James" 变量值中有空格要用双引号 echo ${name} 用${}更保险 shopt -s ...

  4. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...

  5. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  6. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  7. 一文学完Linux Shell编程,比书都好懂

    一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...

  8. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  9. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

随机推荐

  1. 游标的使用实例(Sqlserver版本)

    游标,如果是之前给我说这个概念,我的脑子有二个想法:1.你牛:2.我不会 不会不是理由,更不是借口,于是便要学习,本人属性喜欢看代码,不喜欢看书的人,所以嘛,文字对我没有吸引力:闲话少说啊,给大家提供 ...

  2. poj 3684 Physics Experiment(数学,物理)

    Description Simon ), the first ball is released and falls down due to the gravity. After that, the b ...

  3. 绩效等级系统与MBO

    1. 目标管理(MBO)在一定时期内(一般为一年)组织活动的期望成果,是组织使命在一定时期内的具体化,是衡量组织活动有效性的标准.由于组织活动个体活动的有机叠加,因此只有各个员工.各个部门的工作对组织 ...

  4. linux指定动态运行库的位置

    动态运行库在windows.linux下均广泛使用.windows下通常为dll文件,linux下为so文件.不过,对于部署程序,这两个系统查找依赖的运行库文件时却不一样.对于windows而言,优先 ...

  5. VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称

    1. 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4. 而我原来的设置是.NET Framework 4 Client Pro ...

  6. qt model/view 架构基础介绍之QTableWidget

    # -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...

  7. iOS-网络编程(一)HTTP协议

    一. 网络编程基础 在移动互联网时代,几乎所有应用都需要用到网络,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力.一个好的移动网络应用不仅要有良好的UI和良好的用户体验也要具备实时更 ...

  8. BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并

    题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...

  9. 一个用 Cumulative Penalty 培训 L1 正规 Log-linear 型号随机梯度下降

      Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之中的一个.其训练常採用最大似然准则.且为防止过拟合,往往在目标函数中增加(能够产生稀疏性的) L1 正则.但对于 ...

  10. 机器学习实战笔记5(logistic回归)

    1:简单概念描写叙述 如果如今有一些数据点,我们用一条直线对这些点进行拟合(改线称为最佳拟合直线),这个拟合过程就称为回归.训练分类器就是为了寻找最佳拟合參数,使用的是最优化算法. 基于sigmoid ...