Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114854
  • 博文数量: 47
  • 博客积分: 1960
  • 博客等级: 上尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-18 14:52
文章分类

全部博文(47)

文章存档

2010年(47)

我的朋友

分类:

2010-02-18 15:16:51

可以在脚本中调用命令. bash命令可分为外部命令和内部命令(bash内嵌的命令).可以在命令行中直接调用外部命令,但不能直接调用内部命令.但根据POSIX标准,许多内嵌命令已经被实现为独立的外部程序.所以区别内部命令和外部命令的意义就不大了.只需知道内部命令执行起来比外部命令效率更高就可以了. 另外, 外部命令和内嵌命令的执行方式也不一样, 参考bash笔记-01-intro

循环控制

break
break用于循环控制, 可在for, while, until中在条件满足之前提前终止语句的执行. 还可使用"break n"用以结束n层循环, 但理解它比较麻烦, 现实意义也不大, 不推荐使用. 默认break只用于退出一层循环.

continue
与break相对应, continue用以跳出当前循环, 进入到下一次循环中. loop变量取下此婚还的值. 也可以调用"continue n"来跳出嵌套循环, 同样, 不推荐使用.

例: (来自abs, 10.3节)
#!/bin/bash

LIMIT=19 # Upper limit

echo
echo "Printing Numbers 1 through 20 (but not 3 and 11)."

a=0

while [ $a -le "$LIMIT" ]
do
a=$(($a+1))

if [ "$a" -eq 3 ] || [ "$a" -eq 11 ] # Excludes 3 and 11.
then
continue # Skip rest of this particular loop iteration.
fi

echo -n "$a " # This will not execute for 3 and 11.
done

# Exercise:
# Why does loop print up to 20?

echo; echo

echo Printing Numbers 1 through 20, but something happens after 2.

##################################################################

# Same loop, but substituting 'break' for 'continue'.

a=0

while [ "$a" -le "$LIMIT" ]
do
a=$(($a+1))

if [ "$a" -gt 2 ]
then
break # Skip entire rest of loop.
fi

echo -n "$a "
done

echo; echo; echo

exit 0

: 命令
":"是一个空命令(null),  有时它被用来简化控制逻辑. 它实际上是true的别名. 例如:
用于无限循环的 "while :" 实际上等价于"while true". ":"由于是内嵌命令, 它比true效率要高.


I/O

echo
echo向stdout输出表达式或变量. 默认地, echo会在输出后换行. 可以有两种方式关闭echo的换行:

$ echo -n "hello, world"
$ echo -e "hello, world\c"

-n去掉echo末尾的换行符, -e打印出转义字符. 在linux/bash系统中, 推荐使用-n.

printf
如果想生成格式化输出, 建议使用printf而非echo. 老版本的bash不支持printf, 但教新的都支持.
printf和c中的printf函数很像:
printf “format string” parameter1 parameter2 ...

但bash中的printf不能输出浮点数(bash中的算术运算都是针对整数执行的).

$ printf "%s %d\t %s\n" "hi there" 15 "people"
hi there 15      people


脚本行为

source, . 命令
在bash笔记第一部分中已经提到了source命令或.命令对脚本的执行方式与其他执行方式的不同指出: 在当前shell中运行, 影响当前shell的环境变量. 可以把"."命令想象成C中的#include命令, 虽然它不直接将语句包含到脚本中, 但它会在当前shell中执行那些命令. 使用.命令可以将多个脚本合并起来, 整合进一些变量和函数.

exec
exec有两种用途:
1, 让当前进程执行其他的命令.
注意: (1)它不声称一个子shell进程, 而是在当前进程执行程序.
        (2)在exec命令之后的shell语句不会被执行, exec命令执行的程序运行完毕后就会退出.

2, 重分配文件描述符. (不常用)
$ exec 3< file
将fd=3用于读取file.

exit
用于无条件终止当前脚本的执行. 若用在交互式shell中, 它将logout当前shell.
exit后经常带有一个数值参数, 表征退出状态: exit n
n == 0            脚本执行成功
n == 1~125   出错, 这些对应的错误值由用户在脚本中定义.
n == 126        文件不可执行
n == 127        不存在该命令
n >= 128        产生信号

注意n处于1到125的情况, 这些错误值可以由用户自定义, 这就不需要使用类似C中errno这样的全局变量.
如果不给定n的值, 而直接使用exit, 那么返回exit之前最后一条语句的状态. 等效于"exit $?".

return
return用于函数的返回, 它向调用该函数的脚本返回一个整数数值. 若未给出该数值, 默认返回return前执行的最后一条命令的返回值.

export
export用来向当前shell或脚本的子进程输出变量. 包括子进程的子进程, 无限嵌套...


变量相关

set
set被用来设置bash的内置变量.

1, set可被用来重设某条命令的位置参数, 例如:
$ date
$ set $(date)
$ echo "the month is $2
the month is Jul
上述命令将位置参数设置为与date命令的输出相关.

2, 直接调用$ set , 将显示所有的环境变量和局部变量. 在调试bash脚本中, set也大有用武之地.

unset
unset被用来删除一个变量(该变量的值被设为null)
例如:
$ unset PATH
$ echo $PATH

unset不能删除bash内部定义的只读变量, 比如位置参数.
$ unset foo 与 $ foo= 的区别:
后者只是将foo设置为null, 前者将foo从环境变量中删除.


命令的执行

在编写脚本时, 我们时常需要在脚本中用到命令执行的结果, 即将变量执行的结果放到一个变量中. 这通过$(command)来实现.

一些老脚本中利用$`command`而非$ (command), 注意是`(esc下面的那个键盘)而非'(强引用)! 最好使用$ (command).

$ (command)即为command执行的结果, 例:
$ echo "the current dir is $PWD"
$ echo "the date is $(date)"

当然, 也可以将命令执行的结果赋给一个变量:
$ DATE=$(date)
$ echo $DATE


阅读(383) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~