230 likes | 535 Views
使用 Shell(bash). 刘西洋. 大纲. 1 控制台 1.1 Linux 控制台终端 1.2 终端模拟器 2 shell 有几种 3 使用 bash 4 bash 脚本编程 参见 《Redhat Linux 指南:服务器设置与程序设计篇 》 第 11 章, bash 程序设计。. 1 控制台. Linux 控制台终端 可以使用 Alt+[F1-F6] 组合键切换和英文终端。 Linux 终端模拟器 图形界面下的终端模拟器。比如, kde 的 konsole 程序和 gnome 的 gnome-terminal. 1.1 控制台终端.
E N D
使用Shell(bash) 刘西洋
大纲 • 1 控制台 • 1.1 Linux控制台终端 • 1.2 终端模拟器 • 2 shell有几种 • 3 使用bash • 4 bash脚本编程 • 参见《Redhat Linux指南:服务器设置与程序设计篇》第11章,bash程序设计。
1 控制台 • Linux控制台终端 • 可以使用Alt+[F1-F6]组合键切换和英文终端。 • Linux终端模拟器 • 图形界面下的终端模拟器。比如,kde的konsole程序和gnome的gnome-terminal
1.1 控制台终端 • 控制台终端,包含两种设备文件/dev/ttyn, /dev/console。 • Linux 中,键盘显示器组合被称为控制台。它仿真了类型为Linux的一种终端,设备文件ttyN与之相关联。第一个在控制台上登录时,使用tty1。 • tty1–tty6等称为虚拟终端,而tty0则是当前虚拟终端的一个别名,可以使用Alt+[F1-F6]组合键切换虚拟终端。 • /dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。只有在单用户模式下,才允许用户登录控制台。 • 命令ps -ax查看进程与哪个控制终端相连。
1.2 终端模拟器 • 终端模拟器,图形环境下的控制台终端模拟程序。主要有konsole,gnome-terminal和Xterm三种。 • 终端模拟器,让我们在不脱离图形环境的情况下使用终端。并且提供更多控制台终端无法提供的附加功能。比如,鼠标操作和复制粘贴操作。提供更便利的功能。
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 曾使用。
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 作业管理
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目录下
3.2 bash 环境变量 • 变量,用特定名称保存一定值﹐以供程序将来使用。环境变量,具有全局特性的常规变量。 • 当我们登陆系统﹐首先获得 shell进程﹐再输入的命令都属于这个 shell 的子进程。当获得 shell 的时候﹐同时也获得一些环境设定。 • export通过导出已定义变量,创建环境变量。 • export命令指示系统为每个所创建的shell定义该变量的一个副本。新shell也可创建自己独有的环境变量。 • 环境变量一般在:~/.bash_profiles中声明
不可不知的几个变量 • $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
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
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 交换当前字符和前一个字符的位置
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 删除整行
3.5 bash提示符 • linux 提示符即linux等待用户输入时所显示的字符: • 默认有PS1 PS2 PS3和PS4四个变量表示 • PS1 主提示符变量 • PS2 副提示符变量,命令行里较长命令的换行提示信息 • PS3 选择提示符变量,用户shell编程里,需要获取用户输入是的提示符。 • PS4 shell编程调试时使用。
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
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
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.
3.8 bash命令串接 • 标准输入输出和错误文件: • 标准输入文件stdin,文件描述符为0,默认对应终端的键盘; • 标准输出文件stdout,文件描述符为1,默认对应终端的屏幕; • 标准错误输出文件stderr,文件描述符为2,默认对应终端的屏幕; • 重定向符号: < 输入重定向符号 >输出重定向符号 | 管道串接符号 • Unix主张:每个命令实现简单的功能,并做好它。复杂的功能由多个命令的结合来实现。
实例:统计/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
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不带参数即将带+号的作业作为变量输入。 -号表示再次之的默认作业
要控制一个作业,将其结束或调到前台运行,可以使用%加作业号操作作业要控制一个作业,将其结束或调到前台运行,可以使用%加作业号操作作业 • % 指最后放到后台的作业。 • %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
实例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
下一讲 Linux用户管理