赞
踩
目录
要把 Shell 命令放到一个“脚本”当中,有一个前提:脚本的第一行必须写成类似这样 的格式: #!/bin/bash
这是给系统指定一款 Shell 解释器
脚本文件缺省是没有执行权限的,要使得脚本可以执行必须给他添加权限
赋值号的两边没有空格!在 Shell 脚本中,任何时候要给变量赋值,赋值号两 边一定不能有空格
变量名也有类似于 C 语言那样的规定:只能包含英文字母和数字,且不能以数字开 头
myname=”Michael Jackson”
使用变量时,需要在变量的前面加一个美元符号
系统的环境变量可以通过如下命令来查看
每个环境变量都用大写字母表示,比如 PATH。每个 环境变量都有一个值,就是等号右边的字符串。根据环境变量的不同,它们各自的含义不同
PATH 环境变量的作用是保存系统中可执行程序或脚本的所在路径,因此它的值都是 一些以分号隔开的目录,我们经常的使用办法是:不改变其原有的值,而给它再增加一个我们自己需要设置的目录 dir/,因此更有用的命令可能是类似于以下这样的
而 Shell 脚本中的所谓命令行变量,指的是在脚本内部使用用户从命令行中传递进来的参数
例如上面语句,脚本名叫 example.sh,咱们在执行他的时候顺便给了他两个参数,分别是 abcd 和 1234,要访问这两个参数以及相关的其他值,就必须使用命令行变量
引号有三种,他们是:双引号 “ ”、 单引号 ‘ ’、 反引号(抑音符) ` `
- #!/bin/bash
- var=calender
- echo "var: date" # 直接打印出 var 和 date
- echo "$var: `date`" # 打印出变量 var 的值,以及命令 date 的执行结果
- echo '$var: `date`' # 打印出$var: `date`
管道不仅可以连接两个命令,也可以连接多个命令
- ls -l | wc
- cat /etc/passwd | awk -F=/ '{print $1}' | wc
这就将三个命令连接起来,每个命令的输出都作为下一个命令的输入,连接起来就能完成强 大的功能
每一个进程在刚开始运行的时候,系统都会为他们默认地打开了三个文件,他们分别是 标准输入、标准输出、标准出错
这三个标准文件对应两个硬件设备:标准输入是键盘,标准输出和标准出错是显示器(是 的,显示器设备被打开了两次,第一次打开为行缓冲类型的标准输出,第二次打开为不缓冲 类型的标准出错)。绝大多数的 Shell 命令,默认的输入输出都是这三个文件
当我们执行命令 ls 的时候,他会默认地将结果打印到显示器上,就是因为 ls 本 来就被设计为将结果往 1 号描述符(即标准输出,当执行成功的时候)或者 2 号描述符(即 标准出错,当执行失败的时候)。而当我们打开普通文件的时候,系统也会帮我们产生一系 列后续的数字(文件描述符)来表示这些文件,比如我们紧跟着打开了文件 a.txt 和 b.doc,
.假如需要将 ls 命令的成功的输出结果(本来会被默认地输送到 1 号文件描述符的信 息)重定向到 a.txt 文件中去
ls 1> a.txt
假如需要将 ls 命令的失败的输出结果(本来会被默认地输送到 2 号文件描述符的信息)重定向到 a.txt 文件中去
- ls notexist 2> a.txt (notexist 是一个不存在的文件,所以 ls
- 命令执行会失败)
重定向标准输入也是类似的,比如直接执行 echo 命令,他将会默认地从标准输入(即 键盘)读取信息,然后打印出来。但是我们可以将标准输入重定向为 b.doc 文件:
echo 0< b.doc
标准输入输出设备文件描述符要写成&0、&1 和&2。比 如要将一句话输出到标准出错设备中去
echo “hello world” 1>&2
计算一个字符串的字符个数
- var="apple tree"
- echo "${#var}"
- 10
删除一个字符串左边部分字符
- path="/etc/rc0.d/K20openbsd-inetd"
- level=${path#/etc/rc[0-9].d/[SK]}
- echo $level
- 20openbsd-inetd
删除一个字符串右边部分字符
- path="/etc/rc0.d/K20openbsd-inetd"
- level=${path#/etc/rc[0-9].d/[SK]}
- level=${level%%[a-zA-Z]*}
- echo $level
- 20
注意
两个%%表示贪婪匹配,具体含义是:使用通配符[a-zA-Z]*从右向左“尽可能多地” 匹配字符(贪婪原则)。如果只写一个%,则无贪婪原则,那么[a-zA-Z]*将按照最少原则 匹配,即匹配 0 个字符(因为方括号星号*的含义是 0 个或多个字符)。这个道理对于删除 左边字符的井号#也是适用的:双井号##代表从左到右的贪婪匹配
有一个叫 test 的命令,专门用来实现所谓的测试语句,测试语句可以测试很多不同的 情形
例子1
要判断一个文件 file 是否存在,而且可读,如果都满足的话就将其显示 在屏幕上,脚本可以写成这样
- #!/bin/bash
- if test -e file && test -r file
- then
- cat file
- fi
- 等价于
- #!/bin/bash
- if [ -e file ] && [ -r file ]
- then
- cat file
- fi
依靠 test 语句来决定是否要执行 cat 命令,这是脚本语言中最简单的条 件判断语句,根 C 语言的 if-else 结构很类似
- if [ -e file ] && [ -r file ]
- then
- cat file
- fi
- if [ -e file ] && [ -r file ]
- then
- cat file # 如果文件存在且可读,则显示该文件内容
- elif [ -e file ]
- then
- chmod u+r file
- cat file # 如果文件存在但不可读,则加了读权限之后再显示其内容
- else
- touch file # 如果文件不存在,则创建该空文件
- fi
- read VAR # 从键盘接收一个用户输入
- case $VAR in # 判断用户输入的值$VAR
- 1) echo “one” # 如果$VAR 的值为 1,则显示 one
- ;; # 每个分支都必须以双分号作为结束(最后一个分支除外)
- 2) echo “two” 6
- ;;
- *) echo “unknown” # 星号*是 Shell 中的通配符,代表任意字符。
- esac
实现打印 1 到 100 的功能
- declare -i n=0 # 在定义变量 n 前面加上 declare -i 表示该变量为数值
- while [ $n -le 100 ] # 如果 n 的值小于等于 100,则循
- do # 循环体用 do 和 done 包含起来
- echo “$n”
- n=$n+1 # 使 n 的值加 1
- don
- declare -i n=0
- until [ $n -gt 100 ] # 如果 n 的值大于 100,则退出循环
- do
- echo “$n”
- n=$n+1
- done
列出当前目录下每个普通文件所包含的行数
- files=`ls` # 在当前目录下执行 ls,将所有的文件名保存在变量 files 中
- for a in $files # 循环地将 files 里面的每个单词赋给 a,赋完则退出循环
- do
- if [ -f $a ] # 如果文件$a 是一个普通文件,那么就计算他的行数
- then
- wc -l $a
- fi
- done
编写一个可以检测某用户是否在线的函数
- check_user( ) # 定义一个函数 check_user( ),注意括号里面没有空格
- {
- if [ $1 = "quit" ] # 若函数的第一个参数$1 为“quit”,则立即结束脚本
- then
- exit
- fi
- USER=`who | grep $1 | wc -l`
- if [ $USER -eq 0 ]
- then
- return 0 # 判断用户$1 是否在线,是则返回 1,否则返回 0
- else
- return 1
- fi
- }
- while true
- do
- echo -n "input a user name:"
- read USER
- check_user $USER # 调用 check_user,并传递参数$USER
- if [ $? -eq 1 ] # 判断 check_user 的返回值$?是否为 1
- then
- echo "[$USERNAME] online."
- else
- echo "[$USERNAME] offline."
- fi
- done
脚本中经常有信号处理的语句,最常见的情况是:当脚本收到某个信号的时候,需要处理一些清理工作,然后再退出,类似于 POSIX 编程中的信号处理。脚本中使用 trap 来达到这个目的。
trap “” INT
也可以“捕获”信号
trap do_something INT QUIT HUP
还可以指定脚本正常退出时的默认动作
trap on_exit EXIT
当一 Shell 脚本 收到某一个信号的时候,我们需要该脚本立即终止,且要执行正常退出时的清理函数
- trap on_exit EXIT
- trap “:” INT HUP
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。