zoukankan      html  css  js  c++  java
  • Linux基础篇 六 (bash shell基础 (vi /etc/shells))

    http://hi.baidu.com/shmily_soc/blog/item/5173a587fed9733666096ef6.html

    管理整个硬件的其实是核心 (kernel),那我们一般使用者 (user) 则是以 shell 来跟核心沟通,让核心达到我们所想要达到的工作目的!shell可以是文字接口模式的,也可以是 KDE 之类的图形接口控制软件。

    1. 变量的取用与设定:echo, 变量设定规则, unset (变量与环境变量有区别,前者只能在本shell内用,后者才可以在其它子程序(shell)共用)
    [root@linux ~]# echo   $变量名 ---->变量定义或查看
    [root@linux ~]# PATH=$PATH:/home/dmtsai/bin   ---->变量累加
    [root@linux ~]# export PATH     ---->若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量
    [root@linux ~]# unset 变量名
    [root@linux ~]# cd /lib/modules/`uname -r`/kernel   ---->进入到目前核心的模块目录!!!

       >>在变量的设定当中,单引号与双引号的用途有何不同? --->双引号仍然可以保有变量$name的内容. 而使用了单引号的时候,$name 将失去原有的变量内容,仅为一般字符的显示型态而已!!!
       >>在指令下达的过程中,quote ( ` ) 这个符号代表的意义为何?--->在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息, 如上面的 `uname -r`, 显示时就是kernel的版本号!!!
       >>设定比较长的目录名称成为一个四个字符的变量,如此一来只要输入『 cd $VARI 』这个指令,马上就移动到该路径下!

    2. 环境变量的说明: env
    [root@linux ~]# env 或 export ----->列出目前的 shell 环境下的所有环境变量与其内容。
    [root@linux ~]# set ----->列出所有定义的变量,包括自己定义的.

    > $ : 表示本shell的PID , 所以:
    [root@linux ~]# echo $$ ----->获得当前所用shell的PID号.

    >自订变量转成环境变量: export   
    [root@linux ~]# export 变量名 ----->注意变量名前无符合$. 两者区别是前者不可被子程序引用,而后者可以. 因为自行设定的变量,只在目前这个shell环境当中存在,在子程序中将不会存在此一变量。除非使用 export 将自订变量变成环境变量。

    3. 变量键盘读取、数组与宣告: read, array, declare
    [root@linux ~]# read [-pt] variable ----->由键盘输入一个值给变量variable赋值
    [root@linux ~]# declare [-aixr] variable
       -a :将后面的 variable 定义成为数组 (array)
       -i :将后面接的 variable 定义成为整数数字 (integer)
       -x :用法与 export 一样,就是将后面的 variable 变成环境变量;
       -r :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset
    [root@linux ~]# array var[index]=content

    4. 命令别名的设定与取消: alias, unalias
    [root@linux ~]# alias lm='ls -l | more'
    [root@linux ~]# unalias lm

    5. 历史命令: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 ~]# !!
             ------>history配合!指令的用法很有用!!
    number :执行第几笔指令的意思;
    command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;
    !!      :就是执行上一个指令(相当于按↑按键后,按 Enter)

    6. 环境设定档: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source
       要注意的是,在指令列输入的变量也好、命令别名也罢, 都是针对该次登入的设定而已,所以只要您一注销,那么上次的设定值就会不见了!因此,我们需要有几个档案来帮助我们,每次登入的时候,就已经帮我们搞定了环境的设定!具体哪个档案定义了哪些内容,可以用vi查看。

    >个人设定值
       在个人根目录的几个隐藏文件:~/.bash_profile, ~/.bash_login, ~/.profile中可以设置个人化的路径 (PATH) 与环境变量等等,bash 启动时,会先去读取 ~/.bash_profile,找不到时,就去读取 ~/.bash_login ,然后才是 ~/.profile。在~/.bashrc中也可以做各人化的设定,比如命令别名、路径等等。这样就可能会出现同一个量在多个档案中设定的情况,那以哪个为准呢?总的来说是输入的设定值取代先输入的设定值,具体读取顺序如下:
       a. 先读取 /etc/profile ,再根据 /etc/profile 的内容去读取其它额外的设定档, 例如 /etc/profile.d 与 /etc/inputrc 等等设定档;
       b. 根据不同的使用者,到使用者家目录去读取 ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 等设定档;
       c. 根据不同使用者,到他家目录去读取 ~/.bashrc 。 ---->可见登入bash后,~/.bashrc里面的设定会是最终的设定值!这样,不论原来系统帮我们做了什么设定值,都可以在这里设定属于自己熟悉的环境!!!

    ======>所有设定完毕后,logout----->login才能生效!!! 也可以通过如下指令来使设定立即生效:
    [root@linux ~]# source ~/.bashrc   或
    [root@linux ~]# . ~/.bashrc

    >login shell 与 non-login shell
       当登入 Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile,这三个档案的优先级已经在上面提过。至于在取得 login shell 后继续动作的其它 non-login shell,读取的就是仅有 ~/.bashrc 。而大部分的 linux distributions 都会将~/.bash_profile 的内容指到 ~/.bashrc 去,这样比较简单了!

    >终端机的环境设定: stty, set
    [root@linux ~]# stty [-a]
       -a :将目前所有的 stty 参数列出来
    [root@linux ~]# stty erase ^h ---->重设终端机快捷命令 (^ 表示 Ctrl+) 一般bash已经帮我们设好了,这里要知道是怎么设的!

    >万用字符/特殊符号/组合键
    *    : 万用字符,代表 0 个或多个字符(或数字)
    ?   : 万用字符,代表『一定有』一个字母
    ` ` : 两个『 ` 』中间为可以先执行的指令
    [ ] : 在中间为字符的组合, 如: [root@linux ~]# cp test[1-5] /tmp, "[]"仅代表一个字符,而这个字符的定义可以是范围(-).
    Ctrl + S : 暂停屏幕的输出
    Ctrl + Q : 恢复屏幕的输出
    Ctrl + U : 在提示字符下,将整列命令删除
    Ctrl + Z : 『暂停』目前的命令           ---->这些组合键都可以通过stty设定

    >数据流重导向 (--->至文件或打印机等设备)
       a. 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
       b. 标准输出(stdout):代码为 1 ,使用 > 或 >> ; ---->单 > 会新建或覆盖原来文件内容, >>会新建或累加进原来文件.
       c. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

    [root@linux ~]# find /home -name testing > list_right 2> list_error(或/dev/null 丢掉)---->正确与错误结果同时输出到不同文档!
    [root@linux ~]# find /home -name testing > list 2>&1 ---->正确与错误结果同时输出到同一个文档!
    [root@linux ~]# cat > catfile                         ---->由键盘输入数据到档案,Ctrl+d结束输入
    [root@linux ~]# cat >> catfile < somefile             ---->将原本需要由键盘输入的数据,经由档案来读入
    [root@linux ~]# cat > catfile << eof                  ---->"<<"代表结束输入字符

    >命令执行的判断依据: ; , &&, ||
    [root@linux ~]# sync; sync; shutdown -h now     ----->指令与指令中间利用分号 (;) 来隔开,分号前的指令执行完后,就会立刻接着执行后面的指令
    [root@linux ~]# ls /tmp && touch /tmp/testingagin---->当前面的指令执行结果为正确,就可以接着执行后续的指令, 否则就予以略过
    [root@linux ~]# ls /tmp/vbirding || touch /tmp/vbirding----->当前一个指令有错误时,在 || 后面的指令才会被执行

    >管线命令 (pipe)
       每个管线的前后部分都是『指令』!而后一个指令的输入乃是由前一个指令的输出而来的. 如:
    [root@linux ~]# ls -al /etc | less

    >>撷取命令: cut, grep
       cut: 将一段讯息的某一段给他『切』出来, 处理的讯息是以『行』为单位, 即针对每一行做"cut"!
    [root@linux ~]# cut -d'分隔字符' -f fields

    [root@linux ~]# echo $PATH | cut -d ':' -f 3,5(取第3,5段)
       -d :后面接分隔字符。与 -f 一起使用;
       -f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
       -c :以字符 (characters) 的单位取出固定字符区间;

       grep: 是分析一行讯息,若当中有我们所需要的信息,就将该行拿出来~
    [root@linux ~]# grep [-acinv] '搜寻字符串' filename ----> [root@linux ~]# last | grep 'root'
    [root@linux ~]# grep shmily_liu /etc/passwd /etc/shadow /etc/group
       -a :将 binary 档案以 text 档案的方式搜寻数据
       -c :计算找到 '搜寻字符串' 的次数
       -i :忽略大小写的不同,所以大小写视为相同
       -n :顺便输出行号
       -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

    >>排序命令: sort, wc, uniq
    [root@linux ~]# cat /etc/passwd | sort                ---->将帐号进行排序
    [root@linux ~]# cat /etc/passwd | sort -t ':' -k 3 ---->/etc/passwd 内容是以 : 来分隔的,以第三栏来排序
    [root@linux ~]# uniq [-ic]                          ---->排序完成了,将重复的资料仅列出一个显示
        -i :忽略大小写字符的不同;
       -c :进行计数
    [root@linux ~]# wc [-lwm]    ----> [root@linux ~]# cat /etc/man.config | wc
       -l :仅列出行;                ----> 查询档案里面有多少字?多少行?多少字符?
       -w :仅列出多少字(英文单字);
       -m :多少字符;

    >>字符转换命令: tr, col, join, paste, expand
          实现大写改成小写,或者是 [tab] 按键转成空格键,或将两篇讯息整合成一篇等等文档操作功能! 用的比较少,需要时再来看。

    >>分割命令: split ----->将一个大档案,依据档案大小或行数来分割,就可以将大档案分割成为小档案
    [root@linux ~]# split [-bl] file PREFIX
    [root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
       -b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
       -l :以行数来进行分割。
       PREFIX: 大档案分割成小档案后的名字前缀,便于识别。

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

  • 相关阅读:
    网络运维架构
    Q in Q
    光纤/光模块的多模和单模
    Cisco VTP
    Cisco NTP配置
    惠普/aruba交换机
    【转】交换机背板带宽
    接入交换机下所有服务器不定时丢包
    windows 2012安装不了KB2919355
    Cisco交换机密码策略设置
  • 原文地址:https://www.cnblogs.com/leaven/p/1733572.html
Copyright © 2011-2022 走看看