首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

Shell 入门基本知识 __ 第一部分

作者:  时间: 2011-04-03

1. 简介:

    Shell 是一种接口程序,用户可以通过它可以与 Unix/Linux 操作系统的核心程序进行交互。Bash 即 Bourne again shell ( /bin/bash )。Shell 程序相当于 dos 的批处理文件,一条命令就可以完成某项任务,也可以通过循环、条件控制、数学运算、文件测试、传递参数等方式完成复杂的管理任务。它提供个人化的用户环境,在 shell 的初始化文件 ( .profile, .login, .cshrc, .tcshrc 等)中完成,这些文件包括设置终端机键盘,定义窗口的特征,设置变量,定义查找路径,许可权限,提示符号和终端型以及设置特殊应用程序所需要的变量。

编写完 Shell 脚本之后,将它保存至文件中。通常情况下,我们需要改变脚本的运行方式:加上可执行权限再运行。

修改权限: chmod +x scriptName

执行:./scriptName

2. Shell 脚本中的特殊字符。

1 双引号 ("") : 用来使 shell 无法认出空格、制表符和其他大多数特殊字符。不过有三个特殊值在双引号中不被忽略:$ , \ , ` 。
2 单引号 ('') : 用来使 shell 无法认出所有特殊字符。单引号忽略所有的特殊字符。
3 反引号 (``) : 用来替换命令。
4 反斜杠 ( \ ) : 反斜杠是一般用作转义字符,或称逃脱字符,用来使 shell 无法认出以上的特殊字符,使其后的特殊字符失去特殊含义。
5 分号 (;) : 允许在一行上放多个命令。
6  & : 命令后执行。eg: ls -al &
7 括号 () : 创建成组的命令。
8 大括号 {} : 创建命令块。
9 竖杠(|) : 管道标示符。
10 < > & : 表示重定向。
11  * ? [ ] ! : 表示模式匹配。
12  $ : 变量名的开头。
13  #: 表示注释(第一行除外)。
14  空格,制表符,换行符: 当做空白。

3. Shell 特性。

3.1. 别名:通过 alias 命令,用户可以给一些命令取别名,以减少键盘敲击次数。

eg: alias lt = `ls -alt`  # 即 lt 能够完成 `ls -alt`这命令干的活。

3.2. 命令替换:将命令的输出结果赋给一个变量,或将命令的输出结果代入字符串。使用反引号 `` 来执行命令替换。

eg: echo "The hour is `date`"  #其中 `date` 就是命令替换。

3.3. 后台处理:一个终端可以同时运行多个程序。使用方法:nohup command & 。查看后台命令使用:jobs -l

3.4. 管道(|) : 把一个命令的输出传递给另一个命令作为输入。

eg: ls | sort  # 将 ls 命令输出的结果排序。

3.5. 重定向(<, <<, >, >>): 与管道相关,可以改变程序运行的输入来源和输出地点。

<  输入重定向。 << 输入重定向。

>  输出重定向。 >> 输出重定向(追加)

3.6. 文件重定向:

1 输入文件——标准输入 0(缺省是键盘,也可以是文件或其他命令的输出)
2 输出文件——标准输出 1(缺省是屏幕,也可以是文件)
3 错误输出文件——标准错误 2(缺省是屏幕,也可以是文件)

改变程序运行的输入来源和输出地点:

1 command > filename 把标准输出重定向到一个新文件
2 command >> filename 把标准输出重定向到一个文件(追加)
3 command 1 > filename 把标准输出重定向到一个文件
4 command > filename 2 >&2 把标准输出和标准错误一起重定向到一个文件中
5 command 2 > filename 把标准错误重定向到一个文件中
6 command 2 >> filename 把标准输出重定向到一个文件中(追加)
1 command >> filename 2 > &1 把标准输出和标准错误一起重定向到一个文件中(追加)
2 command < filename > filename2 command 命令以 filename 文件作为标准输入,以 filename2 文件作为标准输出
3 command << delimiter 从标准输入中读入,直到遇到 delimiter 分界符
4 command < &m 把文件描述符 m 作为标准输入
5 command > &m 把标准输出重定向到文件描述符m中
6 command 2 < &- 关闭标准输入

eg: $grep "trd" book.txt 2 > /dev/null  # 把错误信息扔给 /dev/null ,/dev/null 不会保存错误信息,实质上就是丢失错误信息。

3.7. 模式匹配。用正则表达式来实现。

eg: ls *.txt #显示以 txt 为扩展名的文件。

3.8. 变量与运算符。

1 变量用来存储信息,与 = 号之间不能有空格。
2 本地变量:在用户现在的 shell 生命期的脚本中存在使用。
3 eg: variablename=value #设置变量名及值。
4 $readonly [-p] #查看当前设置的本地变量
5 环境变量:用于所有用户进程(称为子进程)。登录进程称为父进程。shell 中执行的用户进程均称为子进程。环境变量可用于所有子进程,包括编辑器、脚本和各种应用程序。
6 eg: export 用于设置环境变量 env 查看环境变量 readonly 如果使用了该命令,变量就不可以被修改或清除了。
7 getenv() 访问一个环境变量,输入参数是需要访问的变量的名字。返回值是一个字符串,如果所访问的环境变量不存在,则返回 NULL 。
8 setenv() 在程序里面设置某个环境变量的函数。
9 unsetenv() 清除某个特定的环境变量的函数。
10 变量替换:用变量的值来替换它的名字。在变量名前加上 $ ,使用 echo 命令可以显示单个变量的值。
11 eg: var="123"; echo ${var}
12 echo ${varname} # 显示实际值到 varname 中
13 echo ${varname:+value} # 如果设置了 varname ,则显示其值value, 否则为空。
14 echo ${varname:?value} # 如果未设置 varname,则显示用户自定义的错误信息 value。
15 echo ${varname:-value} # 如果未设置 varname, 则显示其值 value,否则显示原来的值。
16 echo ${varname "=value} # 如果未设置 varname, 设置其值为 value ,并显示。
17 位置变量:形式为 $0, $1, $2, $3, ... $9 。
18 标准变量:bash 默认建立了一些标准环境变量,可在 .profile 中定义。
19 特殊变量:
20 $# : 传递到脚本中参数个数。 $$ : 脚本运行的当前进程ID号
21 $* : 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此项参数可超过 9 个。
22 $! : 后台运行的最后一个进程的 ID 号。 $@ : 与 $# 相同,但是使用时加上引号,并在引号中返回每个参数。
23 $- : 显示 shell 使用的当前选项,与 set 命令功能相同
24 $? : 显示最后命令的退出状态。0表示没有错误,其他任何值都表示有错误。
25 影响变量的命令:readonly, set, unset

3.9. 输入、输出控制

echo : 显示文本或变量,或者把字符串输入到文件中。-e : 表示解析转义字符。 -n : 回车不换行。 \c : 不换行。 \t : 跳格。 \n : 换行。

read : 从键盘或文件中的某一行文本中读入信息,并将其值赋给一个变量。如果只指定了一个变量,read 将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车。如果给出了两个变量,shell 将用空格作为变量之间的分隔壁符,如果变量少于单词数,那么第一个单词将赋给第一个变量,之后那部分全部赋给第二个变量。

cat : 可以用它来显示文件的内容。创建文件,还可以用它来显示控制字符。它会一下显示出完整文件的内容,不会在文件分页符处停下来。要想分页可以使用 more 或 pg 命令。

tee : 可以把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件。

第二部分: