Andy Niu �����ĵ�

Andy Niu

Andy Niu Help  1.0.0.0
特殊字符

变量

 美元符
 
 分号
 
 变量引用和命令替换
 
 调用命令__命令替换__命令返回值
 
 倒引号__单引号__双引号
 
 EOF
 

详细描述

变量说明

EOF
1、考虑下面的需求,在主shell执行命令,进入其他的命令,后面的输入,想作为命令的输入,而不是主shell的输入,怎么办?
2、使用<<EOF,告诉主shell,后续的输入,是其他命令或者子shell的输入,直到遇到EOF为止,再回到主shell。
3、这里的EOF只是分界符,使用其他的字符也可以。
4、比如cat,不使用EOF,如下:
[root@localhost ~]# cat >111.txt
abcd
1234

[root@localhost ~]# more 111.txt
abcd
1234
使用EOF
[root@localhost ~]# cat >111.txt<<EOF
> aaaa
> bbbb
> EOF
[root@localhost ~]# more 111.txt
aaaa
bbbb
5、mysql安装后之后,忘记密码,可使用说下面的脚本,如下:
/etc/init.d/mysqld stop

service mysqld start --skip-grant-tables
sleep 4
mysql -hlocalhost << EOF
update mysql.user set password=password('123456') where user ='root';
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
EOF
/etc/init.d/mysqld restart
参见
倒引号__单引号__双引号
1、倒引号表示命令,用于命令替换,获取命令的返回结果。
    echo now is `date` 或者 echo now is $(date)
2、单引号
    name=Andy  没有问题,
    如果想 name=Andy Niu,报错:bash:niu:command not found,程序认为第一个空格后是命令。
    如何解决这个问题?
    使用单引号 name=‘Andy Niu’
    注:字符串中包含等号,也需要使用单引号引起来。
3、双引号
    desc=‘I am $name’
    echo $desc
    I am $name’ ,我想显示的是 I am Andy Niu。怎么办?
    使用双引号,双引号对于其中的 $、\(反斜杠)、·(倒引号)特殊对待。
参见
分号
1、分号是语句分隔符,当一行中有多个语句时,需要使用分号进行分割语句。
2、换行符也可以作为语句分隔符,如果一行中只有一个语句,结尾不需要分号,加上分号也可以。
3、最后一个语句不需要分号
4、示例:
    #! /bin/sh -x
    var=5
    if [ $var == 8 ]; then
            echo 'equal to 8';
    elif [ $var -gt 8 ]
    then
            echo 'bigger than 8'
    else
            echo 'smaller than 8'
    fi
    需要注意的几点:
    a、then是一个语句,如果和if在同一行,需要加上分号。否则shell认为是一个语句,解析出错。
    b、一行只有一个语句,结尾不需要加上分号,最后一个语句不需要分号,加上也行。
    c、else 后面没有then
    d、== 可以表示 -eq,但是 >= 不能表示 -ge,这可能是因为 > 符号有其他用处,比如数据流重定向。
参见
变量引用和命令替换
1、变量引用
    name=Andy
    echo $name 或 echo ${name}
2、命令替换
    把命令的执行结果赋值给变量,使用倒引号或者$()
    APP_HOME=`pwd` 或 APP_HOME=$(pwd)
    注意:bash 与makefile的语法不一样,在makefile中,变量引用使用 ${} 或者$()
参见
美元符
$num    num为第几个参数,其中$0是当前脚本的文件名
$#      传入脚本的参数的个数
$*      所有的位置参数(作为单个字符串) 
$@      所有的位置参数(每个都作为独立的字符串)。
$?      当前shell进程中,前一个命令的返回值,执行成功则$?值为0,否则为非零值,常用做if语句条件
$$      当前shell进程的pid
$!      后台运行的最后一个进程的pid
$-      显示shell使用的当前选项
$_      前一个命令的最后一个参数
参见
调用命令__命令替换__命令返回值
1、考虑下面的shell脚本
    #! /bin/sh
    #set -x
    fun1()
    {
            cd aa
    }
    fun2()
    {
            pwd
            fun1
            pwd
    }
    
    fun2
2、在fun2直接调用fun1,执行结果如下:
    [root@localhost tmp]# ./test.sh 
    /tmp
    /tmp/aa
3、在fun2中对fun1进行命令替换,如下:
    #! /bin/sh
    #set -x
    fun1()
    {
            cd aa
    }
    fun2()
    {
            pwd
            `fun1`
            pwd
    }
    
    fun2
    执行结果如下:
    [root@localhost tmp]# ./test.sh 
    /tmp
    /tmp
4、也就是说,对于命令替换,不会改变当前的执行目录。
5、命令替换是获取命令中echo的内容,如下:
    #! /bin/sh
    #set -x
    fun1()
    {
            cd aa
            echo "hello"
    }
    fun2()
    {
            pwd
            EchoFromFun1=$(fun1)
            echo $EchoFromFun1
            pwd
    }
    
    fun2
    执行结果,如下:
    [root@localhost tmp]# ./test.sh 
    /tmp
    hello
    /tmp
6、考虑下面的需求,fun1对输入的正数,加上100,负数不处理,然后fun2对fun1处理后的数乘以2。
    对于fun1,存在两个输出值。一个是否成功,另一个是处理后的数字。
    当然也可以使用一个返回值表示,一个特殊的值表示失败,其他的情况表示处理后的数字。
    但是,尽量不使用这种做法。因为这样的话,一个返回值表示表示两种含义。
    正确的做法如下:
    #! /bin/sh
    #set -x
    SUCCESS=0
    FAILURE=1
    fun1()
    {
            if [ $1 -gt  5 ];then
                    let aa=$1+100
                    echo $aa
                    return $SUCCESS
            fi
            return $FAILURE
    }
    fun2()
    {
            EchoFromFun1=$(fun1 4)
            if [ $? == $SUCCESS ];then
                    let aa=$EchoFromFun1\*2
                    echo $aa
            else
                    echo 'error'
            fi
    }
    
    fun2
7、特别注意,$?是上一个命令的返回结果,EchoFromFun1=$(fun1 4) 之后,紧接着调用$?,就是$(fun1 4)的返回结果。考虑:
    EchoFromFun1=$(fun1 4)
    echo $?
    if [ $? == $SUCCESS ];then
    if中的$?,是上一个命令echo $?的回传值,一定是0
参见
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.