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. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  2. sem_timedwait的用法

    #include <semaphore.h> int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); Link ...

  3. Python多进程(multiprocessing)

    Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...

  4. PC-CSS-默认字体样式

    字体样式:Arial:字体大小:12px;行高:1.5倍:

  5. CBitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...

  6. linux下git使用记录1 git 提交

    linux下git使用记录1   浏览:985 发布日期:2013/08/08 分类:技术分享 在使用github的时候,不可避免的接触到了git,用他来更新项目,做版本控制.这里特别把常用的命令记录 ...

  7. [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写

    第十七章 使用BIOS进行键盘输入和磁盘读写 17.1 int 9 中断例程对键盘输入的处理 17.2 int 16 读取键盘缓存区 mov ah,0 int 16h 结果:(ah)=扫描码,(al) ...

  8. HTML5-常见的事件- beforeunload事件

    当我们在日常访问某些网站时,关闭当前网页时出现如下提示: beforeunload 事件就可以完成这样的事情,该事件发生时机:页面卸载之前,可以通过它来取消卸载并继续使用原有页面. 为了显示上面弹出对 ...

  9. SQL Server无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法

    用windows验证方式进入Management Studio, 安全性 > 用户名 > 右击sa > 属性 > 把默认数据库选“master”

  10. C++服务器设计(零):总体设计

    这个系列把毕业论文的部分贴了出来,以作保存留念.整个系列分为三大部分,其中第一章到第三章是介绍服务器的系统层设计,设计思路参考了libevent和muduo等开源代码的实现:第四章到第六章是介绍服务器 ...