Shell 编程简介
Shell 编程简介
登录系统检查的文档
-
/etc/profile: 首先,系统会检查这个文件,以定义如下这些变量:PATH、USER、LOGNAME、MAIL、HOSTNAME、HISTSIZE、INPUTRC。 还指定了umask和ulimit的设定,ulimit 是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。 最后,它还会检查并执行/etc/profile.d/*.sh那些 script。 -
~/.bash_profile: 定义USERNAME、BASH_ENV、PATH。其中的 PATH 除了现有的 $PATH 之外,还会再加入使用者相关的路径,你会发现 root 和普通帐号的路径是不一样的; 而 BASH_ENV 是下一个要检查的文档: -
~/.bashrc: 首先是 alias (别名) 设定。然后有一行. /etc/bashrc执行设定。 -
/etc/bashrc: 基本上,这里的设定,是所有使用者在获得 shell 的时候都会采用的。这里指定了一些 terminal 设定,以及 shell 提示字符等等。 -
~/.bash_login: 如果~/.bash_profile不存在,则使用这个文档。 -
~/.profile: 如果~/.bash_profile和~/.bash_login都不存在,则使用这个文档。 -
~/.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 | 用户登录名 |
| 指向一个需要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 不扩展文件名中一些特殊的字符或字符串。例如,字符 * 等不再为通配符。