第二部分 进阶2. 循环与分支:- for循环:
- 循环结构 for args in [list]
do
command
done
- example:
#!/bin/bash
for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto do echo $planet # 每个行星都被单独打印在一行上. done
declare -i count=0 for planet in "Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto" do echo $planet #所有的行星名称都打印在同一行上. ((count++)) done
echo $count ##count=1
for file in [jx]* ##删除当前目录下以j,x开头的文件 do rm -f $file echo "remove file $file" done exit 0
|
- while循环
- 循环结构: while [condition]
do
command
done
- until 循环
- 这个结构在循环的顶部判断条件, 并且如果条件一直为false, 那么就一直循环下去.
(与while循环相反).
- until [condtion-is-true]
do
command
done
- 循环控制: break 和continue (跟c语言语法一致)
- case 与select结构:
- case "$variable" in
"$condition1" )
command...
;;
"$condition2" )
command...
;;
esac - example:
#!/bin/bash
echo "Hit a key then hit ENTER" read key
case "$key" in [[:lower:]] ) echo "$key is lower case" ;; [[:upper:]] ) echo "$key is upper case" ;; [0-9] ) echo "$key is digit" ;; * ) echo "other character!" ;; esac exit 0
|
- select: select结构是建立菜单的另一种工具,
这种结构是从ksh中引入的.
- select "$variable" [in list]
do
command
break
done - 提示用户输入选择的内容(比如放在变量列表中).
注意: select命令使用
PS3
提示符,
默认为(#?),
当然, 这可以修改. 如果忽略了in list列表,
那么select命令将会使用传递到脚本的命令行参数($@
),
或者是函数参数(当select是在函数中时). - example:
#!/bin/bash
PS3='select your favorite vegetable:' select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas" do echo "your favorite vegetable is $vegetable" break done
exit 0
|
3. 内建命令:- 内建命令指的就是包含在Bash工具包中的命令,
从字面意思上看就是built in.
这主要是考虑到执行效率的问题 -- 内建命令将比外部命令执行的更快,
一部分原因是因为外部命令通常都需要fork出一个单独的进程来执行,另一部分原因是特定的内建命令可以直接访问shell的内核部分.
- 一个内建命令通常会与一个系统命令同名,
但是Bash在内部重新实现了这些命令.
比如, Bash的echo命令与/bin/echo就不尽相同,
虽然它们的行为在绝大多数情况下都是一样的.
- 内建命令列表:
- echo
- echo -e 打印转义字符 ;; echo "hello,world\n"
- echo -n 不还换行
- echo `command` 将会删除任何由command所产生的换行符. 但 res=`command`;echo "$res"却不会删除换行符。而echo $res不行。
- printf
- 格式化输出, 是echo命令的增强版.
它是C语言
printf()
库函数的一个有限的变形,
并且在语法上有些不同. 这是Bash的内建版本,
与/bin/printf或者/usr/bin/printf命令不同. - 语法: printf formate-string ... parameter...
- example: msg=hello;i=9;printf "msg=%s, i=%d\n" $msg $i
- read
- 从stdin中"读取"一个变量的值, 使用
-a
参数可以read数组变量 - read -n 3 var#读取3个字符 或写成read -n3 var
- reat -t 3 var ##-t指定timeout
- example: read -t2 -n1 var;echo $var
- cd ,pwd
- pushd, popd, dirs
- 这几个命令可以使得工作目录书签化, 就是可以按顺序向前或向后移动工作目录.
压栈的动作可以保存工作目录列表. 选项可以允许对目录栈做不同的操作.
- pushd
dir-name把路径dir-name压入目录栈,
同时修改当前目录到dir-name.
- popd将目录栈最上边的目录弹出,
同时将当前目录修改为刚弹出来的那个目录.
- dirs列出所有目录栈的内容,一个成功的pushd或者popd将会自动调用dirs命令.
- let
- 执行变量的算术操作.
在许多情况下, 它被看作是复杂的expr命令的一个简化版本.
- example: let "a += 4"
- eval
- eval arg1 [arg2] ... [argN] 将表达式中的参数, 或者表达式列表, 组合起来,然后执行它们。
- example: res=`eval ls -l` ;echo "$res"
- set/unset
- declear/typeset
- readonly (==declare -r)
- getopts:
- 可以说这个命令是分析传递到脚本中命令行参数的最强力的工具.
这个命令与外部命令getopt还有C语言中的库函数getopt的作用是相同的.
它允许传递和连接多个选项到脚本中, 并且能够分配多个参数到脚本中 (man getopts)
- source (等同于.)
- 当在命令行中调用的时候, 这个命令将会执行一个脚本.
当在脚本中调用的时候,
source file-name 将会加载file-name文件,source一个文件(或点命令)将会在脚本中引入代码,
并将这些代码附加到脚本中(与C语言中的#include指令效果相同).
最终的结果就像是在使用"source"的行上插入了相应文件的内容.
在多个脚本需要引用相同的数据, 或者需要使用函数库的情况下,
这个命令非常有用.
- source date-file <==> .data-file
- exit
- exec
- 这个shell内建命令将使用一个特定的命令来取代当前进程.
一般的当shell遇到一个命令,
它会forks一个子进程来真正的运行命令.
使用exec内建命令, shell就不会fork了,
并且命令的执行将会替换掉当前shell.
因此, 在脚本中使用时, 一旦exec所执行的命令执行完毕,
那么它就会强制退出脚本.
- true/false
- example: if true; then ...
- type [cmd]
- 与外部命令which很相像,
type cmd将会给出"cmd"的完整路径.
与which命令不同的是,
type命令是Bash内建命令.
-a
是type命令的一个非常有用的选项,
它用来鉴别参数是关键字还是内建命令,
也可以用来定位同名的系统命令.
- help
- 获得shell内建命令的一个小的使用总结.
与whatis命令比较象,
但help命令是内建命令. eg: help echo
- 作业控制命令
- jobs :在后台列出所有正在运行的作业, 给出作业号, 作业和进程的概念太容易混淆了.
特定的内建命令
比如kill, disown,
和wait命令即可以接受作业号为参数,
也可以接受进程号为参数.
但是fg,
bg和jobs命令就只能接受作业号为参数.
- fg/bg :fg命令可以把一个在后台运行的作业放到前台来运行.
而bg命令将会重新启动一个挂起的作业,
并且在后台运行它.
如果使用fg或者bg命令的时候没有指定作业号,
那么默认将对当前正在运行的作业进行操作.
- wait :停止脚本的运行,
直到后台运行的所有作业都结束为止, 或者如果传递了作业号或进程号为参数的话,
那么就直到指定作业结束为止.
返回等待命令的退出状态码。你可以使用wait命令来防止在后台作业没完成(这会产生一个孤儿进程)之前退出脚本.
- suspend :这个命令的效果与Control-Z很相像,
但是它挂起的是这个shell
- logout :退出一个已经登陆上的shell, 也可以指定一个退出状态码.
- times :给出执行命令所占用的时间
- kill/killall 通过发送一个适当的结束信号,
来强制结束一个进程
- enable :这个命令或者禁用内建命令或者恢复内建命令.
比如, enable -n
kill将禁用内建命令kill,
所以当我们调用kill命令时,
使用的将是/bin/kill外部命令.
阅读(931) | 评论(0) | 转发(0) |