#!/bin/bash或者#!/bin/sh
二者区别
sh:Bourne shell(sh) 是 UNIX 最初使用的shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
bash: Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourneshell 的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
如果注释中有反引号的命令就会报错,反引号部分不会被注释掉,例如 var=`ls -l` 就不会被注释掉。
方法B(避免反引号报错):
3.1直接定义
java_home="/opt/Oracle/java"
3.2 变量传递
java_bin=$java_home/bin或者java_bin=${java_home}/bin
3.3 参数传递
version=$1
说明:$0代表sh运行命令的第一个参数,即该sh文件的全名
$1代表sh运行命令的第二个参数
变量说明
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" …"$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
举例:
sh test.sh aabb
echo"number:$#" #输出number:2
echo "scname:$0" #输出scname:test.sh
echo "first :$1" #输出first:aa
echo "second:$2" #输出second:bb
echo "argume:$@" #输出argume:aa bb
扩展:
$*和$@的区别:
$*实例
$@实例
函数名(){
函数体
}
举例:
usage(){
echo"usage:sh $0 pkg_version"
echo"example:sh deploy_ciitc.sh V1.0.0B03_20160416_03-56-09"
exit 1
}
函数调用
直接写函数名,举例:
if [ $# -ne 1];then
usage
exit 1
fi
5.1单引号 (‘‘ )
# grep Susan phonebook
Susan Goldberg 403-212-4921
Susan Topple 212-234-2343
如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldberg和phonebook当作需要搜索的文件
# grep ‘Susan Gold‘ phonebook
Susan Goldberg 403-212-4921
当shell碰到第一个单引号时,它忽略掉其后直到右引号的所有特殊字符
5.2 双引号 (" " )
双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。如果要查询包含空格的字符串,经常会用到双引号。
# x=*
# echo $x
hello.sh menus.sh misc.sh phonebook tshift.sh
# echo ‘$x‘
$x
# echo "$x"
*
这个例子可以看出无引号、单引号和双引号之间的区别。在最后一种情况中,双引号告诉shell在引号内照样进行变量名替换,所以shell把$x替换为*,因为双引号中不做文件名替换,所以就把*作为要显示的值传递给echo。对于第一种情况需要进一步说明,shell在给变量赋值时不进行文件名替换(这从第三种情况中也能看出来),各步骤发生的精确次序如下: shell扫描命令行,把x的值设为星号*;
shell再次扫描命令行,碰到星号*,把它替换成当前目录下的文件清单;
shell启动执行echo命令,把文件清单作为参数传递给echo.
这个赋值的先后次序非常重要:shell先作变量替换,然后作文件名替换,最后把这行处理为参数
5.3 反引号(``)
命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支持,也利于嵌套。
# echo The date and time is `date`
The date and time is 三 6月 1506:10:35 CST 2005
# echo Your current working directory is $(pwd)
Your current working directory is/home/howard/script
5.4 反斜杠backslash-escaped( \ )
反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
echo -e "\n"
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。
\n 表示新的一行
\r 表示回车
\t 表示水平制表符
\v 表示垂直制表符
\b 表示后退符
\a 表示"alert"(蜂鸣或者闪烁)
\0xx 转换为八进制的ASCII码
扩展:
1)echo -e "\n" 等同于echo $‘\n‘ # 新行
2)ssh root@172.20.11.13 ‘cd$batch_ws_pkg_path;[ -f $batch_ws_pkg ] && echo "batch ws pkg find" || echo "batch ws pkg not find" && exit 1 ‘
命令解释:登录172.20.11.13,并且在机器上执行‘‘内部的命令-----切换目录,成功后,判断目录如果存在,打印batch ws pkg find否则打印batch ws pkg not find并退出
常用判断:
扩展:
case条件语句:
语法: case 条件 in
xxx)
commands;;
xxx)
commands;;
xxx)
commands;;
esac
说明:这个esac 就是case的结束,想if...fi 一样的,
注意commands;;中的“;;”不能少掉。
实例:
6、特殊简写命令
语法:for 变量 in 列表
do
操作~~~~
done
说明:变量是在当前循环实用,用来替代当前列表的对象。
列表:循环中所要操作的对象,可以是字符串,文件名等。
实例:
扩展:for循环的其他写法--注:对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;这里的C语言for循环风格是挺熟悉的吧。
语法: while [ 表达式 ]
do
操作......
done
说明:只要表达式成立,就将一直循环下去。
[] 和 表达式 之间要有空格,最好在与操作符前后也加上空格
先判断表达式的true还是false,true时候,在执行里面的语句。
实例:
语法:until [表达式]
do
操作......
done
说明: until和while正好相反, until是如果表达式不成立则执行里面的操作,直到表达式成功后结束。
实例:
原文地址:http://4443915.blog.51cto.com/4433915/1788658