Download ppt - 使用 Shell(bash)

Transcript
Page 1: 使用 Shell(bash)

河南宏力集团网络管理部内部 Linux培训

使用 Shell(bash)

刘西洋

Page 2: 使用 Shell(bash)

大纲1 控制台

1.1 Linux 控制台终端1.2 终端模拟器

2 shell 有几种3 使用 bash4 bash 脚本编程

参见《 Redhat Linux 指南:服务器设置与程序设计篇》第 11 章, bash 程序设计。

Page 3: 使用 Shell(bash)

1 控制台Linux 控制台终端

可以使用 Alt+[F1-F6] 组合键切换和英文终端。Linux 终端模拟器

图形界面下的终端模拟器。比如, kde 的konsole 程序和 gnome 的 gnome-terminal

Page 4: 使用 Shell(bash)

1.1 控制台终端 控制台终端,包含两种设备文件 /dev/ttyn, /dev/console 。 Linux 中,键盘显示器组合被称为控制台。它仿真了类型

为 Linux 的一种终端,设备文件 ttyN 与之相关联。第一个在控制台上登录时,使用 tty1 。

tty1–tty6 等称为虚拟终端,而 tty0 则是当前虚拟终端的一个别名,可以使用 Alt+[F1-F6] 组合键切换虚拟终端。

/dev/console 即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。只有在单用户模式下,才允许用户登录控制台。

命令 ps -ax 查看进程与哪个控制终端相连。

Page 5: 使用 Shell(bash)

1.2 终端模拟器终端模拟器,图形环境下的控制台终端模

拟程序。主要有 konsole , gnome-terminal和 Xterm 三种。

终端模拟器,让我们在不脱离图形环境的情况下使用终端。并且提供更多控制台终端无法提供的附加功能。比如,鼠标操作和复制粘贴操作。提供更便利的功能。

Page 6: 使用 Shell(bash)

2 Shell 有几种 sh , Steve Bourne 编写。多见 AT&T Unix system csh , Bill Joy 编写,多见 berkeley Unix system 。 bash ,即 Bourne Again Shell , Brian Fox 编写。 tcsh , csh 的开源版本。与 csh 有抹不清的关系。 ash , 轻量级 sh , kenneth almquist 编写,用于

netbsd ,多用于嵌入式。 ksh , David Korn 编写, Unix system V systems 默

认 shell 。 AIX 默认 shell 。 zsh , sh 的一种克隆版, Mac OS X 曾使用。

Page 7: 使用 Shell(bash)

3 使用 BASH

3.1 Bash 配置文件3.2 Bash 环境变量3.3 Bash 内置命令3.4 Bash 快捷键3.5 Bash 提示符

3.6 Bash 历史命令3.7 Bash 命令嵌套3.8 Bash 命令串接3.9 Bash 作业管理

Page 8: 使用 Shell(bash)

3.1 bash 配置文件 [root@hongli ~]# ls –al

权限 硬链接数 属用户 属组 大小 最后修改日期 文件名 -rw------- 1 root root 13650 Apr 2 15:29 .bash_history

-rw-r--r-- 1 root root 24 Mar 10 18:35 .bash_logout

-rw-r--r-- 1 root root 191 Mar 10 18:35 .bash_profile

-rw-r--r-- 1 root root 176 Mar 10 18:35 .bashrc

硬链接数表示当前文件硬链接 count 值。普通目录硬链接数为: 2+ 子目录数。/etc/bash_profile 系统为所有用户登录设置环境信息。第一次登录执行/etc/bashrc 所有用户登录时所执行的脚本。第一次登录执行。.bash_history 命令执行历史记录.bash_logout 用户退出登录时执行的脚本,一般内容为 clear 清屏命令。.bash_profile bash 用户配置文件,包含环境变量声明和一些其他配置.bashrc 用户登录时, bash 执行脚本可以配置命令别名等内容.bash_profile 调用 .bashrc

/etc/skel 目录, skel 是 skeleton 的缩写 , 每当新建一个用户的时候 ( 通过 useradd 命令 ),

/etc/skel 目录下的文件 , 都会原封不动的复制到新建用户的 home 目录下

Page 9: 使用 Shell(bash)

3.2 bash 环境变量 变量,用特定名称保存一定值﹐以供程序将来使

用。环境变量,具有全局特性的常规变量。 当我们登陆系统﹐首先获得 shell 进程﹐再输入的

命令都属于这个 shell 的子进程。当获得 shell 的时候﹐同时也获得一些环境设定。

export 通过导出已定义变量,创建环境变量。export 命令指示系统为每个所创建的 shell 定义该变量

