鸟哥的Linux私房菜(基础版)第十一章学习笔记

学习笔记

Bash Shell

管理整个硬件的是核心(kernel),通常用户(user)都是以 Shell 来与核心沟通

什么是Shell

在这里插入图片描述 在这里插入图片描述

系统的 shell 与 /etc/shells 功能

系统可用的shell:检查 /etc/shells 文件,至少有下面几个可用的shells:

  • /bin/sh (已经被 /bin/bash 所取代)
  • /bin/bash (就是 Linux 预设的 shell)
  • /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
  • /bin/tcsh (整合 C Shell ,提供更多的功能)
  • /bin/csh (已经被 /bin/tcsh 所取代)
  • /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)

主要的两个shell:bash 、csh 系统默认:bash shell

Bash Shell 的功能

BASH 主要的优点:

  • 命令记忆能力(类似 DOS 的 doskey 功能)
    命令行按“上下键”,就可以找到前一个输入的命令。
    用户执行的命令记录在:~/.bash_history
  • 命令与文件补全功能
    [Tab] 接在一串命令的第一个字的后面,则为命令补全;
    [Tab] 接在一串命令的第二个字以后时,则为“档案补齐”。
  • 命令别名(alias)设置功能
    举例,直接设置别名:
    alias lm=‘ls -al’
  • 作业控制(jobs)、前台、后台控制
    可以在单一登录的环境中,达到多任务的目的
  • Shell scripts 的强大功能
  • 通配符

Bash Shell 的内置命令:type

type命令可以观察命令是来自于外部命令(指的是其他非 bash 套件所提供的命令)或是内置在 bash 中的。

[root@linux ~]# type [-tpa] name
参数:
    :不加任何参数时,则 type 会显示出那个 name 是外部命令还是 bash 内置的命令!
-t  :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
      file    :表示为外部指令;
      alias   :表示该指令为命令别名所设定的名称;
      builtin :表示该指令为 bash 内建的指令功能;
-p  :如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令;
-a  :会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias

执行命令

[root@linux ~]# command [-options] parameter1 parameter2 ...
                  指令     选项      参数(1)    参数(2)
说明:
0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行文件』
1. command 为指令的名称,例如变换路径的指令为 cd 等等;
2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h;
   有时候完整参数名称会输入 -- 符号,例如 --help;
3. parameter1 parameter2.. 为依附在 option 后面的参数,
   或者是 command 的参数; 
4. command, -options, parameter1.. 这几个咚咚中间以空格来区分,
   不论空几格 shell 都视为一格; 
5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 <CR> 字符,
   他代表着一行指令的开始启动。
6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号,
   使指令连续到下一行。注意! \ 后就立刻接特殊字符。
7. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。

Shell 的变量功能

为了与自定义变量区别,环境变量通常以大写字母表示。

变量的获取与设置:echo、变量设置规则、unset

显示变量内容:

[root@linux ~]# echo $variable
[root@linux ~]# echo ${variable}

设置或修改变量内容:用“等号(=)”连接变量与它的内容

变量的设置规则:

① 变量与变量内容以等号“=”来连接;
② 等号两边不能直接接空格符;
③ 变量名称只能是英文字母与数字,但数字不能是开头字符;
④ 若有空格符,可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但要特别注意,双引号内的特殊字符可以保持变量特性,但单引号内的特殊字符则仅为一般字符;
⑤ 必要时需要以转义字符『 \ 』将特殊符号(如 Enter、$、\、空格符、' 等)变为一般符号;
⑥ 在一串命令中,还需要通过其他命令提供的信息,可以使用这样的方式『 `command` 』;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)
⑦ 若变量为扩展变量内容,需以双引号及 $变量名称 如 『 "$PATH":/home』继续累加内容;
⑧ 若该变量需要在其他子程序中执行,则需要用 export 使变量变成环境变量,如『export PATH』;
⑨ 通常大写字母为系统默认变量,自行设置变量可以使用小写字母,便于判断(根据用户兴趣与喜好)
⑩ 取消变量的方法为:『unset 变量名称』。

在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?

在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行如同上面范例六的执行内容啰。

另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:

[root@linux ~]# ls -l `locate crontab`

如此一来,先以 locate 将文件名数据都列出来,再以 ls 指令来处理

变量的用途

① 简化路径名称
② 程序和脚本中

环境变量的功能

