[linux] bash shell
目前开发中shell脚本中主要有以下两种方式:
#!/bin/sh
#!/bin/bash
sh一般设成bash的软链
在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
也就是说 /bin/sh 相当于 /bin/bash --posix
遵循posix的特定规范,有可能就包括这样的规范:
“当某行代码出错时,不继续往下解释”
linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,
在 BASH 中 第一行的 "#!" 及后面的 "/bin/bash" 就表明该文件是一个 BASH 程序,
需要由 /bin 目录下的 bash 程序来解释执行,
BASH 这个程序一般是存放在 /bin 目录下,
所以 #!/bin/bash只能放在第一行,
如果后面还有#如果后面还有#!,那么只能看成是注释
如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
BASH 中的绝大多数语句结尾处都没有分号。
操作实例1:
hello文件
$ vi hello
#!/bin/bash
# This is a very simple example
echo Hello World
$ bash hello
或
$ sh hello
可以先将 hello 文件改为可以执行的文件,然后直接运行它,
此时由于 hello 文件第一行的 "#! /bin/bash" 的作用,
系统会自动用/bin/bash 程序去解释执行 hello 文件
原始权限
-rw-rw-r--
更改权限
$ chmod u+x hello
-rwxrw-r--
更改后可直接运行
$ ./hello
此处没有直接 “$ hello”是因为当前目录不是当前用户可执行文件的默认目录,
而将当前目录“.”设为默认目录是一个不安全的设置。
需要注意的是,BASH 程序被执行后,实际上 Linux 系统是另外开设了一个进程来运行的。
在 Linux 系统中:标准输入(stdin)默认为键盘输入;
标准输出(stdout)默认为屏幕输出;
标准错误输出(stderr)默认也是输出到屏幕。
在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。
输入、输出及标准错误输出主要用于 I/O 的重定向,就是说需要改变他们的默认设置。
将 ls 命令的结果输出重定向到 ls_result 文件中
$ ls > ls_result
将 ls 命令的结果输出追加到 ls_result 文件
$ ls -l >> ls_result
">"就是输出(标准输出和标准错误输出)重定向的代表符号,
">>" 则表示不清除原来的而追加输出。
BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格。
'='左右两边都不能有空格
BASH 中的语句结尾不需要分号";"
除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加"$"符号.
由于 BASH 程序是在一个新的进程中运行的,
所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,
也不会影响他们的运行。
STR 自不过是对 ${STR} 的一种简化。
在复杂情况下(即有可能产生歧义的地方)最好用带 {} 的表示方式。
#!/bin/bash
# give the initialize value to STR
STR="Hello World"
echo $STR
#输出Hello World
局部变量
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
#执行hello方法
hello
echo $HELLO
#输出
#Hello
#World
#Hello
在比较操作上,整数变量和字符串变量各不相同
相同
-eq
=
不同
-ne
!=
大于
-gt
>
小于
-lt
<
大于或等于
-ge
null
小于或等于
-le
null
为空
null
-z
不为空
null
-n
if...then...else
if [ expression ]
then
statments
fi
或者
if [ expression ]
then
statments
else
statments
fi
或者
if [ expression ]
then
statments
else if [ expression ]
then
statments
else
statments
fi
或者
if [ expression ]
then
statments
elif [ expression ]
then
statments
else
statments
fi
如果将 if 和 then 简洁的写在一行里面,
就必须在 then 前面加上分号
if [ expression ]; then ...
$1 是指命令行的第一个参数
#!/bin/bash
if [ $1 -gt 90 ]
then
echo "Good, $1"
elif [ $1 -gt 70 ]
then
echo "OK, $1"
else
echo "Bad, $1"
fi
exit 0