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
history

 

 

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
xargs补充

 

通配符

 

示例:

   

 

元字符

  Bash中的特殊符号,键盘上能敲出来的特殊字符都有其特殊意义,可以替代其他的字符。强调一点:元字符是被shell解释的

  作用:简化字符串、模糊匹配

 

 

1.单引号和双引号

   

 

 

 2. 单引号当中的特殊符号没有特殊含义,双引号里面的特殊符号也没有特殊含义,但是 $ 和 ` 和 \ 是例外

   

 

 3. 反引号

   

 

4. 小括号,中括号,大括号

bash是可以手动开启的,每bash一下就是开启一个shell ,相应的就会有 父shell 和 子 shell

小括号和大括号:

()执行一串命令时,需要重新开一个子shell进行执行
{}执行一串命令时,是在当前shell执行
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
()最后一个命令可以不用分号
{}最后一个命令要用分号
{}的第一个命令和左括号之间必须要有一个空格
()里的各命令不必和括号有空格

 

示例:

( )中执行命令是,新开启shell进行

   

 

{ } 执行命令时,就在本shell中进行

   

 

posted @ 2018-04-25 15:10  shadow3  阅读(149)  评论(0)    收藏  举报