查看有多少变量:

  1. 一些环境变量的说明:env

     范例一:列出目前的 shell 环境下的所有环境变量与其内容。
     [root@linux ~]# env
     HOSTNAME=linux.dmtsai.tw   <== 这部主机的主机名
     SHELL=/bin/bash            <== 目前这个环境下,使用的 Shell 是哪一个程序?
     TERM=xterm                 <== 这个终端机使用的环境是什么类型
     HISTSIZE=1000              <== 这个就是『记录指令的笔数』在 FC4 默认可记录 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: <== 一些颜色显示
     ENV=/root/.bashrc          <== 使用的个人环境配置文件
     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.UTF-8           <== 这个与语系有关,底下会再介绍!
     HOME=/root                 <== 这个用户的家目录啊!
     _=/bin/env                 <== 上一次使用的指令的最后一个参数(或指令本身) 
    

上面这些变量有些什么功用:

  • HOME : 代表用户的家目录。还记得我们可以使用 cd ~ 去到用户的家目录吗?或者利用 cd 就可以直接回到用户家目录了。那就是取用这个功能啦~ 有很多程序都可能会取用到这个变量的值喔!

  • SHELL : 告知我们,目前这个环境使用的 SHELL 是哪支程序? 如果是 bash 的话,默认是 /bin/bash 的啦!

  • HISTSIZE : 这个与『历史命令』有关,我们曾经下达过的指令可以被系统记录下来,而记录的『数目』则是由这个值来设定的。

  • ENV : 这个使用者所使用的个人化环境配置文件的读取文件。

  • MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件 (mailbox)。

  • PATH : 就是执行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。

  • LANG : 这个重要!就是语系文件~很多数据都会用到他, 举例来说,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。

  • RANDOM : 这个玩意儿就是『随机数』的变量啦!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:

      [root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number
      8   <== 此时会随机取出 0~9 之间的数值喔!
    
  1. 其他所有的变量说明:set

     [root@linux ~]# set
     BASH=/bin/bash           <== bash 的主程序放置路径
     BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" 
     [5]="i386-redhat-linux-gnu")      <== bash 的版本啊!
     BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊!
     COLORS=/etc/DIR_COLORS.xterm      <== 使用的颜色纪录档案
     COLUMNS=115              <== 在目前的终端机环境下,使用的字段有几个字符长度
     HISTFILE=/root/.bash_history      <== 历史命令记录的放置档案,隐藏档
     HISTFILESIZE=1000        <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。
     HISTSIZE=1000            <== 目前环境下,可记录的历史命令最大笔数。
     HOSTTYPE=i386            <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件
     IFS=$' \t\n'             <== 预设的分隔符
     LINES=35                 <== 目前的终端机下的最大行数
     MACHTYPE=i386-redhat-linux-gnu    <== 安装的机器类型
     MAILCHECK=60             <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!
     OLDPWD=/home             <== 上个工作目录。我们可以用 cd - 来取用这个变量。
     OSTYPE=linux-gnu         <== 操作系统的类型!
     PPID=20046               <== 父程序的 PID (会在后续章节才介绍)
     PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
                              <== 上面这个是命令提示字符!与底下也有关。
     PS1='[\u@\h \W]\$ '      <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的
                                  [root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的!
     RANDOM=13586             <== 随机数啊!上面已经提过啰~
     SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系
     name=VBird               <== 刚刚设定的自定义变量也可以被列出来喔!
     $                        <== 目前这个 shell 所使用的 PID
     ?                        <== 刚刚执行完指令的回传值。
    

比较重要的变量:

  • PS1:(提示符的设置)
    FC4 的环境下, 默认的 bash 的 PS1 变量内的特殊符号代表意义:

      \d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1"
      \H :完整的主机名。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名就是 linux.dmtsai.tw
      \h :仅取主机名的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省略。
      \t :显示时间,为 24 小时格式,如: HH:MM:SS
      \T :显示时间,12 小时的时间格式!
      \A :显示时间,24 小时格式, HH:MM
      \u :目前使用者的账号名称;
      \v :BASH 的版本信息;
      \w :完整的工作目录名称。家目录会以 ~ 取代;
      \W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。
      \# :下达的第几个指令。
      \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
    
  • $:(关于本 shell 的 PID)
    PID:进程号;想知道shell的PID,使用 echo $$即可

  • ?:(关于上个执行指令的回传码)
    当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』,一般就是以非为 0 的数值来取代。

  • OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)
    与程序安装有关

  1. 自定义变量转成环境变量:export
    让变量内容在子程序中使用:
    export 变量
    如果仅下达export而没有变量会将所有的“环境变量”显示出来。