的一个副本。新 shell 也可创建自己独有的环境变量。 环境变量一般在: ~/.bash_profiles 中声明

Page 10: 使用 Shell(bash)

不可不知的几个变量 $HOME 和 ~ 用户主目录

[root@hongli ~]# echo ~ [root@hongli ~]# echo $HOME /root /root

$SHELL 用户 shell 类型 [root@hongli ~]# echo $SHELL /bin/bash

$PS1 用户 shell 提示符格式 [root@hongli ~]# echo $PS1 [\u@\h \W]\$

$PATH 用户执行命令时,系统寻找路径 [root@hongli ~]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/

local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

Page 11: 使用 Shell(bash)

3.3 bash 内置命令典型命令:

cd 切换目录 pwd 显示当前工作目录 test 测试(也有 /bin/test 这条命令) set unset 变量声明和取消 echo 回显 exit 退出 shell history 显示历史执行命令 type 显示命令的位置 fg bg 作业控制,把作业后台和前台轮调

获取方法: [linux@localhost ~]$ help [linux@localhost ~]$ man bash [linux@localhost ~]$ info bash

Page 12: 使用 Shell(bash)

3.4 Bash 快捷键 指针定位

Ctrl+F Character forward 前进一个字符 . Ctrl+B Character backward 后退一个字符 . Alt+F Word forward 前进一个单词 Alt+B Word backward 后退一个单词 Ctrl+A Beginning of line 定位到行开始 Ctrl+E End of line 定位到行结束 Ctrl+L Clear screen 清屏

行编辑 Ctrl+D Delete current 删除当前字符 Backspace Delete previous 删除前一个字符 Ctrl+T Transpose character 交换当前字符和前一个字符的位置

Page 13: 使用 Shell(bash)

Alt+T Transpose words 交换当前字符和前一个单词的位置 Alt+U Uppercase word 大写当前单词 Alt+L Lowercase word 小写当前单词 Alt+C Capitalize word 把当前单词写成首字母大写形式 Ctrl+V Insert special character 插入一个特殊字符 例如插入

tab , Ctrl+V+Tab.

行剪切和粘贴 Ctrl+K Cut end of line 剪切到行尾的所有字符 Ctrl+U Cut beginning of line 剪切到行首的所有字符 . Ctrl+W Cut previous word 剪切指针前的整个单词 . Alt+D Cut next word 剪切指针后的整个单词 .. Ctrl+Y Paste recent text 粘贴最后一次剪切的内容 Alt+Y Paste earlier text 回到上次剪切,然后粘贴 Ctrl+C Delete whole line 删除整行

Page 14: 使用 Shell(bash)

3.5 bash 提示符linux 提示符即 linux 等待用户输入时所显

示的字符:默认有 PS1 PS2 PS3 和 PS4四个变量表示

PS1 主提示符变量 PS2 副提示符变量,命令行里较长命令的换行

提示信息PS3 选择提示符变量,用户 shell 编程里,需要

获取用户输入是的提示符。PS4 shell 编程调试时使用。

Page 15: 使用 Shell(bash)

PS1 变量可以使用的参数值(部分):\! 历史命令号,为 bash_history 文件中最大的 number

\# 本次登陆后,输入的有效的命令的个数。\$ 提示字符,如果是 root 时,提示符为: # ,普通用户则为: $

