Bash Shell 学习记录(一)

什么是Shell(壳程序)
  1. 让用户可以操作系统的最外层的应用程序,即为壳程序(shell);
     
  2. 壳程序的功能只是提供用户操作系统的一个接口,因此这个壳程序需要可以呼叫其他软件才好。包括 man, chmod, chown, vi, fdisk, mkfs 等等命令,这些命令都是独立的应用程序, 但是我们可以透过壳程序 (就是命令列模式) 来操作这些应用程序,让这些应用程序呼叫核心来运行所需的工作;
     
  3. 也就是说,只要能够操作应用程序的接口都能够称为壳程序。
Shell的版本
  1. shell有不同的版本,bash只是shell的其中一个版本;
     
  2. Linux支持的shell版本放在/etc/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)

     
  3. 系统某些服务在运行过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个文件;
     
  4. 登陆的时候,系统就会指定一个shell 来工作。 而这个登陆取得的 shell 就记录在 /etc/passwd 这个文件内,如:
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    ...省略...
Bash Shell的功能
  1. 命令记忆功能:
    a. 在终端中按上下键可找到使用过的命令,命令记录在home目录下的.bash_history文件或缓存中。
    b. ~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中。
     
  2. [Tab]键补全功能:
    a. 想要知道环境中,所有可以运行的命令有几个? 就直接在 bash 的提示字符后面连续按两次 [tab] 按键就能够显示所有的可运行命令了.
     
  3. 命令别名配置功能: (alias)
    a. 在命令列输入 alias , 可以知道目前的命令别名有哪些;
    b. 在命令列输入 alias lm='ls -al' ,来配置别名。
      
  4. 工作控制、前景背景控制: (job control, foreground, background)
     
  5. 程序化脚本: (shell scripts)
    a. 在 Linux 底下的 shell scripts ,可以将你平时管理系统常需要下达的连续命令写成一个文件, 该文件并且可以透过对谈交互式的方式来进行主机的侦测工作!也可以藉由 shell 提供的环境变量及相关命令来进行设计
     
  6. 通配符: (Wildcard)
Shell的变量功能
  1. 变量的获取和配置:
    a. 利用 echo 就能够读出,只是需要在变量名称前面加上$ , 或者是以 ${变量} 的方式来取用都可以,如: echo $HOME 或者是 echo ${HOME}
    b. 如何『配置』或者是『修改』 某个变量的内容啊?很简单啦!用『等号(=)』连接变量与他的内容就好啦,如:home=/home/pc
    c. 在 bash 当中,当一个变量名称尚未被配置时,默认的内容是『空』的
     
  2. 变量的配置守则:

    1. 变量与变量内容以一个等号『=』来连结,如下所示:
      『myname=VBird』
       
    2. 等号两边不能直接接空格符,如下所示为错误:
      『myname = VBird』或『myname=VBird Tsai』
       
    3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
      『2myname=VBird』
       
    4. 变量内容若有空格符可使用双引号『”』或单引号『’』将变量内容结合起来,但双引号内的特殊字符如$ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
      单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
       
    5. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, , 空格符, ‘等)变成一般字符;
       
    6. 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:

      『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
    7. 若该变量为扩增变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容,如下所示:
      『PATH="$PATH":/home/bin』
       

    8. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
      『export PATH』
       
    9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
       
    10. 取消变量的方法为使用unset :『unset 变量名称』例如取消 myname 的配置:
      『unset myname』
变量举例:
 范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin
# 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰!

范例四:承范例三,我要将 name 的内容多出 "yes" 呢?
[root@www ~]# name=$nameyes  
# 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!
# 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对!
[root@www ~]# name="$name"yes
[root@www ~]# name=${name}yes  <==以此例较佳!

范例五:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序?
[root@www ~]# name=VBird
[root@www ~]# bash        <==进入到所谓的子程序
[root@www ~]# echo $name  <==子程序:再次的 echo 一下;
       <==嘿嘿!并没有刚刚配置的内容喔!
[root@www ~]# exit        <==子程序:离开这个子程序
[root@www ~]# export name
[root@www ~]# bash        <==进入到所谓的子程序
[root@www ~]# echo $name  <==子程序:在此运行!
VBird  <==看吧!出现配置值了!
[root@www ~]# exit        <==子程序:离开这个子程序

#什么是『子程序』呢?就是说,在我目前这个 shell 的情况下,去激活另一个新的 
#shell ,新的那个 shell 就是子程序啦!在一般的状态下,父程序的自定义变量是无法在
#子程序内使用的。但是透过 export 将变量变成环境变量后,就能够在子程序底下应用了

范例六:如何进入到您目前核心的模块目录?
[root@www ~]# cd /lib/modules/`uname -r`/kernel
[root@www ~]# cd /lib/modules/$(uname -r)/kernel

#每个 Linux 都能够拥有多个核心版本,且几乎 distribution 的核心版本都不相同。以 
#CentOS 5.3 (未升级前) 为例,他的默认核心版本是 2.6.18-128.el5 ,所以核心模块
#目录在 /lib/modules/2.6.18-128.el5/kernel/ 内。 也由于每个 
#distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个命令先取得版
#本信息。所以啰,就可以透过上面命令当中的内含命令 `uname -r` 先取得版本输出到 
#cd ... 那个命令当中,就能够顺利的进入目前核心的驱动程序所放置的目录啰!很方便吧!
#其实上面的命令可以说是作了两次动作,亦即是:
#   1.先进行反单引号内的动作『uname -r』并得到核心版本为 2.6.18-128.el5
#   2.将上述的结果带入原命令,故得命令为:『cd /lib/modules/2.6.18-128.el5/kernel/』

范例七:取消刚刚配置的 name 这个变量内容 
[root@www ~]# unset name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值