linux学习 认知shell

shell简介

Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

Shell有两种执行命令的方式:
  交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
  批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。(Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译)

Bourne Agian Shell

Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本,而bash其实就是一种shell脚本解释器。
/bin/bash 是 Linux 預設的 shell 。系统上合法的 shell 要写入 /etc/shells 这个文件。 这是因为系统某些服务在运行过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个文件

1)Bash shell 的功能

命令编修能力 (history):『上下键』就可以找到前/后一个输入的命令,被记录于家目录内中的 .bash_history 。
命令与文件补全功能: ([tab] 按键的好处):

  1. [Tab] 接在一串命令的第一个字的后面,则为命令补全;
  2. [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』

命令别名配置功能 (alias): 在命令列输入 alias 就可以知道目前的命令别名有哪些

alias lm='ls -al'			//可以直接下达命令来配置别名

工作控制、前景背景控制: (job control, foreground, background)
程序化脚本 (shell scripts):shell scripts可以将你平时管理系统常需要下达的连续命令写成一个文件, 该文件并且可以透过对谈交互式的方式来进行主机的侦测工作;也可以藉由 shell 提供的环境变量及相关命令来进行设计

2)bash的内建命令:type

通过 type 这个命令我们可以知道每个命令是否为 bash 的内建命令。 此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以运行档的状态被找到, 那么该名称是不会被显示出来的。即type 主要在找出『运行档』而不是一般文件档名

[root@www ~]# type [-tpa] name

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

# 例1:查询一下 ls 这个命令是否为 bash 内建?
[root@www ~]# type ls
ls is aliased to `ls --color=tty'    //未加任何参数,列出 ls 的最主要使用情况
[root@www ~]# type -t ls
alias                            // 仅列出 ls 运行时的依据
[root@www ~]# type -a ls
ls is aliased to `ls --color=tty' 	// 最先使用 aliase
ls is /bin/ls                     // 还有找到外部命令在 /bin/ls

# 例2:那么 cd 呢?
[root@www ~]# type cd
cd is a shell builtin             //  cd 是 shell 内建命令
3)bash的命令下达:
[vbird@www ~]$ command [-options] parameter1 parameter2 ... 
                  命令     选项      参数(1)    参数(2) 
说明: 
0. 一行命令中第一个输入的部分绝对是『命令(command)』或『可运行文件案』 
1. command 为命令的名称,例如变换路径的命令为 cd 等等; 
2. 中括号[]并不存在于实际的命令中,而加入选项配置时,通常选项前会带 - 号, 
   例如 -h;有时候会使用选项的完整全名,则选项前带有 -- 符号,例如 --help; 
3. parameter1 parameter2.. 为依附在选项后面的参数,或者是 command 的参数;  
4. 命令, 选项, 参数等这几个词语中间以空格来区分,不论空几格 shell 都视为一格;  
5. 按下[Enter]按键后,该命令就立即运行。[Enter]按键代表着一行命令的开始启动。 
6. 命令太长的时候,可以使用反斜杠 (\) 来跳脱[Enter]符号,使命令连续到下一行。 
   注意!反斜杠后就立刻接特殊字符,才能跳脱! 
4)shell的变量功能
变量的取用与配置:echo, 变量配置守则, unset取消配置

变量的取用: echo,在被取用时,前面必须要加上钱字号『 $ 』

[root@www ~]# echo $variable
[root@www ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@www ~]# echo $myname
       # 在 bash 当中,当一个变量名称尚未被配置时,默认的内容是『空』的
[root@www ~]# myname=VBird
[root@www ~]# echo $myname
VBird  # 出现了!因为这个变量已经被配置了!

变量配置守则

  1. 变量与变量内容以一个等号『=』来连结,等号两边不能直接接空格符,
    『myname=VBird』 ✓

  2. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
    『2myname=VBird』 X

  3. 变量内容若有空格符可使用双引号『"』或单引号『’』将变量内容结合起来,但
    双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
    『var=“lang is $LANG”』则『echo $var』可得『lang is en_US』
    单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
    『var=‘lang is $LANG’』则『echo $var』可得『lang is $LANG』

  4. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, , 空格符, '等)变成一般字符;

  5. 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『命令』或 『$ (命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
    『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

  6. 若该变量为扩增变量内容时,则可用 “$变量名称” 或 $ {变量} 累加内容,如下所示:
    『PATH="$PATH":/home/bin』

  7. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
    『export PATH』

  8. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

  9. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
    『unset myname』

# 例1:配置一变量 name ,且内容为 VBird
[root@www ~]# 12name=VBird
-bash: 12name=VBird: command not found 		# 屏幕会显示错误!因为不能以数字开头!
[root@www ~]# name = VBird            X
[root@www ~]# name=VBird              <==OK 的啦!

# 例2:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时:
[root@www ~]# name=VBird's name      X
# 单引号与双引号必须要成对,在上面的配置中仅有一个单引号
[root@www ~]# name="VBird's name"    <==OK 
# 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效!
[root@www ~]# name='VBird's name'    X
# 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了!
[root@www ~]# name=VBird\'s\ name     <==OK 
# 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的

#例3:我要在 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		✓

#例4:承范例三,我要将 name 的内容多出 "yes" 呢?
[root@www ~]# name=$nameyes  
# 如果没有双引号,那么变量name 的内容会变成 $nameyes 这个变量!
[root@www ~]# name="$name"yes
[root@www ~]# name=${name}yes  <==以此例较佳!

#例5:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序?
[root@www ~]# name=VBird
[root@www ~]# bash        <==进入到所谓的子程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值