linux复习笔记之bash shell(1)bash基础

1.系统合法的shell和/etc/shells的功能

1.1.查看当前系统有多少我们可以使用的合法的shell

linux可以使用的合法的shell可以查看/etc/shells这个文件

[root@bogon etc]# cat /etc/shells
/bin/sh   (已经被/bin/bash所替代)
/bin/bash(linux默认的shell)
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

 1.2.查看当前用户默认取得的shell,查看/etc/passwd这个文件,如下所示   

[root@bogon etc]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

   如上所示,在每一行的最后一个数据,就是你登录后可以取得的默认的shell.

2.bash shell 的内置命令:type

      为了方便shell的操作,其实bash已经”内置“了很多的命令,例如cd、umask等命令,都是内置在bash当中的。

      那我们怎么知道这个命令是来自外部命令(指的是其他非bash所提供的命令)还是内置在bash当中的呢?利用type这个命令来查看即可,使用如下:

type [-tpa] name
参数:
type:不加任何参数是,type会显示出name是外部命令还是bash内置命令
-t   :当加入-t时,type会将name以下面这些字眼显示出它的意义:
      file:表示为外部命令;
      alias:表示该命令为命令别名所设置的名称;
      builtin:表示该命令为bash的内置命令
-p   :如果后面接的name为外部命令是,才会显示完整文件名
-a   :会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias
实例一:查询ls这个命令是否为bash的内置命令
[root@bogon etc]# type ls
ls is aliased to `ls --color=auto' ==》可以看出ls是一个命令别名
[root@bogon etc]# type -t ls
alias        ==》精简方式列出
[root@bogon etc]# type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls            ==》列出这个命令所在是文件
[root@bogon etc]# type -t cd
builtin                 ==》cd 是bash的一个内置命令  

3.shell的变量功能

3.1.变量的显示与设置:echo,unset

变量的显示:echo

 

[root@bogon etc]# echo $JAVA_HOME
/usr/java/jdk1.7.0_55
[root@bogon etc]# echo ${JAVA_HOME}
/usr/java/jdk1.7.0_55

 3.2.设置变量或者修改变量

设置变量和修改变量是如此的简单,就是用等号(=)连接变量就ok了,例如:

 

[root@bogon etc]# myname=ickes
[root@bogon etc]# echo $myname
ickes

 变量的设置规则需要注意的地方

1.等号两边不能直接接空格,如下面就是错误的

[root@bogon etc]# myname= ickes
bash: ickes: command not found

 2.变量名称只能为字母和数字,但是开头不能为数字

 3.变量内容若有空格可以使用双引号(")或者单引号(')将变量内容结合起来,但是注意了

    双引号里面的特殊字符如$等,可以保有原本的特性,如下所示   

 

[root@bogon etc]# test="lang is $LANG"
[root@bogon etc]# echo $test
lang is en_US.UTF-8

   单引号内的特殊字符则为一般字符(纯文本),如下所示

 

[root@bogon etc]# test='lang is $LANG'
[root@bogon etc]# echo $test
lang is $LANG

 4、可以用转义字符(\)将特殊字符$等转变为一般字符

 5、在一串命令当中,如果需要其他的命令提供信息,可以使用反单引号(`命令`)或者$(命令)。反单         引号是1键左边的那个键例如要取得当前操作系统内核的版本,如下所示:

[root@bogon etc]# version=`uname -r`
[root@bogon etc]# echo $version
2.6.32-358.el6.i686
[root@bogon etc]# version1=$(uname -r)
[root@bogon etc]# echo $version1
2.6.32-358.el6.i686 

   在命令执行过程中反单引号(``)和$()这两个符号代表的含义如何?

   答:在一串命令当中,在`之内的命令将会被先执行,这个命令返回的结果将会作为外部的输入信息`

  

6、行业规矩全部大写的变量为环境变量,自行设置的变量为小写字母,方便判断。

3.3、取消变量:unset

[root@bogon etc]# myname=ickes
[root@bogon etc]# echo $myname
ickes
[root@bogon etc]# unset myname
[root@bogon etc]# echo $myname

[root@bogon etc]# 

3.4、子进程

什么是子进程呢?就是说在我目前这个shell的情况下,去打开另一个新的shell,新的那个shell就是子进程。在一般的状态下,父进程的自定义变量是无法再子进程内使用的。但是通过export将变量变成环境变量后,就能够在子进程下面应用了

例如:

[root@bogon ~]# name=ickes
[root@bogon ~]# bash  进入子进程
[root@bogon ~]# echo $name 在子进程中显示变量
			   当然没有东西,因为子进程无法引用父进程的变量
[root@bogon ~]# exit       离开子进程
exit
[root@bogon ~]# export name 将name这个变量设置为环境变量
[root@bogon ~]# bash        再次进入子进程
[root@bogon ~]# echo $name  显示变量
ickes			    打印出来,格叽格叽!
[root@bogon ~]# exit
exit

 

4、环境变量的功能、与查看

4.1.用evn查看环境变量,与常见环境变量的说明

env命令可以列出了当前所有的环境变量

HOME:代表当前用户的主文件夹

SHELL:他告知我们目前这个环境变量使用的shell是那个程序?linux默认使用/bin/bash

HISTSIZE:这个与”历史命令“有关,就是我们曾经执行过的命令可以被系统记录下来,而记录下来的条数,就是有这个变量来指定

MAIL:当我们使用mail这个命令在收信时系统回去读取的邮件信箱文件

PATH:执行文件的路径变量

LANG:这个重要,就是语系数据,很多信息都会用到它。

RANDOM:这是”随机数“的变量,例如如下

 

[root@bogon ~]# echo $RANDOM
20801
 系统会随机生成一个0~32767的随机数

4.2.用set查看所有变量(包含环境变量和自定义变量)

查出一堆的东西,我也没有具体用到过,用到时,在补充,博客就是好,可以随时改

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

谈了env与set现在知道有所谓的环境变量与自定义变量,两种直接有什么差异呢?

答:两者直接的差异在于,该变量是否会被子进程所继续使用

父进程跟子进程的解释

答:当你登录linux并取得一个bash之后,你的bash就是一个独立的线程,接下来你在这个bash下面所执行的任何命令都是由你这个bash所衍生出来的,那些被执行的命令就被称为子进程了。

如图所示



 如上图所示,我们在原本的bash下面执行另一个bash,结果操作的环境接口会跑到第二个bash中去(这就是子进程),那原本的bash就会处于暂停的情况(sleep).若想回到原本的bash中去,就只能结束当前的子进程(exit或者logout).

这个程序概念与变量有什么关系呢?

答:关系可大了,因为子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量,所以你原本bash中的自定义变量在进入子进程后就会消失不见,直到退出子进程回到父进程才能引用。

如果将自定义变量换成环境变量后,在子进程中就可以继续访问上面已经介绍过了,这里就不啰嗦了!

 


待续!

 

 

猜你喜欢

转载自eksliang.iteye.com/blog/2103983
今日推荐