Linux Bash Shell 笔记
http://www.sphinxsearch.org/archives/414 详细资料
BASH 中的变量与 C 语言中变量的区别
这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。
1,BASH 中的变量在引用时都需要在变量前加上 “$” 符号( 第一次赋值及在For循环的头部不用加 “$”符号 ),下面举个栗子:
#!/bin/bash
# give the initialize value to STR
STR=”Hello World”
echo $STR
这里我们需要注意下面几点:
(1)变量赋值时,‘=’左右两边都不能有空格;
(2)BASH 中的语句结尾不需要分号(”;”);
(3)除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加”$”符号,同学们可以将上面程序中第三行改为 “echo STR” 再试试,看看会出什么结果。==>output: STR
(4)由于 BASH 程序是在一个新的进程中运行的,所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,也不会影响他们的运行。
2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用。
3,BASH 中的整形变量的比较符号与 C 语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理:
在比较操作上,整数变量和字符串变量各不相同,详见下表:
|
对应的操作
|
整数操作
|
字符串操作
|
|
相同
|
-eq
|
=
|
|
不同
|
-ne
|
!=
|
|
大于
|
-gt
|
>
|
|
小于
|
-lt
|
<
|
|
大于或等于
|
-ge
|
|
|
小于或等于
|
-le
|
|
|
为空
|
-z
|
|
|
不为空
|
-n
|
比如:
比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]
判断字符串 a 是否为空就写作: if [ -z $a ]
判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]
对于整形变量的算术运算:如对变量 x 加 1 可以写作:let “x = $x + 1“ 或者x=`expr $x + 1`
BASH 中的基本流程控制语法
BASH 中几乎含有 C 语言中常用的所有控制结构。
1.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 … 。
2. for
for name [ in word ] ; do list ; done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done //注意有2层括号
3.while
while [ condition ]
do
statments
done
4.until
until [ condition is TRUE ]
do
statments
done
5.case
case “$var” in
condition1 )
statments1;;
condition2 )
statments2;;
…
* )
default statments;;
esac
6.break/continue
变量的特殊操作
${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。
${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。
${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。
${var?err_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。
还有下面一些用法,这些用法主要用于从文件路径字符串中提取有用信息:
${var#pattern}, ${var##pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最左侧的串。
${var%pattern}, ${var%%pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最右侧的串。
另外 BASH 中还加入下面一些操作:
${var:pos} 表示去掉变量 $var 中前 pos 个字符。
${var:pos:len} 表示变量 $var 中去掉前 pos 个字符后的剩余字符串的前 len 个字符。
${var/pattern/replacement} 表示将变量 $var 中第一个出现的 pattern 模式替换为 replacement 字符串。
${var//pattern/replacement} 表示将变量 $var 中出现的所有 pattern 模式全部都替换为 replacment 字符串。
函数
function my_funcname {
code block
}
或者
my_funcname() {
code block
}
函数传递参数和获得返回值:
使用BASH的保留变量$1 $2...引用,BASH 的返回值可以用 return 语句来指定返回一个特定的整数(不能直接返回字符串),如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。
栗子:
#!/bin/bash
square() {
let “res = $1 * $1″
return $res
}
square $1
result=$?
echo $result
exit 0
系统变量:
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1...9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个背景指令的PID
$? 上一个指令的返回
$IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格。
$HOME 这个变量中存储了当前用户的根目录路径。
$PATH 这个变量中存储了当前 Shell 的默认路径字符串。
$PS1 表示第一个系统提示符。
$PS2 表示的二个系统提示符。
$PWD 表示当前工作路径。
$EDITOR 表示系统的默认编辑器名称。
$BASH 表示当前 Shell 的路径字符串。
浙公网安备 33010602011771号