- 浏览: 2077326 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
支(case与select结构)
case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支.
在代码块中控制程序分支
case (in) / esac
在shell中的case结构与C/C++中的switch结构是相同的. 它允许通过判断来选择代码块中多条路径中的一条. 它的作用和多个if/then/else语句的作用相同, 是它们的简化结构, 特别适用于创建菜单.
*
对变量使用""并不是强制的, 因为不会发生单词分割.
*
每句测试行, 都以右小括号)来结尾.
*
每个条件判断语句块都以一对分号结尾 ;;.
*
case块以esac (case的反向拼写)结尾.
例子 10-24. 使用case
例子 10-25. 使用case来创建菜单
一个case的非常聪明的用法, 用来测试命令行参数.
这是一个命令行参数处理的更容易理解的例子:
例子 10-26. 使用命令替换来产生case变量
case结构也可以过滤通配(globbing)模式的字符串.
例子 10-27. 简单的字符串匹配
例子 10-28. 检查输入字符是否为字母
# 练习:
# -----
# 编写一个'isfloat ()'函数来测试浮点数.
# 暗示: 这个函数基本上与'isdigit ()'相同,
#+ 但是要添加一些小数点部分的处理.
select
select结构是建立菜单的另一种工具, 这种结构是从ksh中引入的.
select variable [in list]
do
command...
燽reak
done
提示用户输入选择的内容(比如放在变量列表中). 注意: select命令使用PS3提示符, 默认为(#?), 当然, 这可以修改.
例子 10-29. 使用select来创建菜单
如果忽略了in list列表, 那么select命令将会使用传递到脚本的命令行参数($@), 或者是函数参数(当select是在函数中时).
与忽略in list的
for variable [in list]
结构比较一下.
例子 10-30. 使用函数中的select结构来创建菜单
case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支.
在代码块中控制程序分支
case (in) / esac
在shell中的case结构与C/C++中的switch结构是相同的. 它允许通过判断来选择代码块中多条路径中的一条. 它的作用和多个if/then/else语句的作用相同, 是它们的简化结构, 特别适用于创建菜单.
case "$variable" in "$condition1" ) command... ;; "$condition2" ) command... ;; esac Note
*
对变量使用""并不是强制的, 因为不会发生单词分割.
*
每句测试行, 都以右小括号)来结尾.
*
每个条件判断语句块都以一对分号结尾 ;;.
*
case块以esac (case的反向拼写)结尾.
例子 10-24. 使用case
#!/bin/bash # 测试字符串范围. echo; echo "Hit a key, then hit return." read Keypress case "$Keypress" in [[:lower:]] ) echo "Lowercase letter";; [[:upper:]] ) echo "Uppercase letter";; [0-9] ) echo "Digit";; * ) echo "Punctuation, whitespace, or other";; esac # 允许字符串的范围出现在[中括号]中, #+ 或者出现在POSIX风格的[[双中括号中. # 在这个例子的第一个版本中, #+ 测试大写和小写字符串的工作使用的是 #+ [a-z] 和 [A-Z]. # 这种用法在某些特定场合的或某些Linux发行版中不能够正常工作. # POSIX 的风格更具可移植性. # 感谢Frank Wang指出了这点. # 练习: # ----- # 就像这个脚本所表现出来的, 它只允许单次的按键, 然后就结束了. # 修改这个脚本, 让它能够接受重复输入, #+ 报告每次按键, 并且只有在"X"被键入时才结束. # 暗示: 将这些代码都用"while"循环圈起来. exit 0
例子 10-25. 使用case来创建菜单
#!/bin/bash # 未经处理的地址资料 clear # 清屏. echo " Contact List" echo " ------- ----" echo "Choose one of the following persons:" echo echo "[E]vans, Roland" echo "[J]ones, Mildred" echo "[S]mith, Julie" echo "[Z]ane, Morris" echo read person case "$person" in # 注意, 变量是被""引用的. "E" | "e" ) # 接受大写或者小写输入. echo echo "Roland Evans" echo "4321 Floppy Dr." echo "Hardscrabble, CO 80753" echo "(303) 734-9874" echo "(303) 734-9892 fax" echo "revans@zzy.net" echo "Business partner & old friend" ;; # 注意, 每个选项后边都要以双分号;;结尾. "J" | "j" ) echo echo "Mildred Jones" echo "249 E. 7th St., Apt. 19" echo "New York, NY 10009" echo "(212) 533-2814" echo "(212) 533-9972 fax" echo "milliej@loisaida.com" echo "Ex-girlfriend" echo "Birthday: Feb. 11" ;; # 后边的 Smith 和 Zane 的信息在这里就省略了. * ) # 默认选项. # 空输入(敲回车RETURN), 也适用于这里. echo echo "Not yet in database." ;; esac echo # 练习: # ----- # 修改这个脚本, 让它能够接受多个输入, #+ 并且能够显示多个地址. exit 0
一个case的非常聪明的用法, 用来测试命令行参数.
#! /bin/bash case "$1" in "") echo "Usage: ${0##*/} <filename>"; exit $E_PARAM;; # 没有命令行参数, # 或者第一个参数为空. # 注意: ${0##*/} 是 ${var##pattern} 的一种替换形式. 得到的结果为$0. -*) FILENAME=./$1;; # 如果传递进来的文件名参数($1)以一个破折号开头, #+ 那么用./$1来代替. #+ 这样后边的命令将不会把它作为一个选项来解释. * ) FILENAME=$1;; # 否则, $1. esac
这是一个命令行参数处理的更容易理解的例子:
#! /bin/bash while [ $# -gt 0 ]; do # 直到你用完所有的参数 . . . case "$1" in -d|--debug) # 是 "-d" 或 "--debug" 参数? DEBUG=1 ;; -c|--conf) CONFFILE="$2" shift if [ ! -f $CONFFILE ]; then echo "Error: Supplied file doesn't exist!" exit $E_CONFFILE # 错误: 文件未发现. fi ;; esac shift # 检查剩余的参数. done # 来自Stefano Falsetto的 "Log2Rot" 脚本, #+ 并且是他的"rottlog"包的一部分. # 已得到使用许可.
例子 10-26. 使用命令替换来产生case变量
#!/bin/bash # case-cmd.sh: 使用命令替换来产生"case"变量. case $( arch ) in # "arch" 返回机器体系的类型. # 等价于 'uname -m' ... i386 ) echo "80386-based machine";; i486 ) echo "80486-based machine";; i586 ) echo "Pentium-based machine";; i686 ) echo "Pentium2+-based machine";; * ) echo "Other type of machine";; esac exit 0
case结构也可以过滤通配(globbing)模式的字符串.
例子 10-27. 简单的字符串匹配
#!/bin/bash # match-string.sh: 简单的字符串匹配 match_string () { MATCH=0 NOMATCH=90 PARAMS=2 # 此函数需要2个参数. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac } a=one b=two c=three d=two match_string $a # 参数个数错误. echo $? # 91 match_string $a $b # 不匹配 echo $? # 90 match_string $b $d # 匹配 echo $? # 0 exit 0
例子 10-28. 检查输入字符是否为字母
#!/bin/bash # isalpha.sh: 使用"case"结构来过滤字符串. SUCCESS=0 FAILURE=-1 isalpha () # 检查输入的 *第一个字符* 是不是字母表上的字符. { if [ -z "$1" ] # 没有参数传进来? then return $FAILURE fi case "$1" in [a-zA-Z]*) return $SUCCESS;; # 以一个字母开头? * ) return $FAILURE;; esac } # 同C语言的"isalpha ()"函数比较一下. isalpha2 () # 测试 *整个字符串* 是否都是字母表上的字符. { [ $# -eq 1 ] || return $FAILURE case $1 in *[!a-zA-Z]*|"") return $FAILURE;; *) return $SUCCESS;; esac } isdigit () # 测试 *整个字符串* 是否都是数字. { # 换句话说, 就是测试一下是否是整数变量. [ $# -eq 1 ] || return $FAILURE case $1 in *[!0-9]*|"") return $FAILURE;; *) return $SUCCESS;; esac } check_var () # 测试isalpha(). { if isalpha "$@" then echo "\"$*\" begins with an alpha character." if isalpha2 "$@" then # 不需要测试第一个字符是否是non-alpha. echo "\"$*\" contains only alpha characters." else echo "\"$*\" contains at least one non-alpha character." fi else echo "\"$*\" begins with a non-alpha character." # 如果没有参数传递进来, 也是"non-alpha". fi echo } digit_check () # 测试isdigit(). { if isdigit "$@" then echo "\"$*\" contains only digits [0 - 9]." else echo "\"$*\" has at least one non-digit character." fi echo } a=23skidoo b=H3llo c=-What? d=What? e=`echo $b` # 命令替换. f=AbcDef g=27234 h=27a34 i=27.34 check_var $a check_var $b check_var $c check_var $d check_var $e check_var $f check_var # 没有参数传递进来, 将会发生什么? # digit_check $g digit_check $h digit_check $i exit 0 # S.C改进了这个脚本.
# 练习:
# -----
# 编写一个'isfloat ()'函数来测试浮点数.
# 暗示: 这个函数基本上与'isdigit ()'相同,
#+ 但是要添加一些小数点部分的处理.
select
select结构是建立菜单的另一种工具, 这种结构是从ksh中引入的.
select variable [in list]
do
command...
燽reak
done
提示用户输入选择的内容(比如放在变量列表中). 注意: select命令使用PS3提示符, 默认为(#?), 当然, 这可以修改.
例子 10-29. 使用select来创建菜单
#!/bin/bash PS3='Choose your favorite vegetable: ' # 设置提示符字串. echo select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas" do echo echo "Your favorite veggie is $vegetable." echo "Yuck!" echo break # 如果这里没有 'break' 会发生什么? done exit 0
如果忽略了in list列表, 那么select命令将会使用传递到脚本的命令行参数($@), 或者是函数参数(当select是在函数中时).
与忽略in list的
for variable [in list]
结构比较一下.
例子 10-30. 使用函数中的select结构来创建菜单
#!/bin/bash PS3='Choose your favorite vegetable: ' echo choice_of() { select vegetable # [in list]被忽略, 所以'select'使用传递给函数的参数. do echo echo "Your favorite veggie is $vegetable." echo "Yuck!" echo break done } choice_of beans rice carrots radishes tomatoes spinach # $1 $2 $3 $4 $5 $6 # 传递给choice_of()的参数 exit 0
- jigsaw.rar (694.6 KB)
- 下载次数: 10
- jigsaw.rar (1.6 MB)
- 下载次数: 14
发表评论
-
在ubuntu中.profile 和.bashrc的加载区别
2013-06-01 21:38 2534总之,profile不只是bash,在启动加载 bashrc是 ... -
command line tools for linux
2013-02-14 23:49 1473du -sh `ls .` for i in G M K; ... -
ubuntu 12.10 proxy install package apt-get
2013-01-31 06:47 1213#/.bashrc export http_proxy= ... -
查找多文件内容替换
2012-09-14 20:58 1499UPDATE: (05/03/2013) 当前使用: # ... -
shell script
2012-09-11 21:08 1044select r.name, count(p.id) from ... -
定期清空日志文件
2012-09-11 10:04 3356一个关于如何在指定文件大于1GB后,自动删除的问题。 批处理代 ... -
查看一个进程占用了那个端口
2012-09-11 09:59 1724有时候需要在Linux下查看一个进程占用了那个端口,但是只知道 ... -
utf8 ruby1.9
2012-07-13 01:57 1341引用invalid byte sequence in utf- ... -
VIM下跳转的区别
2012-05-06 00:33 1393VIM在开tag和jumplist的时候有几个差别 经常用的 ... -
shell command
2012-04-11 21:42 929ls -l . | egrep -c '^d' ls -l . ... -
unbuntu 查看什么占着80端口
2012-01-19 12:37 1446sudo lsof -i :80 sudo nets ... -
处理僵尸进程
2011-05-27 01:45 1178#!/bin/sh kill -HUP `ps -A - ... -
ubuntu 看硬件配置
2011-05-02 02:03 5291总是忘记阿,标记一下 sudo lspci -v lshw ... -
no such file to load -- zlib
2011-04-25 23:52 2761或者提示 fatal error: zlib.h: No su ... -
新装的mysql出现无法登陆的问题 er 1405 参考下面的解决
2011-01-23 12:39 3093Installing MySQL 5.0 First we ... -
ssh无密码登入设置
2010-08-17 21:02 1408现有2台机器 1、服务器192.168.1.112 2、个人机 ... -
bash和乱码
2010-08-16 00:15 1914几个bash下配置的区别 1)/etc/profile: 此文 ... -
ubuntu 配置git服务器及其它
2010-08-15 23:46 2185update: 生产public key的时候不能按照git ... -
nohup命令让程序在后台运行-linux
2010-02-04 14:17 7056nohup ruby /sunrise/www/realwor ... -
shell 条件可能用到
2010-01-26 15:05 1536为什么不能用ruby脚本写啊,shell脚本写的俺很烦啊... ...
相关推荐
通过阅读和实践"shell脚本大全"中的例子,你可以逐步掌握这些概念,并学会如何编写自己的脚本来提高工作效率。无论是在系统管理、自动化任务,还是在数据分析等领域,Shell脚本都发挥着重要的作用。记得实践是掌握...
Shell脚本编程是一种在Linux和类Unix操作系统中广泛使用的脚本编写技术,它允许用户创建自动化任务,执行一系列命令和操作。在这个主题中,我们将深入探讨Shell脚本编程的几个关键方面。 首先,理解`Shell命令行的...
这里我们探讨几个基本的Shell脚本例子,包括用户交互、参数处理、文件解压缩以及进度条模拟。 1. 用户交互脚本: 在`show_var.sh`这个例子中,脚本通过`while`循环不断请求用户输入数字,直到用户输入"end"为止。`...
Shell脚本是Linux和Unix操作系统中的一个强大工具,它允许用户通过编写命令序列来自动化日常任务,从而提高工作效率。这份“Shell脚本学习指南”涵盖了从基础到高级的多个方面,帮助初学者和经验丰富的开发者深入...
Linux Shell脚本是一种强大的自动化工具,它允许用户编写...通过这个例子,你可以看到如何在Shell脚本中实现基本的用户交互和决策流程。熟悉这些基本概念后,你可以创建更复杂的脚本来自动化日常任务,提高工作效率。
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # -------------------------------------...
- **读取文件内容**:Shell脚本可以使用如`while`循环和`read`命令结合读取文件中的每行内容,并进行处理,例如去除行尾的回车符或空格。 ### 6. 特殊字符识别 由于OCR扫描技术的限制,文档中可能存在识别错误或漏...
总的来说,掌握UNIX Shell脚本编程能够帮助你更好地理解和控制UNIX系统,自动化日常任务,并为复杂系统的管理提供便利。通过学习和实践,你可以创建出功能强大且灵活的Shell脚本来解决各种问题。
这些脚本通常结合`if`条件语句、系统命令(如`id`、`w`、`who`、`grep`等)和循环结构一起使用,以实现自动化管理和监控任务。 综上所述,通过`for`、`while`循环以及`case`语句,我们可以编写出交互式的Linux脚本...
在学习和实践这些Shell编程小例子时,理解基本的语法结构、命令以及如何利用它们组合成更复杂的脚本至关重要。这不仅能提高日常的系统管理效率,还能为自动化任务和持续集成提供基础。Shell编程的灵活性和实用性使得...
这个"精心整理shell脚本100例(最新版).zip"文件很可能包含了各种实用且具有代表性的Shell脚本实例,帮助用户更好地理解和掌握Shell编程技巧。 1. **基础概念** - **Shell**: 是操作系统提供的一个命令解释器,它...
这份“Shell脚本速查手册”是学习和提升Shell脚本技能的重要资源,通过阅读和实践其中的例子,你将能够编写出高效、可靠的Shell脚本来自动化日常的系统任务。记住,不断练习和探索是掌握任何技术的关键。
接下来,你会学习到Shell脚本的基本结构,如注释、变量、条件语句(if-else)、循环结构(for、while)以及函数的使用。这些是编写任何脚本的基础,能够让你控制程序的流程并处理不同情况。 在变量部分,你将了解...
016_基础shell编程_shell脚本介绍.pdf 017_条件测试_test_expr.pdf 018_控制流结构_if_for_while_case_util_break_continue.pdf 019_Shell函数.pdf 020_向脚本传递参数_shift_getops.pdf 021_创建屏幕输出_...
Shell脚本也支持函数的定义和调用,这极大地增强了脚本的复用性和模块化程度。函数在Shell中使用`function`关键字或者直接使用名称后跟括号来定义,其调用方式同样简洁明了。 ##### 函数定义示例 ```bash #!/bin/...
在这个问题中,我们探讨了如何使用Ruby和Shell脚本实现一个简单的功能,即判断输入的分数是否及格,并根据分数范围输出相应的评价。以下是两种语言的实现细节。 首先,我们来看Ruby脚本的实现。Ruby是一种面向对象...
本文将详细介绍如何在Shell脚本中定义和使用自定义函数,并通过两个具体的例子来展示其实际应用。 #### 二、Shell脚本函数基础 ##### 2.1 函数定义 在Shell脚本中定义函数的基本语法格式如下: ```bash function ...