本文的结构:bash shell简介-->变量和变量操作、数组-->bash的环境配置文件分析


什么是shell

  • 操作系统是一组软件,用于控制整个硬件和管理系统活动,若直接使用操作系统,操作不当会导致系统崩溃,用户不可随意操作,所以通过“shell”将我们输入的命令与内核通信,让内核准确的控制硬件工作

  • shell是在操作系统上开发的应用程序,是用户可操作的最外层,也就是“shell”壳

什么是bash

  • Bourne Again SHell,Bourne shell的增强版

  • shell有很多版本,很多东西都一样,出现后就会有很多的发展者,像操作系统有很多种是一样的道理

  • shell种类查看:

     [root@boxin ~]# cat /etc/shells   // 文件记录了所有合法的shell                                                               
     /bin/sh       
     /bin/bash     
     /sbin/nologin
     /bin/dash
     /bin/tcsh
     /bin/csh

  • 用户登录时根据 /etc/passwd 的记录获得shell

     [root@boxin ~]# 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
bash shell 功能

  • 命令记忆(history)

     1:最多1000条

     2:[-c 删除目前history] [-a 同步进文件] [-n 最近n条记录]

     3:历史记录在~/.bash_history 文件中中(前一次登录以前的命令,这一次的缓存在内存中)

  • 补全功能(Tab)

  • 别名(alias)

  • 作业控制、前台fg、后台bg

  • 脚本(shell script)

  • 通配符(Wildcard)

  • 内置命令 type [-a 查看命令的所有来源] [-t 查看命令执行的首个来源] 命令


linux下的变量

1:什么是变量:存在于内存空间中的,一组文字或符号组成,用于替代一些设置或数据,特别是复杂或变动的数据

  • 例1:PATH变量的值为 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local

  • 例2:MAIL变量用于访问邮箱,当不同用户登录shell时,MAIL就赋值为相应的用户的邮箱,如boxin用户 MAIL=/var/spool/mail/boxin,mail命令使用MAIL变量

2:变量设置规则

  • 变量名开头不可为数字

  • 单双引号

     [root@boxin ~]# lang="lang is $LANG"   //双引号,保持特性
     [root@boxin ~]# echo $lang
     lang is en_US.UTF-8
     [root@boxin ~]# lang='lang is $LANG'    //单引号,纯文本
     [root@boxin ~]# echo $lang
     lang is $LANG

  • 反单引号`` 和 $()

     [root@boxin ~]# version=$(uname -r)    //命令执行结果作为变量作为外部输入信息
     [root@boxin ~]# echo $version
     2.6.32-431.el6.x86_64
     [root@boxin ~]# version=`uname -r`
     [root@boxin ~]# echo $version
     2.6.32-431.el6.x86_64

  • 删除变量内容

     ${变量#}    从头开始删掉符合#后面替换文字“最的那个”

     ${变量##}  从头开始删掉符合#后面替换文字“最的那个”

     ${变量%}    从后面开始删掉符合#后面替换文字“最的那个”

     ${变量%%} 从后面开始删掉符合#后面替换文字“最的那个”

  • 变量替换

     ${变量/A/B} 将第一个A替换成B

     ${变量/ /A/B} 将所有的A替换成B

  • 变量内容测试和替换(是否为空 或 不存在)

     aname=${name-newname}    // 若name 不存在,则改为newname

     aname=${name:-newname}    // 若name 不存在或为空,则改为newname

     aname=${name=newname}    //  直接name改为newname

  • 增加变量内容

     [root@boxin ~]# version="$version"hello
     [root@boxin ~]# echo $version
     2.6.32-431.el6.x86_64hello
     [root@boxin ~]# version=${version}hello
     [root@boxin ~]# echo $version
     2.6.32-431.el6.x86_64hellohello

  • 取消变量:unset 变量名

3:环境变量

  • env:(environment) 查看本shell下所有的环境变量

  • set:查看环境变量 + 自定义变量

  • export:将自定义变量改为环境变量

4:语系变量 locale (影响显示和结果)

     [root@boxin ~]# locale    //usr//lib//locale
     LANG=en_US.UTF-8     //主语言设置,其他语系变量会被这两个变量代替(LANG  LC_ALL),一般设置LANG就ok
     LC_CTYPE="en_US.UTF-8"
     LC_NUMERIC="en_US.UTF-8"

    [root@boxin ~]# cat /etc/sysconfig/i18n
     LANG="en_US.UTF-8"
     SYSFONT="latarcyrheb-sun16"
5:变量读取:read     [root@boxin ~]# read atest
     this is a test
     [root@boxin ~]# echo $atest
     this is a test

     [root@boxin ~]# read -p "your name :" named            //-p提示符  -t 秒数
     your name :boxin
     [root@boxin ~]# echo $named
     boxin
6:数组:例子说明,关联和一般数组差别在于:索引从0开始的数字变成自定义

  • 一般数组

wKiom1WIFn-jjTVdAACROT-ZCVg613.jpg

wKioL1WIGDehKaRBAABbLpt8X74539.jpg

wKiom1WIFoCTXjtTAAA6OwRhXhY447.jpg

  • 关联数组

wKioL1WIGDeBikXQAADRsiz2hbA832.jpg

wKiom1WIFoCQ0AOHAABOf5l6v6w192.jpg

wKioL1WIGDexXuFdAABPr_rvBYc652.jpg


bash的环境配置文件

结构图

wKiom1WIFoDjxkT4AADTQDjPLNw839.jpg

登陆欢迎信息

  • 登录前 /etc/issue 

  • 登录后 /etc/motd

login shell

  • 取得bash 时需完整登录流程:输入账号密码

non-login shell

  • 不需要再次输入账户密码:进入子进程等

/etc/profile(系统整体设置,login shell会调用)调用以下三个文件目录

  • /etc/inputre(用户有没有自定义按键功能,TAB键等)

  • /etc/profile.d/*.sh(目录下.sh 结尾的文件会被调用,所有使用者共享命令别名)

  • /etc/sysconfig/i18n(语系设置)

~/.bash_profile(个人配置文件,login shell才会读)
~/.bashrc(根据UID 规范 umask值 和 PS1变量,no-login shell会读)

  • 读取/etc/profile.d/*.sh

  • 读取/etc/bashrc(redhat 才有)