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.