Linux学习(三)-Shell变量

Shell的变量功能。

赋值与打印

1
2
myname=clearbug
echo $myname

取消变量

1
unset myname

从键盘读取用户输入

语法:

1
2
3
4
read [-pt] variable
选项与参数:
-p : 后面可以接提示字符!
-t : 后面可以接等待时间(秒数)!

单引号和双引号

1
2
langinfo1="lang is $LANG" //lang is en_US
langinfo2='lang is $LANG' //lang is $LANG

跳脱字符

跳脱字符即反斜杠(不应该叫做转义字符吗?),它可以将特殊符号(如[Enter],$,\,空格符,’等)变成一般字符。

1
2
name=clearbug\'s\ name //需要转义单引号和空格符号
name="clearbug's name"

命令嵌套

在一条命令中使用其他命令的正确姿势:

1
2
version=$(uname -r)
version=`uname -r`

变量拼接

1
2
3
path=$PATH:/home/bin
path="$PATH":/home/bin
path=${PATH}:/home/bin

不得不说拼接的方式好简单,连”+”都省了。

公约

一般使用大写字符的变量为系统变量,用户自定义变量一般使用小写字符。

环境变量

一般情况下定义的变量只能在自身bash环境中使用,如果还需要在子程序中使用,则需要将这个变量置为环境变量(也可以说是全局变量):

1
export myname

那么,如果查看所有的环境变量呢:

1
env

或者

1
export

又怎么查看所有的非环境变量呢:

1
set

但是这个命令不光会打印出非环境变量,还会打印出环境变量。这就蛋疼了,还没找到只打印出非环境变量的命令。

declare

语法:

1
2
3
4
5
6
7
declare [-aixr] variable
选项与参数:
: 没有参数,效果跟set一样
-a : 将variable定义为数组类型
-i : 将variable定义为整数数字类型(要知道shell里没有浮点数类型)
-x : 将variable定义为环境变量
-r : 将variable定义为readonly类型,该变量内容不可更改,也不能unset

例子:

1
2
declare -x sum //将sum定义为环境变量
declare +x sum //将sum定义为自定义变量

数组的使用:

1
2
3
4
var[1]="small ming"
var[2]="big ming"
var[3]="nice ming"
echo "${var[1]},${var[2]},${var[3]}"

子程序

概念:在目前这个shell里面去激活另外一个shell,则新的shell就是子程序。
姿势:

1
2
3
bash //激活新shell
echo $myname
exit //回到原来的shell

子shell与原shell之间具体有什么关联呢?目前所知:

  1. 子程序会继承父程序的环境变量,不会继承父程序的自定义变量;
    这里继承的具体实现:父程序和子程序都会有一块专用的内存区域保存各自环境变量的值,子程序继承了父程序环境变量的值的真相是:子程序在创建的时候直接复制了父程序中的环境变量的值到自己的内存区。所以在子程序中修改了从父程序中继承的环境变量的值,但并不会影响到父程序中的环境变量。