shell编程之给变量赋值的五种⽅法
1.  Shell中的变量类型
Shell中的变量可以分为环境变量、位置变量、预定义的特殊变量以及⽤户⾃定义变量、
<!--[if !supportLists]-->2.  <!--[endif]-->环境变量
Shell中的环境变量是⼀类Shell预定义变量,是⽤于设置系统运⾏环境的变量,环境变量由系统统⼀命名。部分系统变量的值由系统设定,部分环境变量的值可以由⽤户给定。
环境变量的名称由⼤写字母组成,常⽤的Shell环境变量如下所⽰:
HOME: ⽤户主⽬录的全路径名,cd $HOME 即可切换到⽤户的主⽬录
PATH:类似于windows下的路径,Shell会在⾥⾯依次寻⼆进制的可执⾏⽂件。
echo $PATH可以显⽰当前的PATH,添加新的PATH⽅法 $PATH=$PATH:新PATH
TERM:  终端类型 echo $TERM
PS1:  提⽰符,root⽤户默认为#,普通⽤户默认为$
SHELL: Shell解释器的绝对路径
LOGNAME: 登录⽤户的⽤户名
UID:当前⽤户的UID    echo $UID
<!--[if !supportLists]-->3.  <!--[endif]-->位置变量
位置变量是根据出现在命令⾏上的参数的位置确定的变量,在调⽤Shell程序的命令⾏中,参数的位置定义如下所⽰。
$命令参数1  参数2  参数3
其中  $0  对应执⾏的命令名
$1  对应参数1
$2  对应参数2
$3  对应参数3
(⼀定要搞清楚顺序!!)
<!--[if !supportLists]-->4.  <!--[endif]-->预定义的特殊变量
预定义的特殊变量有着特殊的含义,⽤户不可以更改,所有的预定义变量都由“$”符号和另外⼀个符号组成,常⽤的预定义特殊变量如下所⽰
$#:位置参数个数(不包括Shell脚本名)
$*:  位置参数组成的字符串
$!:  上⼀个后台命令对应的进程号
$?:  上⼀个命令的退出状态,为⼗进制数字,如果返回为0,则代表执⾏成功。
$$:  当前的进程号PID
<!--[if !supportLists]-->5.  <!--[endif]-->⽤户⾃定义变量(⼤⼩写敏感)
要求:变量名由字母或者下划线开头,后⾯跟任意数量的字母、数字、下划线。
合法的:
_name    SIZE    my_idea
⾮法的:
2god      !name  hello&world
<!--[if !supportLists]-->6.  <!--[endif]-->变量的创建
有两个内置的命令declare 和 typeset 可⽤于创建变量。通过命令的选项设置还可以设定变量的创建⽅。
除了使⽤内置命令来创建和设置变量外,还可以直接赋值,格式为:
变量名=变量值
注意:变量名前⾯不应加美元“$”符号。(和PHP不同)
等号“=”前后不可以有空格。
和C语⾔不同,Shell中不需要显式的语法来声明变量。
变量名不可以直接和其他字符相连,如果想相连,必须⽤括号:echo “this is $(he)llo!”
<!--[if !supportLists]-->7.  <!--[endif]-->变量的删除
系统提供unset命令可以删除变量,例如
unset  name
<!--[if !supportLists]-->8.  <!--[endif]-->变量的赋值
变量的赋值有五种:使⽤read命令,直接赋值,使⽤命令⾏参数,使⽤命令⾏的输出结果,从⽂件读取。
先说⼀下从read命令吧:(主要是在需要交互时使⽤)
Read命令是系统内置命令,语法格式为:
read  变量1  变量2
当Shell脚本执⾏到read命令时,将暂停脚本的执⾏并等待键盘的输⼊,当⽤户输⼊完毕并且敲下回车之后,将完成赋值操作,脚本继续执⾏。
Read指令的规则:
<!--[if !supportLists]-->l  <!--[endif]-->多个数据或变量之间⽤空格隔开
<!--[if !supportLists]-->l  <!--[endif]-->若变量个数与数据个数相等时,对应取值
<!--[if !supportLists]-->l  <!--[endif]-->若变量个数⼤于数据个数时,没有输⼊数据的变量取空值
<!--[if !supportLists]-->l  <!--[endif]-->若变量个数⼩于数据个数时,将多余的数据赋给最后⼀个变量(也就是把空格当成字符串处理)
例⼦:
#!/bin/bash
echo –n “ please enter your name”  //-n 表⽰⽤户输⼊和提⽰信息在同⼀⾏
read name
echo “your name is $name”
#!/bin/bash
echo “Please  enter  your  first name  and last name :”
read first last
shell脚本返回执行结果
echo “your first name is $first”
echo “your last name is $last”
第⼆种赋值⽅法就是直接给变量赋值(这种赋值⽅法主要是在不需要交互时,并且参数不需要修改时使⽤)
例如:name=xiaosu
gender=man
第三种赋值⽅法是使⽤命令⾏参数赋值。(这种赋值⽅法是参数需要经常变化,并且不需要交互时使⽤)
这种赋值⽅法,也就是直接在命令后⾯跟参数,然后系统⽤$1来引⽤第⼀个参数。
第四种⽅法是利⽤命令的输出结果赋值(这种赋值⽅法可以直接处理上个命令产⽣的数据)
在Shell程序中,可以将⼀个命令的输出结果来当做变量,不过需要在赋值语句中使⽤反引号
例如currentdir=`pwd`
echo $currentdir
最后⼀种赋值⽅法是从⽂件中读⼊数据
这种⽅式就适合处理⼤批量的数据,直接把相应的数据写⼊⽂件,然后运⾏脚本即可。
通常是通过while循环⼀⾏⾏读⼊数据,即没循环⼀次,就从⽂件中读取⼀⾏数据,直到读取到⽂件的结尾。
例如:
#!/bin/bash
ls *.sh >execfile
while read LINE
do
chmod a+x $LINE
done<execfile
这个脚本使⽤了while..do..done 结构,最后⼀⾏表⽰从⽂件execfile读取数据。while read LINE表⽰每次循环读⼊⼀⾏数据并赋值给变量LINE。
<!--[if !supportLists]-->9.  <!--[endif]-->变量的输出
最简单的⽅法就是使⽤echo
如果想输出格式化的字符串,就需要使⽤printf,⽤法和C语⾔类似
printf 命令的格式说明符
\”    输出双引号
\\    输出反斜杠
\a    响铃
\n    换⾏
\r    回车