Linux shell笔记

No.001 文件安全与权限

1. umask 决定了新建文件的权限 
2. 软链接(符号链接) ln -s source_path target_path

 

No.002 find和xargs

1. find pathname -options [-print -exec -ok] 
   其中exec参数的命令格式: 'command-' {} \; 注意必须包含【{} \;】 
   -perm 按权限来查找  ex. find . -perm 755 -print 
   -mtime 按修改时间来查找 ex. find / -mtime -5 -print 更改时间5天以内 
                               find / -mtime +5 -print 更改时间5天以前 
2. xargs与-exec和-ok类似,但是限制更少,也更快 
   3种参数的命令:find . -name "*.c" -exec wc -l {} \; 
                        find . -name "*.c" -ok wc -l {} \;   每次执行命令前有提示 
                        find . -name "*.c" | xargs wc -l

 

No.003 后台执行命令

1. [crontab] [at] [&] [nohup]四种

 

No.004 文件名置换

1. 列出隐藏文件 ex. ls .*

 

No.005 shell输入与输出

1. echo输出时加上 -n 参数不换行, ex. echo -n "aaaa" 
2. tee 命令可以同时输出到屏幕和文件中 ex. ls | tee file.out 
3. 标准输入 0  标准输出 1  标准错误 2 
4. 将标准输出和标准错误输入到一个文件  ex. command >file.out 2>&1

 

No.006 命令执行顺序

1. 命令1 && 命令2    命令1执行成功后才会执行命令2 
2. 命令1 || 命令2    命令1执行失败后才会执行命令2

 

No.007 正则表达式

1. 正则表达式元字符及含义 
    ^                     只匹配行首 
    $                     只匹配行尾 
    *                     匹配0次或多次 
    []                    匹配[]内字符 
    \                     转义符 
    .                     匹配任意一个字符 
    pattern\{n\}          匹配pattern出现的次数,n次 
    pattern\{n, \}        同上,最少n次 
    pattern\{n, m\}       同上,次数在n与m之间

 

No.008 grep

1. grep 主要选项及其含义 
   -c    只输出匹配行的行数 
   -i    不区分大小写 
   -h    查询多文件时不显示文件名 
   -l    查询多文件时只输出包含匹配字符的文件名 
   -n    显示匹配行及行号 
   -s    不显示不存在或无匹配文本的错误信息 
   -v    显示不包含匹配文本的所有行 
2. 查询空行 grep '^$' filename 
3. 类名及等价的正则表达式 
   [[:upper:]]    =    [A-Z] 
   [[:lower:]]    =    [a-z] 
   [[:digit:]]    =    [0-9] 
   [[:alnum:]]    =    [0-9a-zA-Z] 
   [[:space:]]    =    空格或tab键 
   [[:alpha:]]    =    [a-zA-Z]

 

No.009 AWK

# awk的主要作用在于将文本分成各个区域,便于分别进行处理 
1. awk -F指定分隔符,-f指定awk脚本 
   ex. awk -F: 'commands' input-file(s) 
   ex. awk -f awk-script input-file(s) 
2. awk 分隔出的域用$1,$2...$n来表示,其中$0表示所有域 
3. awk 条件操作符 <, <=, >=, ==, != 
   ~  匹配正则表达式   !~  不匹配正则表达式 
4. awk 内置变量 
   ARGC        命令行参数个数 
   ARGV        命令行参数排列 
   ENVIRON     支持队列中系统环境变量的使用 
   FILENAME    awk浏览的文件名 
   FNR         浏览文件的记录数 
   FS          设置输入域分隔符,等价于命令行-F选项 
   NF          记录的域个数 
   NR          已读的记录数 
   OFS         输出域分隔符 
   ORS         输出记录分隔符 
   RS          控制记录分隔符 
   ex. awk '{print NF,NR,$0} END{print FILENAME}' input-file 
