文档章节

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

闪电
 闪电
发布于 2015/05/09 23:45
字数 1942
阅读 67
收藏 2

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中的自定义变量在进入子进程后就会消失不见,直到退出子进程回到父进程才能引用。

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

 


待续!

 

 

本文转载自:http://eksliang.iteye.com/blog/2103983

闪电
粉丝 74
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
【Linux】Linux操作系统期末复习笔记

Linux操作系统基础 Xu An 2018-7-4 第一讲 Linux简介 1、Linux是一个开源的操作系统,发布于GPL协议,全称为GNU/Linux 2、Linux和Unix是相近的 3、FreeBSD是从BSD发展过来的,MacOS是基于Fre...

XuAn97916
2018/07/04
0
0
Linux Shell学习之基础篇(不适合学习,仅为本人笔记)

在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要。 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下。 ============...

yishuizhao
2018/07/02
0
0
Linux系统 shell基础(一)(编辑中)

shell是操作系统中重要的应用,尤其对linux这种命令行模式的操作系统,shell具有重要的意义。 一、什么是shell shell是一个命令解释器,提供用户和机器之间的交互。每次我们登录系统后,出现...

whytl
2018/01/10
0
0
bash的环境配置文件加载原理

一、环境配置文件概述 在Linux上开发或者部署应用时,免不了要设置配置文件,比如安装JDK,需要为java可执行文件配置环境变量。 大多数时候我们不需要关注shell,但是当你执行"sudo su" 命令...

dragon_tech
01/17
0
0
Linux学习笔记(23)

一、shell 基础 shell是个命令解释器,提供用户和机器之间的交互 每个用户都可以拥有自己特定的shell centos7默认Shell为bash(Bourne Agin shell) 除了bash,还有zsh.ksh等 二、命令历史 ...

小新锐
2017/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
24分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部