Shell基础一
一 SHELL
1.shell一般代表两个层面:
1. 命令解释器,比如BASH 2. shell脚本
2.命令解释器SHELL的发展历史:
SH ---> CSH ---> KSH ---> TCSH ---> BASH
Shell是命令解释器:它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。
这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(脚本)的方式
Shell是脚本:当命令或语句不在命令行执行,而是通过一个程序文件执行时
3.查询Linux中支持的Shell类型和默认使用:
4. 常用操作系统的默认Shell
Linux 是 Bourne Again shell (bash)
Solaris 和 FreeBSD缺省的是 Bourne shell (sh)
AIX下是 Korn Shell (Ksh)
HP-UX 缺省的是 POSIX shell (sh)
二 命令的优先级
#命令分为: ==> alias ==> Compound Commands ==> function ==> build_in ==> hash ==> $PATH ==> error: command not found 获取一个命令会按照上述优先级取寻找,先找同名的alias命令,再找compound命令......
三 shell的执行方式
echo [选项] [输出内容] -e 支持反斜线控制的字符转换 -n 取消输出后行尾的换行符号
echo –e :支持反斜线支持的控制转换
示例:
#显示颜色
\e[ ; m …… \e[;m “\e[1”代表颜色输入开始;“\e[0m” 代表颜色输入结束;固定格式! 文字颜色:30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=洋红,36=青色,37=白色,39=结束 底纹颜色:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色,49=结束
# 特殊的控制显示
\e[0m 关闭所有属性
\e[1m 设置高亮度
\e[4m 下划线
\e[5m 闪烁
\e[7m 反显
\e[8m 消隐
四 shell脚本
创建: 一般以 .sh 结尾 运行: 方式1: bash script-name 或 sh script-name (推荐) 方式2: path/script-name 或 ./script-name (当前路径下执行脚本)
方式3:source script-name 或 . script-name # . 号
方式1:执行例子 [tom@localhost ~]$ echo 'user=`whoami`' > test.sh [tom@localhost ~]$ cat test.sh user=`whoami` [tom@localhost ~]$ sh test.sh [tom@localhost ~]$ echo $user #此处为空 [tom@localhost ~]$
方式3:source 或者 . 号 的特殊的传递变量值到当前Shell例子
[tomcat@localhost ~]$ source test.sh
[tomcat@localhost ~]$ echo $user
tomcat #输出内容
通过source 或 . 点号加载执行过的脚本,在脚本结束后脚本中的变量(包括函数)值在当前shell中依然存在,而sh和bash则不行。
因此,在做shell脚本开发时,如果脚本中有需求引用其它脚本的内容或者配置文件时,最好用 source 或 . 点号 在脚本开头加载该脚本或配置文件,然后在下面的内容用可以
调用source加载的脚本以及文件中的变量以及函数等内容。
五 Bash的基本功能
历史命令的查看 命令:history [选项] -c 清空历史命令 -w 把缓存中的历史命令保存到历史命令配置文件 历史命令的调用 调用之前使用过的历史命令有以下几种办法: 使用上、下光标键调用 使用“!n”,重复执行第n条历史命令 使用“!!”,重复执行上一条命令 使用“!字符”,重复执行最近一条以此字符开头的命令

history的配置 工欲善其事,必先利其器,科学地配置 history 命令,可以大大提高我们的工作效率,下面我们就来看看 history 都有哪些配置项。 (1) 设置历史记录的时间: export HISTTIMEFORMAT='%F %T ' # 注意有个空格, 这样在显示时日期与命令之间会有空格分隔 (2) 控制历史命令记录的总个数: export HISTSIZE=1000 # 设置内存中的history命令的个数 export HISTFILESIZE=1000 # 设置文件中的history命令的个数 (3) 更换历史命令的存储位置: 一般情况下,历史命令会被存储在 ~/.bash_history 文件中。如果不想存储在这个文件中,而想存储在其他文件中,那么可以通过下面的方式来更改: export HISTFILE=~/history.log (4) 还有很多更加个性化的配置供大家选择: export HISTCONTROL=erasedups # 清除整个命令历史中的重复条目 export HISTCONTROL=ignoredups # 忽略记录命令历史中连续重复的命令 export HISTCONTROL=ignorespace # 忽略记录空格开始的命令 export HISTCONTROL=ignoreboth # 等价于ignoredups和ignorespace 尊重重要命令的隐私 试想一下,我们操作 Linux 系统,如果把所有的命令都记录到 .bash_history 中,会不会有风险呢? 当然有风险啦,如果哪一天我们不幸中招,黑客攻入了我们的系统,他只要查看一下 history 就能知道我们的很多秘密,比如一些登录密码。为了避免该类事情的发生,我们希望 history 不要显示含有隐私信息的历史命令,只显示不含有隐私信息的命令。这个需求太个性化,但 history 仍然能够实现,下面我们就为大家介绍两种行之有效的解决方案。 第一种靠谱的解决方案: 第1步:设置 HISTCONTROL 环境变量:export HISTCONTROL=ignorespace。 第2步:输入重要命令时,记得在输入命令前加上空格。 第3步:执行 history,可以看到刚输入的重要命令没有出现在 history 中。 通过设置 HISTCONTROL=ignorespace,可以让 history 不记录你的特殊输入(命令前加空格),这样可以在一定程度上有效地保护我们的系统。 第二种靠谱的解决方案: 第1步:设置 HISTIGNORE 环境变量 export HISTIGNORE=*。 第2步:输入重要命令,比如 mysql-uroot-p123。 第3步:查看你的 history,可以看到刚输入的 mysql 命令没有记录在 history 中。 第4步:恢复命令的记录 export HISTIGNORE=。 第4步后,系统又恢复正常,输入的命令又能被正常记录了。 这个方法虽然略显烦琐,需要你每次在输入重要命令时都要先设置 HISTIGNORE=*,执行完命令后再设置 HISTIGNORE=,但是,这种方法能规避由于你的粗心大意(忘记命令前加空格)带来的巨大安全隐患,确保机密信息不会被泄露出去。 http://c.biancheng.net/linux/history.html
bash常用的快捷键:
输入输出重定向
标准输入输出(bash):
输出重定向:
输入重定向 :
命令:wc [选项] [文件名] -c 统计字数(字符) -w 统计单词数(字符串) -l 统计行数
多命令顺序执行:
命令:grep [选项] “关键词” 文件名 #行提取命令 -A 数字:列出符合条件的行,并将连续列出后续n行 -B 数字:列出符合条件的行,并将连续列出前面n行 -c :统计包含字符串的行一共几行! -i :忽略大小写 -n :输出行号 -v :反向查找(取反) --color=auto:搜索出的关键词高亮显示
find和grep的区别:
find: 在系统中,搜索符合条件的文件名。如果要匹配,使用通配符匹配,通配符是完全匹配
grep:在文件中,搜索符合条件的字符串。如果要匹配,使用正则表达式匹配,正则表达式是包含匹配
管道符:
格式:命令1 | 命令2 #将命令1的标准输出作为命令2的标准输入 eg: ls -l /etc | more #/etc 目录下内容较多,长格式显示后一页显示不全,用more分页显示下 xargs是实现“将标准输出作为命令的参数,一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令” find /etc -name "*.conf" | xargs ls –l #获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。 xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。 1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题 find / -name "*.log" -print0 | xargs -0 rm -f 2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l # find /etc -name "*.conf" | xargs ls –l 3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接 # cat url-list.txt | xargs wget –c 4. 查找所有的jpg 文件,并且压缩它 # find / -name "*.jpg" -type f -print | xargs tar -cvzf images.tar.gz 5. 拷贝所有的图片文件到一个外部的硬盘驱动 # ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
通配符
示例:
元字符
Bash中的特殊符号,键盘上能敲出来的特殊字符都有其特殊意义,可以替代其他的字符。强调一点:元字符是被shell解释的
作用:简化字符串、模糊匹配
1.单引号和双引号
2. 单引号当中的特殊符号没有特殊含义,双引号里面的特殊符号也没有特殊含义,但是 $ 和 ` 和 \ 是例外
3. 反引号
4. 小括号,中括号,大括号
bash是可以手动开启的,每bash一下就是开启一个shell ,相应的就会有 父shell 和 子 shell
小括号和大括号:
()执行一串命令时,需要重新开一个子shell进行执行
{}执行一串命令时,是在当前shell执行
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
()最后一个命令可以不用分号
{}最后一个命令要用分号
{}的第一个命令和左括号之间必须要有一个空格
()里的各命令不必和括号有空格
示例:
( )中执行命令是,新开启shell进行
{ } 执行命令时,就在本shell中进行