5. awk 字符串函数 
   gsub, index, length, match, split, sprint, sub, substr, substr 
6. awk 中的printf函数可以控制格式化输出 
7. awk 的循环结构 For (element in array) print array[element]

 

No.010 sed

# sed的主要作用在于过滤和查找文本中的特定内容 
1. sed 命令格式: sed [options] sed-command input-file 
                  sed [options] -f sed-script input-file

 

No.011 合并和分隔文件

1. sort, uniq, join, cut, paste, split

 

No.012 tr的用法

1. 去除oops.txt中的重复字符 tr -s "[a-z]" < oops.txt 
2. 去除oops.txt中的空行 tr -s "[\n]" < oops.txt 
3. oops.txt中小写转大写 tr -s "[a-z]" "[A-Z]" < oops.txt

 

No.013 登录环境

1. /etc/passwd 保存所有账号的基本信息(不包括密码) 
2. /etc/profile 基本的配置信息,登录时读取此文件 
3. $HOME/*profile 各个用户的profile文件,会覆盖系统的profile文件 
4. $HOME/*logout logout(键入命令exit时)是执行的脚本

 

No.014 环境和shell变量

1. shell变量的设置方式 
   Variable-name=value    设置实际值到variable-name 
   Variable-name+value    如果设置了variable-name,则重设其值 
   Variable-name:?value   如果未设置variable-name,显示未定义用户错误信息 
   Variable-name?value    如果未设置variable-name,显示系统错误信息 
   Variable-name:=value   如果未设置variable-name,设置其值 
   Variable-name:-value   如果未设置variable-name,就用value,但是不设置variable-name 
2. 设置只读变量  readonly variable-name 
3. export variable-name 可以将变量导入到子shell中 
4. shell脚本的参数 $0表示脚本名字,$1表示第一个参数......$9表示第九个参数 
5. 特定shell变量 
   $#    参数个数 
   $*    用一个字符串显示所有参数 
   $$    脚本运行的当前进程ID 
   $!    后台运行的最后一个进程的进程ID 
   $@    与$*相同,每个参数作为独立的字符串 
   $-    显示shell的当前选项,与set命令相同 
   $?    显示shell命令的退出状态,0表示无错误,其他表示有错

 

No.015 引号

1. 双引号("") 其中引用的变量会替换为变量值。比如: 
    [wangyb@localhost bash]$ STR="Hello world" 
    [wangyb@localhost bash]$ echo "$STR" 
    Hello world 
2. 单引号('') 忽略变量和其他特殊字符,单引号内任何内容都当成字符串显示。比如: 
    [wangyb@localhost bash]$ STR="Hello world" 
    [wangyb@localhost bash]$ echo '$STR'      
    $STR 
3. 单引号和双引号同时使用时,谁在外面谁起作用。比如 
    [wangyb@localhost bash]$ echo "'$STR'" 
    'Hello world' 
    [wangyb@localhost bash]$ echo '"$STR"' 
    "$STR" 
4. 反引号(``) 反引号中的内容被当做命令来执行。比如 
    [wangyb@localhost bash]$ VAR=`date` 
    [wangyb@localhos bash]$ echo $VAR 
    Thu Dec 22 22:08:07 JST 2011 
5. 转义符(\)

 

No.016 Shell脚本介绍

1. 脚本的第一行一般以  #!/bin/bash  开始 
2. 给脚本加入执行权限后就可以运行脚本了

 

#No.017 条件测试

1. 测试语法  test condition 或者 [ condition ] 使用方括号是注意在condition两边加上空格 
2. 文件状态测试 
   -d    目录            -s    文件长度大于0 
   -f    正规文件        -w    可写 
   -L    符号连接        -u    文件有suid位设置 
   -r    可读            -x    可执行 
   例子如下:测试是否为目录,也可以用 test -d bash.sh 来代替方括号 
    [root@localhost bash]# [ -d bash.sh ] 
    [root@localhost bash]# echo $? 
    1 
    [root@localhost bash]# [ -d . ]      
    [root@localhost bash]# echo $? 
    0 
3. 逻辑与 -a  逻辑或 -o  逻辑否 ! 例子如下: 
    [root@localhost bash]# [ -d bash.sh -a -d . ] 
    [root@localhost bash]# echo $? 
    1 
    [root@localhost bash]# [ -d bash.sh -o -d . ]  
    [root@localhost bash]# echo $? 
    0 
    [root@localhost bash]# [ ! -d bash.sh -a -d . ]    
    [root@localhost bash]# echo $? 
    0 
    [root@localhost bash]# [ ! -d bash.sh -a ! -d . ] 
    [root@localhost bash]# echo $? 
    1 
4. 字符串测试  [ string1 string_operator string2 ] 或者 [ string_operator string ] 
   string_operator可为:=      两个字符串相等 
                        !=     两个字符串不等 
                        -z     空串 
                        -n     非空串 
5. 数值测试  [ "number1" num_operator "number2" ] 
   num_operator可为:  -eq     数值相等 
                       -ne     数值不等 
                       -gt     number1 > number2 
                       -lt     number1 < number2 
                       -le     number1 <= number2 
                       -ge     number1 >= number2 
   例子:   [root@localhost bash]# [ "100" -gt "101" ] 
            [root@localhost bash]# echo $? 
            1 
            [root@localhost bash]# [ "100" -lt "101" ] 
            [root@localhost bash]# echo $?            
            0 
6. expr语法  expr arg1 operator arg2 
   例子:变量自增 
            [root@localhost bash]# COUNT=1        
            [root@localhost bash]# echo $COUNT    
            1 
            [root@localhost bash]# COUNT=`expr $COUNT + 1` 
            [root@localhost bash]# echo $COUNT            
            2

 

No.018 控制流结构

1. if语句格式 
   if 条件1 
   then 
        执行命令1 
   elif 条件2 
   then 
        执行命令2 
   else 
        执行命令3 
   fi 
2. case语句格式 
   case 值 in 
   模式1) 
       命令1 
       ;; 
   模式2) 
       命令2 
       ;; 
   ...... 
   easc 
其中的“模式”可以是 *(任意字符), ?(任意单字符), [..](范围内任意字符) 
“模式”中还可以是使用 | (比如 str1|str2 表示str1和str2都可以) 
3. for语句格式 
   for 变量名 in 列表 
   do 
       命令1 
       命令2 ...... 
   done 
4. until语句格式 
   until 条件 
         命令1 
         ...... 
   done 
一直执行至条件为真时才结束,至少执行一次 
5. while语句格式 
   while 条件 
         命令1 
         ...... 
   done 
6. 利用IFS来改变读取内容的分隔符 
7. 利用break和continue控制循环的执行

 

No.019 Shell函数

1. shell函数格式 
   函数名 () 
   { 
       命令1 
       ...... 
   } 
或者 
   function 函数名 () 
   { 
       命令1 
       ...... 
   } 
2. 引用其他脚本中函数  . /pathname/funcfile (<点><空格><斜线><文件完整路径名>或者<点><空格><文件相对路径名>) 
3. 函数中通过 $1, $2,......$9来获取参数

 

No.020 向脚本传递参数

1. 使用shift依次获取各个参数,比如 
   while [ $# -ne 0 ] 
   do 
         echo $1  # 通过shift,$1将依次表示各个参数 
         shift 
   done 
2. getopts语法格式 getopts operation-string variable。

 

No.021 屏幕输出

1. tput 控制屏幕上的字符输出,比如加粗字符,隐藏光标等等 
2. 改变字符颜色的方法,比如 
   echo "<CTRL-V><ESCAPE>[40;32m"   设置背景黑色(40), 字符绿色(32)

 

No.022 屏幕输入

1. 输入时进行validation check 
   “送进的是垃圾,出来的肯定是垃圾”

 

No.023 调试脚本

1. shell不会对错误进行精确定位,当shell打印错误后,需要观察报错的整个代码段 
2. 在脚本中利用set命令辅助调试 
   set -n    读命令但不执行 
   set -v    显示读取的所有行 
   set -x    显示所有命令及参数 
   - 表示打开; + 表示关闭;set +x 表示关闭显示所有命令及参数

 

No.024 shell 嵌入命令

1. set 命令在脚本中设置脚本的运行参数 
2. times命令打印shell消耗时间和运行命令消耗时间 ??? 
3. type 命令查询命令是否有效及命令类型 
4. ulimit 命令设置运行在shell上的显示限制 
5. wait 命令是父进程等待子进程完成

 

No.025 深入讨论<<

1. 创建文本  ex. cat >> file <<end 
                 > (输入内容) 
                 > end 
   (输入内容)将被追加到file中

 

No.026 shell工具

1. 用日期做文件名,ex.  $ Myfile=`date +%Y%m%d%H%M%S` 
                        $ touch $Myfile 
2. 脚本中的临时文件名中加入进程号,可以保证文件名唯一,并在脚本结束时删掉文件 
   ex. TmpFile1=/tmp/tempfile1.$$ 
       TmpFile2=/tmp/tempfile2.$$ 
       rm /tmp/*.$$ 
3. 常用信号 
   信号    信号名        含义 
   1       SIGHUP        挂起或父进程被杀死 
   2       SIGINT        来自键盘的中断信号,通常是<CTRL-C> 
   3       SIGQUIT       从键盘退出 
   9       SIGKILL       无条件终止 
   11      SIGSEGV       段(内存)冲突 
   15      SIGTERM       软件终止(缺省杀进程信号) 
4. trap 捕获信号 语法 trap "do-something" signal(s) 
   ex.  trap "" 2 3           忽略信号2和信号3,用户不能终止该脚本 
        trap "commands" 2 3   如果捕捉到信号2和信号3,就执行相应的commands 
        trap 2 3              复位信号2和3,用户可以终止该脚本 
5. eval 对变量进行2次扫描 比如: 
        [wangyb@localhost bash]$ VAR1="cat a.sh" 
        [wangyb@localhost bash]$ echo $VAR1 
        cat a.sh 
        [wangyb@localhost bash]$ eval echo $VAR1  
        cat a.sh 
        [wangyb@localhost bash]$ eval $VAR1     
        #!/bin/bash 
        TMP='HELLO' 
        sleep 2 
        times 
6. 获取命令行的最后一个参数: ex. $(eval echo \$$#) 
7. logger 命令记录日志

 

No.027 几个脚本例子

# 作者常用的几个脚本

No.028 运行级别脚本

1. 确定当前的运行级别:who -r 
2. 运行级别含义 
   运行级别0    启动和停止整个系统 
   运行级别1    单用户或管理模式 
   运行级别2    多用户模式;部分网络服务被启动。 
   运行级别3    正常操作运行模式,启动所有的网络服务 
   运行级别4    用户定义的模式,可以使用该级别来定制所需要运行的服务 
   运行级别5    有些Unix操作系统变体叫起作为缺省X-windows模式 
   运行级别6    重启动

 

No.029 cgi脚本

# 感觉现在应该不会有人用bash来开发web程序了吧

No.030 常用shell命令

1. basename : basename path 
2. cat : cat optiones file 
       -v 显示控制字符 
3. compress : compress options files 
       -v 显示压缩结果 
4. cp : cp options file1 file2 
       -i 覆盖文件之前提示用户确认 
       -p 保留权限模式和更改时间 
       -r 拷贝相应的目录及其子目录 
5. diff : diff options file1 file2 
       -c 按照标准个数输出 
       -I 忽略大小写 
6. dircmp : dircmp options directory1 directory2 
       -s 不显示相同的文件 
7. dirname : dirname pathname 
8. du : du options directory 
       -a 显示每个文件的大小,不仅是整个目录所占用的空间 
       -s 只显示总计 
9. file : file filename 
10. fuser : fuser options file 
       -k 杀死所有访问该文件或文件系统的进程 
       -u 显示访问该文件或文件系统的进程 
11. head : head -number files 
12. logname : logname (显示当前使用的登陆用户名) 
13. mkdir : mkdir options directory 
        -m 在创建目录时按照该选项的值设置访问权限 
14. more : more options files 
        -c 不滚屏,而是通过覆盖来换页 
        -d 在分页处显示提示 
        -n 每屏显示n行 
15. nl : nl options file 
        -I 行号每次增加n;缺省为1 
        -p 在新的一页不重新计数 
16. printf : printf format arguments 
17. pwd : pwd 
18. rm : rm options files 
        -i 在删除文件之前给出提示(安全模式) 
        -r 删除目录 
19. rmdir : rmdir options directory 
        -p 如果相应的目录为空目录,则删除该目录 
20. script : script option file 
        -a 将输出附加在文件末尾 
21. shutdown : shutdown now 
22. sleep : sleep number(秒数) 
23. strings : strings filename (查看二进制文件中的文本) 
24. touch : touch options filename 
        -t MMDDhhmm 创建一个具有相应月,日,时分时间戳的文件 
25. tty : tty 显示所连接的设备或终端 
26. uname : uname options 
        -a 显示所有信息 
        -s 系统名 
        -v 只显示操作系统版本或其发布日期 
27. uncompress : uncompress files 
28. wait : wait processID 
29. wc : wc options files 
        -c 显示字符数 
        -l 显示行数 
        -w 显示单词数 
30. whereis : whereis command_name 
31. who : who options 
        -a 显示所有的结果 
        -r 显示当前的运行级别 
        -s 列出用户名及时间域


从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod +x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a = "hello world"

echo $a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name = variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo "Hi, $as"

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo "Hi, ${a}s"

单引号中的变量不会进行变量替换操作。 

关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。 

 1 #!/bin/bash
 2 # we have less than 3 arguments.  Print the help text:
 3  if [ $# -lt 3 ];  then
 4 cat<<HELP
 5       ren -- renames a number of  files using sed regular expressions
 6 
 7      USAGE:  ren 'regexp' 'replacement'  files
 8      EXAMPLE:  rename all *.HTM  files in *.html:
 9       ren 'HTM$' 'html' *.HTM
10 
11 HELP
12       exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The  shift  command removes one argument from the list of
17 #  command line arguments.
18  shift
19  shift
20 # $* contains now all the  files:
21  for file in $*;  do
22  if [ -f "$file" ];  then
23     newfile=` echo "$file" | sed  "s/${OLD}/${NEW}/g"`
24          if [ -f "$newfile" ];  then
25              echo "ERROR: $newfile exists already"
26          else
27              echo "renaming $file to $newfile  "
28             mv "$file" "$newfile"
29         fi
30 fi
31 done

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if …; then

elif …; then

else

fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f "$file" ] 判断$file是否是一个文件

[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

[ -n "$a" ] 判断变量$a是否有值,测试空串用-z

[ "$a" = "$b" ] 判断$a和$b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ] && { || } [ cond2 ] …; do

done

for var in …; do

done

for (( cond1; cond2; cond3 )) do

done

until [ cond1 ] && { || } [ cond2 ] …; do

done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1 )

… ;;

pattern 2 )

… ;;

*)

… ;;

esac


我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case $OPTION in

c) COPIES=$OPTARG

     ehco "$COPIES";;

v) echo "suyang";;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in …; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo "Your choice?"

select var in "a" "b" "c"; do

break

done

echo $var

----------------------------

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{

}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh ?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值