语系文件的变量(locale)

[root@linux ~]# LANG         <==主语言的环境
[root@linux ~]# LC_CTYPE     <==字符辨识的编码
[root@linux ~]# LC_NUMERIC   <==数字系统的显示讯息
[root@linux ~]# LC_TIME      <==时间系统的显示数据
[root@linux ~]# LC_COLLATE   <==字符串的比较与排序等
[root@linux ~]# LC_MONETARY  <==币值格式的显示等
[root@linux ~]# LC_MESSAGES  <==讯息显示的内容,如菜单、错误讯息等
[root@linux ~]# LC_ALL       <==语言环境的整体设定。

语系文件都放置在: /usr/lib/locale/
语系配置文件:/etc/sysconfig/i18n

变量的有效范围

环境变量可以让子程序继续引用的原因:

  • 启动一个 shell 时,操作系统分配一块内存给 shell 使用,这个区域的环境变量可以让子程序访问;
  • 利用 export 功能,可以让变量内容写道上述内存中(环境变量);
  • 当加载另一个 shell 时(即启动子程序,而离开原来的父程序),子 shell 可以将父 shell 的环境变量所在的内存导入自己的环境变量区块中。

变量键盘读取、数组与声明:read、array、declare

  1. read

     [root@linux ~]# read [-pt] variable
     参数:
     -p  :后面可以接提示字符!
     -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者
    
  2. declare / typeset

     [root@linux ~]# declare [-aixr] variable
     参数:
     -a  :将后面的 variable 定义成为数组 (array)
     -i  :将后面接的 variable 定义成为整数数字 (integer)
     -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
     -r  :将一个 variable 的变量设定成为 readonly(只读) ,该变量不可被更改内容,也不能 unset(取消设置)
    
  3. 数组属性 array 说明

    数组的设置方式:var[index]=content
    读取: echo “${数组}”

与文件系统及程序的限制关系:ulimit

[root@linux ~]# ulimit [-SHacdflmnpstuv] [配额]
参数:
-H  :hard limit ,严格的设定,必定不能超过设定的值;
-S  :soft limit ,警告的设定,可以超过这个设定值,但是会有警告讯息,
      并且,还是无法超过 hard limit 的喔!也就是说,假设我的 soft limit
      为 80 , hard limit 为 100 ,那么我的某个资源可以用到 90 ,
      可以超过 80 ,还是无法超过 100 ,而且在 80~90 之间,会有警告讯息的意思。
-a  :列出所有的限制额度;
-c  :可建立的最大核心档案容量 (core files)
-d  :程序数据可使用的最大容量
-f  :此 shell 可以建立的最大档案容量 (一般可能设定为 2GB)单位为 Kbytes
-l  :可用于锁定 (lock) 的内存量
-p  :可用以管线处理 (pipe) 的数量
-t  :可使用的最大 CPU 时间 (单位为秒)
-u  :单一用户可以使用的最大程序(process)数量

命令别名与历史命令

命令别名设置:alias、unalias

alias 设置别名
unalias 取消别名

历史命令:history

查询命令

[root@linux ~]# history [n]
[root@linux ~]# history [-c]
[root@linux ~]# history [-raw] histfiles
参数:
n   :数字,意思是『要列出最近的 n 笔命令行表』的意思!
-c  :将目前的 shell 中的所有 history 内容全部消除
-a  :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,
      则预设写入 ~/.bash_history
-r  :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
-w  :将目前的 history 记忆内容写入 histfiles 中!

执行命令

[root@linux ~]# !number
[root@linux ~]# !command
[root@linux ~]# !!
参数:
number  :执行第几笔指令的意思;
command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;
!!      :就是执行上一个指令(相当于按↑按键后,按 Enter)

Bash Shell 使用环境

登陆消息显示数据: /etc/issue、/etc/motd

issue 内各代码的意义:

代码说明
\d本地端时间的日期
\l显示第几个终端接口
\m显示硬件的等级 (i386/i486/i586/i686…)
\n显示主机的网络名称
\o显示 domain name(域名)
\r操作系统的版本 (相当于 uname -r)
\t显示本地端时间的时间
\s操作系统的名称
\v操作系统的版本

/etc/issue.net :它是提供给 telnet 这个远程登录程序用的。 当我们使用 telnet 连接到主机时,主机的登入画面就会显示 /etc/issue.net 而不是 /etc/issue

