Linux学习笔记(二)

2018/09/13 Linux

Linux学习笔记之学习Shell

什么是shell?

shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。

查看可以使用的shell

vim /etc/shells

Bash Shell功能

/bin/bash 是 Linux 默认的 shell

  1. 记忆使用过的命令(默认的命令记忆功能可以到达 1000 个,存储在~/.bash_history)
  2. 命令与文件补全功能([tab] 按键的好处)
  3. 命令别名配置功能: (alias)(alias lm=’ls -al’ ls-al等同于lm)
  4. 工作控制、前景背景控制(& 后台运行)
  5. 程序化脚本: (shell scripts)
  6. 通配符: (Wildcard)(*)

命令过长使用 \进行分割

变量的取用与配置

利用 echo 就能够读出,只是需要在变量名称前面加上 $ , 或者是以 ${变量} 的方式来取用都可以 例子: echo $HOME 或者是 echo ${HOME}

取消变量的方法为使用 unset

env: 观察环境变量与常见环境变量说明

HOSTNAME=www.vbird.tsai    <== 这部主机的主机名
TERM=xterm                 <== 这个终端机使用的环境是什么类型
SHELL=/bin/bash            <== 目前这个环境下,使用的 Shell 是哪一个程序?
HISTSIZE=1000              <== 『记录命令的笔数』在 CentOS 默认可记录 1000 笔
USER=root                  <== 使用者的名称啊!
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:
or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0
0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=
00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3
1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00
;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示
MAIL=/var/spool/mail/root  <== 这个用户所取用的 mailbox 位置
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:
/root/bin                  <== 不再多讲啊!是运行文件命令搜寻路径
INPUTRC=/etc/inputrc       <== 与键盘按键功能有关。可以配置特殊按键!
PWD=/root                  <== 目前用户所在的工作目录 (利用 pwd 取出!)
LANG=en_US                 <== 这个与语系有关,底下会再介绍!
HOME=/root                 <== 这个用户的家目录啊!
_=/bin/env                 <== 上一次使用的命令的最后一个参数(或命令本身)

set: 可以观察环境变量+自定义变量

export: 自定义变量转成环境变量

子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量,所以自定义变量需要export才会被子程序发现

history:历史命令( ~/.bash_history)

[root@www ~]# !number	 
[root@www ~]# !command [root@www ~]# 
!! 选项与参数: 
number  :运行第几笔命令的意思; 
command :由最近的命令向前搜寻『命令串开头为 command』的那个命令,并运行; !!      :就是运行上一个命令(相当于按↑按键后,按 Enter)  
[root@www ~]# history    
66  man rm    
67  alias    
68  man history    
69  history  
[root@www ~]# !66  <==运行第 66 笔命令
[root@www ~]# !!   <==运行上一个命令,本例中亦即 !66  
[root@www ~]# !al  <==运行最近以 al 为开头的命令(上头列出的第 67 个)`

bash进站信息

在 /etc/issue 里面

`[root@www ~]# cat /etc/issue CentOS release 5.3 (Final) Kernel \r on an \m `
issue 内的各代码意义
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686…);
\n 显示主机的网络名称;
\o 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\s 操作系统的名称;
\v 操作系统的版本。

通配符

符号 意义
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

除了通配符之外,bash 环境中的特殊符号有哪些呢?底下我们先汇整一下:

符号 内容
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定(后两节介绍);
; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将命令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, » 数据流重导向:输出导向,分别是『取代』与『累加』
<, « 数据流重导向:输入导向 (这两个留待下节介绍)
’ ‘ 单引号,不具有变量置换的功能
” “ 具有变量置换的功能!
两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!

管线命令 (pipe)

  • grep(grep 则是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来)

  • sort

    范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何?
    [root@www ~]# cat /etc/passwd | sort -t ':' -k 3
    root:x:0:0:root:/root:/bin/bash
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    
  • uniq

如果我排序完成了,想要将重复的数据仅列出一个显示,可以怎么做呢?

范例二:承上题,如果我还想要知道每个人的登陆总次数呢?
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c
      1
     12 reboot
     41 root
      1 wtmp
# 从上面的结果可以发现 reboot 有 12 次, root 登陆则有 41 次!
# wtmp 与第一行的空白都是 last 的默认字符,那两个可以忽略的!
  • wc

  • `[root@www ~]# wc [-lwm] 选项与参数: -l  :仅列出行; -w  :仅列出多少字(英文单字); -m  :多少字符;`
    

Search

    Table of Contents