1.shell中变量的定义和使用   

        你可在任何编程语言中使用变量,但是在脚本编程(shell)中它们是没有类型的简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。 

       Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。用$输出变量

       老生常谈,变量名命名方法:第一个字符为字母,其余字符可以是字母,数字或下划线,编程都一样。
       变量定义:不需要事先定义,直接赋值定义新变量,直接赋值修改原变量的值

0.变量引用:在变量名前加$号,代表变量内容
PATHTOMCAT=/usr/local/apache-tomcat-5.5.23  #上来就是变量名 ,赋值。
echo "path of tomcat is $PATHTOMCAT     #这里使用echo命令,回显。用$获取变量值
执行结果: path of tomcat is /usr/local/apache-tomcat-5.5.23
注:
1.定义变量时等号两侧不允许有多余的空格,如果有空格会报错。
[robot@hadoop103 ~]$ path1= 'abc'   #有空格,报错
bash: abc: command not found...
[robot@hadoop103 ~]$ path1='abc' 
[robot@hadoop103 ~]$ echo $path1
abc

2.定义变量时等号右侧的字符串中含有空格或者制表符,换行符时,要用引号将打算赋值的字符串括起 ,双引号内允许变量替换,而单引号内就不可以
  即shell定义字符串变量时字符串可以用单引号,也可以用双引号,也可以不用引号

单引号和双引号的区别

   str=yalong
  echo "The str is $str" >>  The str is yalong #双引号中的$str被其值yalong替换,即双引号允许变量替换
  echo 'The str is $str'  >>  The str is $str #单引号中的内容被原样输出,即单引号不允许变量替换。
  转义字符\
echo  "hello world" >>  hello world  #这里面双引号就是双引号,不输出
echo  \"hello world\" >> "hello world"  #输出双引号,这里用了转义字符\所以双引号失去了引号功能,成了字符串。

3.将linux命令返回值赋给变量(重要常用)

[robot@hadoop103 ~]$ echo aa=`date +%H`  #这里用的是反转义字符,esc下面的那个符号。
aa=23
[robot@hadoop103 ~]$ echo aa="date+%H" #这里用的是双引号,命令失效。

aa=date+%H

A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 小括号的功能等价于反引号  
A=`pwd`  & echo $A   
A=$(pwd)  $ echo $A

4.变量使用的常见误区错误

有时候变量名很容易与其他文字混淆,比如: num=2 echo "this is the $numnd"这并不会打印出"this is the 2nd",而仅仅打印"this is the ",
因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量: num=2 echo "this is the ${num}nd"
这将打印: this is the 2nd ··

注意这用的是{}来确定变量,不是(),用小括号不行,只能用花括号。括号的的功能等同于反引号``

5.变量的设置和查询

A=8       A=abc        定义变量A,可以多次定义,顺序执行
unset A       撤销变量A,unset用来删除变量,unset 命令不能删除只读变量。
变量被删除后不能再次使用。
实例
#!/bin/sh
myUrl="http://www.google.com"
unset myUrl
echo $myUrl
以上实例执行将没有任何输出。
readonly B=2  声明静态的变量B=2,不能unset,这种叫只读变量,变量值不可修改。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.baidu.com"
运行脚本,结果出错如下:
/bin/sh: NAME: This variable is read only.
export 变量名  可把变量提升为全局环境变量,可供其他shell程序使用,同样用echo$变量名,查询变量值
这也是环境变量要加export的原因,这样所有的用户都可以使用这个变量

export JAVA_HOME=/usr/local/jdk-7.01

6.位置参数变量和特殊变量(重要)

1.位置参数变量基本语法
       $n    (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
       $*    (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
       $@  (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
       $#    (功能描述:这个变量代表命令行中所有参数的个数)
2)案例计算输入的参数1和参数2的两个数的和,并输出到控制台
vi aaa.txt,脚本内容如下,然后执行脚本sh aaa.sh  1 2   
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值,执行脚本,输出的结果就是3.

2)打印输入的参数总数、所有参数
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数

3)$*与$@的区别
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
        do
        echo "The parameters is: $i"
        done
         x=1
        for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
        do
                echo "The parameter$x is: $y"
                x=$(( $x +1 ))
        done

a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数
b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输
出所有参数
注意:脚本可以嵌套。
------------------------------------------------------------------------------------------------------
2.预定义变量
1)基本语法:
  $? (功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决
定,则证明上一个命令执行不正确了。)
  $$  (功能描述:当前进程的进程号(PID))
  $!  (功能描述:后台运行的最后一个进程的进程号(PID))
2)案例
#!/bin/bash
#输出当前进程的PID,这个PID就是当前这个脚本执行时,生成的进程的PID
echo "The current process is $$"
#使用find命令在root目录下查找hello.sh文件,符号&的意思是把命令放入后台执行
find /root -name hello.sh & 
echo "The last one Daemon process is $!"
echo "$?"