王的男人
分类: LINUX
2013-03-29 22:20:37
1)Linux shell 的变量在使用前不需要进行类型声明就可以直接赋值;1, 查看与系统相关的环境变量:
2)Linux shell 里面所有变量都是以字符串的形式保存;
3)Linux shell 里面有许多特殊的隐藏变量,他们被 shell 或者操作系统自身所引用,被称之为环境变量;
每一个进程在启动的时候,系统会把环境变量传递给这个进程。
1.1 在 linux shell 中查看系统环境变量可以使用 env 命令:
1.2 在 linux shell 中查看与指定进程相关的环境变量:
- #启动一个进程 gedit
- gedit&
- #查看该进程的进程号 (PID)
- pgrep gedit
- #查看与该进程相关的环境
- ls /proc/$PID/
- #查看与该进程相关的环境变量
- cat /proc/$PID/environ
由上面的操作可以看到与进程相关的环境变量以 name=value 的格式输出,并且所有的变量都没有换行地接连输出;
事实上每个环境变量都是一个以'\0'结尾的字符串;
如果我们把 '\0' 替换成 '\n' , 每个环境变量输出的结束都会换行;
我们可以使用 'tr' 命令完成替换的操作:
2,Shell 变量的赋值:
2.1 Shell 变量的赋值:
变量的赋值操作方式如下:
- var=value
var 是变量名,value 为变量值;
如果变量值不包含任何空格字符,可以直接赋值给变量;
如果变量值包含空格字符,则必须包括在双引号 "" 或者单引号 '' 内;
3, Shell 变量的引用:如:
- var="Hello world."
1)$var ,在变量前面加 "$" 符号;
2)${var} ,使用 "$" 符号prefix的同时,使用 {} 把变量包括起来;
3.1 experiment:
- var="value";
- echo $var;
- echo ${var};
- var="\$HOME:$HOME \$UID:$UID";
- echo ${var};
如红框所示,如果变量值里面包括有空格,则必须使用双引号或者单引号把变量包起来在对变量赋值;
note :
var=value 与 var = value 是不一样的操作;
前者是赋值操作,后者则是比较操作;
3.2 在 printf 或者 echo 的双引号输出信息中引用变量:
- fruit=apple;
- count=5.12345;
- echo "There are $count $fruit(s)";
- printf "\e[1;31mThere are %-5.2f %ss.\e[0m\n" $count $fruit;
3.3 在通过变量获取变量值的字符串长度:
- echo -e "\e[1;32mLength of PATH is: ${#PATH} .\e[0m";
- printf "\e[1;33mPrintf the length of PATH is: %5d .\e[0m\n" ${#PATH};
- printf "\e[1;33mPrintf the length of PATH is: ${#PATH} .\e[0m\n";
通过在 ${#var} 的形式引用变量,获取变量值的字符串长度
4.1 查看当前使用的 shell :
- echo "\$SHELL == $SHELL";
- echo "\$BASH == $BASH";
- echo "\$0 == $0";
- echo "\$UID == $UID";
note:
1)$SHELL 与 $BASH 是系统环境变量标识当前使用的 shell 是什么,如图所示,当期使用的是 bash ;
2)$0 是系统传入当前 shell 的第一个变量,也即是当前 shell 的执行程序;
如上图所示,因为是在一个名为 “01variables.sh” 的脚本文件里面执行,所以 $0 为 “01variables.sh”;
如果在 shell 中直接执行 echo $0 则输出为当前的 shell 程序的名称,如下图所示:
4.2 校验当前用户是否超级用户:
- if [ $UID -ne 0 ]; then
- printf "\e[1;31mRunning as %s,please run as root!\e[0m\n" $UID;
- else
- printf "\e[1;32mRunning as root.\e[0m\n";
- fi
note:
1)因为 $UID 是当前 shell 用户的用户 ID ,并且 root 用户的用户ID是 0 ,所以只要校验当前shell的 $UID 环境变量就可以知道当前shell的用户是否超级用户。