环境设置文件: bashrc, ~/.bashrc, ~/.profile, profile…,/etc/inputrc, source

  1. 系统设置值
    ① /etc/sysconfig/i18n :语言/语系设置文件
    ② /etc/profile :该文件设置了几个重要变量(PATH USER MAIL HOSTNAME HISTSIZE UMASK等)
    ③ /etc/bashrc :确定 umask 的功能,也确定提示符的内容(PS1)
    ④ /etc/profile.d/*.sh :针对 bash 及 C-shell 规范了一些数据
    ⑤ /etc/man.config :规范了使用 man 的时候, man page 的路径到哪里去寻找

  2. 个人设置值
    ① ~/.bash_profile(默认), ~/.bash_login, ~/.profile :三个只要一个即可,定义个性化的路径(PATH)与环境变量等,只在登录时读取一次。
    ② ~/.bashrc :个人化设定值,例如命令别名、路径等,每次执行 shell 脚本时,都会重新读取这个文件。
    ③ ~/.bash_history :历史命令,登录时读取
    ④ ~/.bash_logout :记录『当我注销 bash 后,系统再帮我做完什么动作后才离开』

    让设置文件立即生效:

     [root@linux ~]# source file
    
  3. 登录 shell 与非登录 shell
    当登入 Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile, 这三个档案的优先级已经在上面提过,自行参考一下。至于在取得 login shell 后继续动作的其他 non-login shell ,读取的就是仅有 ~/.bashrc 啰~

终端的环境设置:stty、set

root@linux ~]# stty [-a]
参数:
-a  :将目前所有的 stty 参数列出来;	

几个重要的参数代表的含义:

  • eof : End of file (文件结束)的意思,代表『结束输入』。
  • erase : 向后删除字符,
  • intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;
  • kill : 删除在目前指令列上的所有文字;
  • quit : 送出一个 quit 的讯号给目前正在 run 的程序;
  • start : 在某个程序停止后,重新启动他的 output
  • stop : 停止目前屏幕的输出;
  • susp : 送出一个 terminal stop 的讯号给正在 run 的程序。

如果你想要用 [ctrl]+h 来进行字符的删除,那么可以下达:

[root@linux ~]# stty erase ^h

从此之后,你的删除字符就得要使用 [ctrl]+h 啰,按下 [backspace] 则会出现 ^? 字样了, 如果想要恢复利用 [backspace] ,就下达 stty erase ^? 即可

set来设置:

[root@linux ~]# set [-uvCHhmBx]
参数:
-u  :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
-v  :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
-x  :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
-h  :预设启用。与历史命令有关(下节介绍);
-H  :预设启用。与历史命令有关(下节介绍);
-m  :预设启用。与工作管理有关(未来介绍);
-B  :预设启用。与刮号 [] 的作用有关;
-C  :预设不启用。若使用 >  等,则若档案存在时,该档案不会被覆盖。

[root@linux ~]# echo $-
himBH
# 那个 $- 变量内容就是 set 的所有设定啦! bash 预设是 himBH 喔!

其实我们还有其他的按键设定功能呢!就是在 /etc/inputrc 这个档案里面设定。

[root@linux ~]# cat /etc/inputrc

通配符与特殊符号

符号内容
*通配符,代表 0 个或多个字符(或数字)
?通配符,代表『一定有』一个字母
#注释,这个最常被使用在 script(脚本) 当中,视为说明!
\转义符号,将『特殊字符或通配符』还原成一般字符
分隔两个管道命令
;连续命令的分隔(注意!与管线命令并不相同)
~用户的家目录
$变量之前需要加的变量替换值
&将指令变成后台工作
!逻辑运算意义上的『非』 not 的意思!
/路径分隔的符号
>, >>输出导向,分别是『替换』与『累加』
单引号,不具有变量置换的功能
"具有变量置换的功能!
两个『 ` 』中间为可以先执行的指令!
( )在中间为子 shell 的起始与结束
[ ]在中间为字符的组合
{ }在中间为命令区块的组合!
组合按键执行结果
Ctrl + C终止当前的命令
Ctrl + D输入结束(EOF),例如邮件结束的时候
Ctrl + M就是 Enter 啦!
Ctrl + S暂停屏幕的输出
Ctrl + Q恢复屏幕的输出
Ctrl + U在提示字符下,将整行命令删除
Ctrl + Z『暂停』当前的命令

数据流重导向

命令的执行如图:
在这里插入图片描述
执行命令时,这个命令可能会通过文件读入数据,经过处理后,再将数据输出到屏幕上。如图,标准输出和标准错误分别表示标准输出和标准错误输出。

在这样的过程中,可以将标准错误(简称stderr)与标准输出(简称stdout)传送到其他不同的地方,而不是屏幕上。传送的目标处,通常是文件或设备。

传送的命令如下:
① 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
② 标准输出(stdout):代码为 1 ,使用 > 或 >> ;
③ 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

/dev/null 垃圾桶 (一般错误信息发到垃圾桶)
将错误输出和标准输出到同一个文件中 2> &1

使用命令输出重导向的场合:

  • 当屏幕输出的信息很重要,而且我们需要将它存下来的时候;
  • 背景执行中的程序,不希望它干扰屏幕正常的输出结果时;
  • 一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望它可以存下来时;
  • 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
  • 错误讯息与正确讯息需要分别输出时。

命令执行的判断根据:;、&&、||

;为命令分隔符,;前命令执行完后才执行;后的命令

&& 前为true 才执行&& 后的命令

||前为false 才执行 || 后的命令

由于指令是一个接着一个去执行的,因此,如果真要使用判断, 那么这个 && 与 || 的顺序就不能搞错~一般来说,判断式最多会有三个,也就是:

command1 && command2 || command3

而且顺序通常不会变,因为一般来说, command2 与 command3 会放置肯定可以执行成功的指令

管道命令(pipe)

管道命令“|”仅能处理通过前面一个命令传来的正确信息。
在这里插入图片描述

选取命令:cut、grep

  1. cut

     [root@linux ~]# cut -d'分隔字符' -f fields
     [root@linux ~]# cut -c 字符区间
     参数:
     -d  :后面接分隔字符。与 -f 一起使用;
     -f  :依据 -d 的分隔字符将一段消息分为数段,用 -f 取出第几段的意思;
     -c  :以字符 (characters) 的单位取出固定字符范围;
    

    常用在分析数据或文字数据时,cut 在处理多空格相连的数据时,会比较吃力。

  2. grep

     [root@linux ~]# grep [-acinv] '搜索字符串' filename
     参数:
     -a :将 binary(二进制) 文件以 text(文本) 文件的方式搜索数据
     -c :计算找到 '搜索字符串' 的次数
     -i :忽略大小写的不同,所以大小写视为相同
     -n :顺便输出行号
     -v :反向选择,即显示出没有 '搜索字符串' 内容的那一行!
    

    grep 可以解析一行文字,取得关键词,若该行存在关键词,就会整行列出来。

排序命令:sort、wc、unip

  1. sort

     [root@linux ~]# sort [-fbMnrtuk] [file or stdin]
     参数:
     -f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
     -b  :忽略最前面的空格符部分;
     -M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
     -n  :使用『纯数字』进行排序(默认是以文字类型来排序的);
     -r  :反向排序;
     -u  :就是 uniq ,相同的数据中,仅出现一行代表;
     -t  :分隔符,预设是 tab 键;
     -k  :以那个区间 (field) 来进行排序的意思。
    
  2. uniq

     [root@linux ~]# uniq [-ic]
     参数:
     -i  :忽略大小写字符的不同;
     -c  :进行计数
    
  3. wc

     [root@linux ~]# wc [-lwm]
     参数:
     -l  :仅显示多少行;
     -w  :仅显示多少字(英文单词);
     -m  :多少字符。
    

双向重导向:tee

tee 的工作流程:
在这里插入图片描述

[root@linux ~]# tee [-a] file
参数:
-a  :以累加 (append) 的方式,将数据加入 file 当中

字符转换命令:tr、col、join、paste、expand

  1. tr

     [root@linux ~]# tr [-ds] SET1 ...
     参数:
     -d  :删除消息当中的 SET1 这个字符串;
     -s  :替换掉重复的字符!
     注:DOS下的换行符 ^M = \r
    
  2. col

     [root@linux ~]# col [-x]
     参数:
     -x  :将 tab 键转换成对等的空格键
    
  3. join

     [root@linux ~]# join [-ti12] file1 file2
     参数:
     -t  :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
           如果两个文件相同,则将两个数据联成一行,且第一个字段放在第一个!
     -i  :忽略大小写的差异;
     -1  :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;
     -2  :代表『第二个文件要用那个字段来分析』的意思。
    
  4. paste

     [root@linux ~]# paste [-d] file1 file2
     参数:
     -d  :后面可以接分隔字符。预设是以 [tab] 来分隔的!
     -   :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
    
  5. expand

     [root@linux ~]# expand [-t] file
     参数:
     -t  :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
           我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
    

    unexpand 将空白转成[Tab]

拆分命令:split

[root@linux ~]# split [-bl] file PREFIX
参数:
-b  :后面可接要拆分的文件大小,可加单位,例如 b, k, m 等;
-l  :按行数来进行拆分。

参数代换:xargs

[root@linux ~]# xargs [-0epn] command
参数:
-0  :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
      可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e  :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到
      这个字符串时,就会停止继续工作!
-p  :在执行每个指令的 argument(参数) 时,都会询问使用者的意思;
-n  :后面接次数,每次 command 指令执行时,要使用几个参数的意思。
当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出喔!

减号(-)的用途

stdin 与 stdout 可以利用减号 “-” 来替代

课后习题及答案

  1. 在 Linux 上可以找到哪些 shell(举出三个) ?哪个文件记录可用的 shell ?而 Linux 默认的 shell 是什么?

    ① /bin/bash, /bin/tcsh, /bin/csh
    ②/etc/shells
    ③ bash ,亦即是 /bin/bash。

  2. 在 shell 环境下,有个提示字符 (prompt),它可以修改吗?要改什么?默认的提示字符内容是什么?

    可以修改的,改 PS1 这个变量,这个 PS1 变量的默认内容为:『[\u@\h \W]$』

  3. 如何显示 HOME 环境变量?

    echo $HOME

  4. 如何得知目前的所有变量与环境变量的设定值?

    环境变量用 env 而所有变量用 set 即可显示

  5. 是否可以设定一个变量名称为 3myhome ?

    不行!变量不能以数字做为开头,参考变量设定规则的内容

  6. 在这样的练习中『A=B』且『B=C』,若我下达『unset $A』,则取消的变量是 A 还是 B?

    被取消的是 B 喔,因为 unset $A 相当于 unset B 所以取消的是 B ,A 会继续存在!

  7. 如何取消变量与命令别名的内容?

    使用 unset 及 unalias 即可

  8. 如何设定一个变量名称为 name 内容为 It’s my name ?

    name=It’s\ my\ name 或 name=“It’s my name”

  9. 环境变量文件的加载顺序?

    先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取 ~/.bash_profile 及 ~/.bashrc 等档案!

  10. man page 的路径设置文件是什么?

    /etc/man.config 或 /etc/man.conf

  11. 试说明 ', ", 与 ` 这些符号在变量定义中的用途?

    参考变量规则那一章节,其中, " 可以具有变量的上下文属性, ’ 则仅有一般字符,至于 ` 之内则是可先被执行的指令。

  12. 转义符号 \ 有什么用途?

    可以用来转义特殊字符,例如 Enter, $ 等等,使成为一般字符!

  13. 连续命令中, ;, &&, || 有何不同?

    分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值需为 0 则 command2 才会被执行, || 则与 && 相反!

  14. 如何将 last 的结果中,独立出账号,并且印出本月份曾经登入过的账号?

    last | cut –d “ “ –f1 | sort | uniq

  15. 请问 foo1 && foo2 | foo3 > foo4 ,这个指令串当中, foo1/foo2/foo3/foo4 是指令还是文件? 整串指令的意义为?

    foo1/foo2 与 foo3 都是指令, foo4 是装置或档案。整串指令意义为:
    当 foo1 执行结果有错误时,则该指令串结束;
    若 foo1 执行结果没有错误时,则执行 foo2 | foo3 > foo4 ;
    foo2 将 stdout 输出的结果传给 foo3 处理;
    foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/档案

  16. 如何列出在 /bin 底下任何以 a 为开头的文件名的详细资料?

    ls -l /bin/a*

  17. 如何列出 /bin 底下,文件名为四个字符的文件?

    ls -l /bin/???

  18. 如何列出 /bin 底下,文件名开头不是 a-d 的文件?

    ls -l /bin/[!a-d]*

  19. 当我离开 bash 后,希望系统可以帮我将最近工作的:1.)工作日期; 2.)100 个历史命令独立 记录到 ~/.bash_localcom 档案中,该如何设定?

    我可以编辑 ~/.bash_logout ,将这个档案内容变成:
    # ~/.bash_logout
    date >> ~/.bash_localcom
    history 100 >> ~/.bash_localcom
    clear

  20. 我想要让终端机接口的登入提示字符修改成我自己喜好的模样,应该要改哪里?(filename)

    /etc/issue

  21. 承上题,如果我是想要让使用者登入后,才显示欢迎讯息,又应该要改哪里?

    /etc/motd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ʚ兔子的先森ɞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值