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. linux网络编程之TCP/IP基础

    (一):TCP/IP协议栈与数据包封装 一.ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organi ...

  2. PHP商城购物车类

    <?php /* 购物车类 */ // session_start(); class Cart { //定义一个数组来保存购物车商品 private $iteams; private stati ...

  3. DoTween学习笔记(二) UGUI结合使用(实现一些简单效果)

    UGUI官方实例中是使用Animation来控制UI的移动,放大缩小动画等等, Animation来控制UI的动画工作量实在是太多了, 所以我们一般使用itween,DoTween. 来控制动画, 这 ...

  4. xcode5下面安装Command Line Tools

    运行命令 sudo xcode-select --install 就会显示一行文字,并且弹出一个对话框,确认安装后他就会自己下载来安装了. 至此,Command Line Tools就能够重新复活了

  5. Swift基础--使用TableViewController自定义列表

    首先建立一个swift项目,把storyboard的内容删掉,添加一个 Navigation Controller,然后设置storyboard对应界面的class,在Navigation Contr ...

  6. Git服务器 gitweb与gitLab的区别

    昨天我们已经把Git服务器搭建完成了,工程的上传与下载都可以了,不过有些人不喜欢使用git命令进行操作.所以我们就搭建一个可视化操作的环境!配置gitweb和gitlab两种访问方式! 一,配置git ...

  7. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  8. 2016 ACM/ICPC Asia Regional Shenyang Online

    I:QSC and Master 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意: 给出n对数keyi,vali表示当前这对数的键值和权值 ...

  9. 利用MetaWeblog API 自制博客发布小工具

    博客园提供了诸多数据接口, 利用这些接口可以很容易的实现博客的发布,修改,删除等 1.需要引用一个DLL:为CookComputing.XmlRpcV2 2.新建一个类,在其中是一些要实现的东西,如: ...

  10. c#修改本地连接工具 ip地址,dns,网关,子网掩码

    //Form1类后台     #region 加载配置文件中的信息        /// <summary>        /// 加载配置文件中的信息        /// </s ...