Erik's Blog

Shell 编程简介

(更新于 )Linux#Shell

Shell 编程简介

登录系统检查的文档

  1. /etc/profile : 首先,系统会检查这个文件,以定义如下这些变量:PATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEINPUTRC。 还指定了 umaskulimit 的设定,ulimit 是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。 最后,它还会检查并执行 /etc/profile.d/*.sh 那些 script。

  2. ~/.bash_profile : 定义 USERNAMEBASH_ENVPATH。其中的 PATH 除了现有的 $PATH 之外,还会再加入使用者相关的路径,你会发现 root 和普通帐号的路径是不一样的; 而 BASH_ENV 是下一个要检查的文档:

  3. ~/.bashrc : 首先是 alias (别名) 设定。然后有一行 . /etc/bashrc 执行设定。

  4. /etc/bashrc : 基本上,这里的设定,是所有使用者在获得 shell 的时候都会采用的。这里指定了一些 terminal 设定,以及 shell 提示字符等等。

  5. ~/.bash_login : 如果 ~/.bash_profile 不存在,则使用这个文档。

  6. ~/.profile : 如果 ~/.bash_profile~/.bash_login 都不存在,则使用这个文档。

  7. ~/.bash_logout : 这个文档通常只有一个命令:clear,也就是把屏幕显示的内容清掉。如果要在登出 shell 的时候,执行一些动作,例如:清空临时文档(假如你使用了临时文档)、还原某些设定、或是执行某些备份之类的。

你可以通过修改上面这些文件,来调整你进入 shell 后的变数值。 一般使用者可以修改其家目录( ~/ )中的文件,以进行个人化的设定; 而作为 root,你可以修改 /etc/下面的文件,设定大家共用的变数值。

一旦修改了 /etc/profile~/.bash_profile 文件,其新设定要在下次登录的时候才生效。如果你不想退出,又想使用新设定,那可以用 source 命令来抓取 : source ~/.bash_profile

shell 命令的格式

$ 命令 [选项] [参数] : 选项是包括一个或多个字母的代码,前面必有一个 -号,选项可以用于改变命令执行动作的类型。

bash 配置文件

  • .bash_history 记录了用户以前输入的命令
  • .bash_logout 退出 shell 时要用的命令
  • .bash_profile 登录 Bash 时要执行的命令,以及配置的 Bash 环境变量。
  • .bashrc 每次打开新的 Bash 时,要执行的命令,以及配置的 Bash 环境变量。

由于 .bash_profile 经常被设置成先读到 .bashrc 的内容,所以如果图省事的话,可以把所有配置都放进 .bashrc 中, 以上的文件是每一位用户都有的设置,系统级的设置存储在文件 /etc/profile 文件 /etc/bashrc 及目录 /etc/profile.d 中。 用户优先把自己的个性化设置存放在用户根目录配置文件中,当系统级与用户级的设置发生冲突时,将优先采用用户级的设置。

bash 的提示符

echo $PS1 可以显示当前的设定

可以对 shell 进行设置来显示用户当前所在目录。

cd /etc/profile.d export PS1="\u@\h \w\\$"

即先采用环境变量测试,找到了合适的设置后加到 .bashrc 中

环境变量

在 shell 配置文件中一般定义了很多的环境变量。命令 set 可以列出所有当前定义的所有环境变量。

环境变量可以分为三种:系统变量,环境变量和用户变量。

  • shell 常用的系统变量:
表示方法 描述
$n $1 表示第一个参数,$2 表示第二个参数……
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以“参数1,参数2,参数3……”形式保存所有参数
$@ 以“参数1”,“参数2”……形式保存所有参数
$$ 本程序的PID(进程ID号)
$! 上一条命令的PID
  • 常用的 shell 环境变量
名称 描述
PATH 命令搜索路径,以冒号为分隔符。注意与DOS下不同的量,当前目录不在系统路径里。
HOME 用户根目录的路径名。命令“cd”的默认参数
COLUMNS 定义了命令编辑模式下可使用命令行的长度
EDITOR 默认的行编辑器
VISUAL 默认的可视编辑器
HISTFILE 命令历史文件
HISTSIZE 命令历史文件最多可包含的命令条数
IFS 定义Shell使用的分隔符
LOGNAME 用户登录名
MAIL 指向一个需要shell监视其修改时间的文件。当该文件修改后,shell将提醒用户查收新邮件
SUALMAILCHECK shell检查邮件的周期,单位是秒
SHELL shell的路径名
TERM 终端类型
PS1 主命令提示符
PS2 二级命令提示符,命令执行过程中要求输入数据时用
PS3 select的命令提示符
PS4 调试命令提示符
MANPATH 寻找手册页的路径
LD_LIBRARY_PATH 寻找动态链接库文件的路径,以冒号分隔

所有的环境变量都在 shell 配置文件中定义,一般来说,变量名用大写 在 linux 系统中,当设置一个变量时,直接用名称,而不需要加符号 $,而要获变量值的话,就要在变量名前加符号“$“。 如果在变量名前没有符号 “$”,变量名会被当作普通文本。

注:处理 $PATH 时需要注意:该变量不能替换,而是要将新的字符添加到原来的值中。在大多数情况下,不能用 “/PATH=/some/directory”, 因为这将删除“$PATH“中其他的所有目录。只能进行添加:PATH=$PATH:/some/directory 也就是说,PATH 的值被设成当前的值+新添加的目录

新的变量仅是一个局部变量,仅在当前终端中有用。若要定义一个全局变量,就要将局部变量输出(export) : export PATH=$PATH:/some/directory

如果要将目录永久添加到环境变量 $PATH 中就必须把 export 那行命令添加到用户要目录下的 bash_profile 文件中。注意:不能放到 .bashrc 中,否则会导致 PATH 意外加长。

Bash 的功能

  • 自动补齐 : Tab 键。

  • 命令行的历史事件 : history 命令。

  • 系统保存的历史事件数保存在 HISTSIZE 变量中。其默认值是 1000,可修改。

  • 历史事件被保存在一个文件中,文件名由变量 HISTSIZE 指定。通常其默认名是 .bash_history

  • shell 还支持对历史命令的增量搜索。Ctrl+r

  • 编辑命令行快捷键

    • Ctrl+k : 删除从光标到行尾的部分
    • Ctrl+u : 删除从光标到行首的部分
    • Ctrl+w : 删除从光标到当前单词开头的部分
    • Ctrl+a : 将光标移到行首
    • Ctrl+e : 将光标移动到行尾
    • Ctrl+y : 插入最近删除的单词
    • Alt+d : 删除从光标到当前单词结尾的部分
    • Alt+a : 将光标移动到当前单词的开头
    • Alt+e : 将光标移动到当前单词的结尾
    • Alt+. : 使用上一条命令的参数
    • !$ : 重复前一个命令最后的参数
  • 命令的组合

    • 组合方式一 : command1;command2 特点:先执行命令1,不管命令1是否出错,命令2都要执行
    • 组合方式二 : command1 && command2 特点:只有在命令1正确运行后才能执行命令2
    • 组合方式三 : command1 || command2 特点:如果第一个命令执行失败了,就执行每二个命令
    • 组合方式四 : (command1 ;command2:……) 在当前shell中执行{command1 ;command2:……}在子shell中执行
  • 任务调度(jobbing) 与后台化(backgrounding)

    • 方法一 : 在命令的后面加一个 命令 jobs 可以列出当前终端中运行着的命令与程序
    • 方法二 : 先使用快捷键 ctrl+z 挂起终端中正在运行的程序,然后使用 bg 命令将其放到后台去执行。
  • 命令的替换 语法 : command1 $(command2)command1 'command2'

  • 文件名匹配通配符

    • * : 匹配文件名中任何字符串,包括空格串
    • ? : 匹配文件名中的任何单个字符
    • [...] : 匹配“[]”中所包括的任何字符
    • [!...] : 匹配“[]”中非感叹号“!”之后的字符
    • [!0-9] : 表示非数字开头的字符串
  • 输入与输出重定向 在 shell 中执行命令的时候,每个进程都和 3 个打开的文件相联系,并使用文件描述符来引用这些文件。系统中实际上有 12 个文件描述符,0,1,2分别是标准输入、标准输出和标准错误输出。

    • stdin : 标准输入,使用文件描述符 0
    • stdout : 标准输出,使用文件描述符 1
    • stderr : 标准错误输出,使用文件描述符2

几个命令的介绍

echo

作用:来显示文本或变量,也可以把字符串输入到文件。 形式:echo string

如果想把一个字符串输出到一个文件中,就可以使用重定向符号 > >>

read

可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么命令 read 将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车。

cat

cat 命令可以用来显示文件内容、创建文件,还可以用它来显示控制字符。 如上所示,如果想建一个文件并且输入一些内容,就可以使用 cat 命令,用 cat 把输出定向到该文件,就可以了。这时输入是键盘,输出是文件,当想结束输入时按下 ctrl+d 组合键即可。

常用文件重定向命令

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

shell中的快捷方式(别名)

别名(alias) 例如:~ 就代表了用户的根目录 别名定义的语法是:alias shortcut='command' 删除一个别名使用 unalias 不带参数将列出当前系统定义的所有别名 注:如果命令中有空格,就需要使用引号。同时单引号与双引号是有区别的 同时,别名不能重复,但一个命令可以有多个别名。 几种引号的说明 : 单引号 : 由单引号括起来的字符都作为普通字符出现。 双引号 : 由双引号括起来的字符,除符号 $,\,'," 仍是特殊字符外,其余的字符都作为普通字符来对待。

控制 bash 的工作方式

bash 中有一些特殊的变量,能控制 bash 以不同的方式工作。如 变量 noclobber 能防止在重定向输出时意外地覆盖一个文件。通过命令 set 可以设置变量 noclobber 的值。命令 set 有两个参数:一个是指定变量开(on)或关(off),另一个就是特殊变量的变量名。 要使某一特殊变量有效,用 -o 选项;要使其关,就用 +o 选项 此外,还有两个特殊变量也较用 ignoreeof: 用来禁止 ctrl+d 来退出 shell noglob : 让 shell 不扩展文件名中一些特殊的字符或字符串。例如,字符 * 等不再为通配符。