\W 提示当前工作目录\[ 后跟一些不需要在提示副显示的字符,例如设置颜色。\] 对应 \[ 结束设置\\ 显示反斜杠\d 以“星期 月 日”的格式 显示当前日期 \h 显示主机名 .

\n 在命令提示符中创建新行。\s 显示当前 shell 名称\t 以 “小时 分 秒”的形式显示当前日期\u 显示用户名 .

\w 显示当前工作目录的完整成路径

http://hi.baidu.com/%C9%ED%B4%A6%BD%AD%BA%FE/blog/item/44855139a436b3d8d462254a.html

Page 16: 使用 Shell(bash)

3.6 bash 历史命令 !n 调用 number 为 n 的命令 !! 直接调用上一条命令 !?string? 从后往前,匹配历史命令中字符为 string 的命令

,然后调用。 10 history 11 date 12 echo $SHELL 13 echo $PS1 14 data -h [honliv@hongli root]$ !?dat? data -h bash: data: command not found

Page 17: 使用 Shell(bash)

3.7 bash 嵌套命令有时候我们需要将一个命令的输出作为另

一个命令的参量,这就需要命令嵌套。命令嵌套的方式有一下两种方式:

$(command)和 `command`

实例:[honliv@hongli ~]$ echo "there are $(ls -l /etc | grep ^dr | wc -l) diretcories in /etc."

there are 99 diretcories in /etc.

[honliv@hongli ~]$ echo "there are `ls -l /etc | grep ^dr | wc -l` diretcories in /etc."

there are 99 diretcories in /etc.

Page 18: 使用 Shell(bash)

3.8 bash 命令串接 标准输入输出和错误文件:

标准输入文件 stdin ,文件描述符为 0 ,默认对应终端的键盘; 标准输出文件 stdout ,文件描述符为 1 ,默认对应终端的屏幕; 标准错误输出文件 stderr ,文件描述符为 2 ,默认对应终端的屏幕;

重定向符号:< 输入重定向符号 > 输出重定向符号| 管道串接符号

Unix 主张:每个命令实现简单的功能,并做好它。复杂的功能由多个命令的结合来实现。

Page 19: 使用 Shell(bash)

实例:统计 /etc 目录下所有非隐藏目录个数 方法 1

[honliv@hongli ~]$ ls -l /etc > etc.txt

[honliv@hongli ~]$ cat etc.txt | more

total 3088

-rw-r--r-- 1 root root 2518 Mar 21 20:35 DIR_COLORS

-rw-r--r-- 1 root root 2420 Mar 21 20:35 DIR_COLORS.xterm

drwxr-xr-x 4 root root 4096 Mar 13 11:39 NetworkManager

……

[honliv@hongli ~]$ grep ^dr etc.txt | wc -l

99

方法 2 [honliv@hongli ~]$ echo /etc > 1.txt

[honliv@hongli ~]$ cat 1.txt

/etc

[honliv@hongli ~]$ ls -l `cat 1.txt` | grep ^dr | wc -l

99

方法 3 [honliv@hongli ~]$ ls -l /etc | grep ^dr | wc -l

99

Page 20: 使用 Shell(bash)

3.9 bash 作业管理 bash支持作业管理,背景执行命令。 命令:

jobs 显示作业 fg 把作业调到前台运行 bg 把作业调到后台运行

实例: vi 执行时,在一般模式下可按 ctrl+z暂停进程[root@hongli ~]# jobs

[1]+ Stopped vi install.log

[2] Stopped vi install.log.syslog

[3]- Stopped vi upgrade.log

+号表示默认作业, fg 不带参数即将带 +号的作业作为变量输入。-号表示再次之的默认作业

Page 21: 使用 Shell(bash)

要控制一个作业,将其结束或调到前台运行,可以使用 % 加作业号操作作业 % 指最后放到后台的作业。 %string 指作业命令以 string 开头的作业, string必须唯一标识一个作业。否则将导致错误

%?string 指在命令任何位置包含 string 的作业,同样必须唯一标识一个作业 %-- 指在最后停止的作业前停止的作业,即倒数第二个停止的作业。

实例 1 bg 命令后台执行挂起的作业find /usr > /tmp/allusefiles1

[root@hongli ~]# jobs

[2] Stopped vi install.log.syslog

[3]- Stopped vi upgrade.log

[4]+ Stopped find /usr > /tmp/allusefiles1

[root@hongli ~]# bg %4

[4]+ find /usr > /tmp/allusefiles1 &

[root@hongli ~]# jobs

[2]- Stopped vi install.log.syslog

[3]+ Stopped vi upgrade.log

[4] Done find /usr > /tmp/allusefiles1

Page 22: 使用 Shell(bash)

实例 2 通配符匹配的方式调用作业[root@hongli ~]# jobs

[1] Stopped find /usr > /tmp/allusefiles1

[2] Stopped find /usr > /tmp/allu1sefiles

[3]- Stopped find /usr > /tmp/allusefiles2

[4]+ Stopped find /usr > /tmp/allusefiles3

[root@hongli ~]# fg %find

-bash: fg: find: ambiguous job spec

[root@hongli ~]# fg %?3

find /usr > /tmp/allusefiles3

[root@hongli ~]# jobs

[1] Stopped find /usr > /tmp/allusefiles1

[2]- Stopped find /usr > /tmp/allu1sefiles

[2]+ Stopped find /usr > /tmp/allusefiles2

[root@hongli ~]# fg %?files3

-bash: fg: %?files3: no such job

[root@hongli ~]# fg %?files2

find /usr > /tmp/allusefiles2

[root@hongli ~]# fg %?u1se

find /usr > /tmp/allu1sefiles

[root@hongli ~]# fg %find

find /usr > /tmp/allusefiles1

Page 23: 使用 Shell(bash)

Recommended