yanghongjun 发表于 2018-8-29 09:10:13

Bash shell和变量详解

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

[*]  操作系统是一组软件,用于控制整个硬件和管理系统活动,若直接使用操作系统,操作不当会导致系统崩溃,用户不可随意操作,所以通过“shell”将我们输入的命令与内核通信,让内核准确的控制硬件工作
[*]  shell是在操作系统上开发的应用程序,是用户可操作的最外层,也就是“shell”壳
  什么是bash

[*]  Bourne Again SHell,Bourne shell的增强版
[*]  shell有很多版本,很多东西都一样,出现后就会有很多的发展者,像操作系统有很多种是一样的道理
[*]  shell种类查看:
  # cat /etc/shells   // 文件记录了所有合法的shell
  /bin/sh
  /bin/bash   
  /sbin/nologin
  /bin/dash
  /bin/tcsh
  /bin/csh

[*]  用户登录时根据 /etc/passwd 的记录获得shell
  # 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:变量设置规则

[*]  变量名开头不可为数字
[*]  单双引号
  # lang="lang is $LANG" //双引号,保持特性
  # echo $lang
  lang is en_US.UTF-8
  # lang='lang is $LANG'    //单引号,纯文本
  # echo $lang
  lang is $LANG

[*]  反单引号`` 和 $()
  # version=$(uname -r)    //命令执行结果作为变量作为外部输入信息
  # echo $version
  2.6.32-431.el6.x86_64
  # version=`uname -r`
  # 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

[*]  增加变量内容
  # version="$version"hello
  # echo $version
  2.6.32-431.el6.x86_64hello
  # version=${version}hello
  # echo $version
  2.6.32-431.el6.x86_64hellohello

[*]  取消变量:unset 变量名
  3:环境变量

[*]  env:(environment) 查看本shell下所有的环境变量
[*]  set:查看环境变量 + 自定义变量
[*]  export:将自定义变量改为环境变量
  4:语系变量 locale (影响显示和结果)
  # locale    //usr//lib//locale
  LANG=en_US.UTF-8   //主语言设置,其他语系变量会被这两个变量代替(LANGLC_ALL),一般设置LANG就ok
  LC_CTYPE="en_US.UTF-8"
  LC_NUMERIC="en_US.UTF-8"
  # cat /etc/sysconfig/i18n
  LANG="en_US.UTF-8"
  SYSFONT="latarcyrheb-sun16"
  5:变量读取:read   # read atest
  this is a test
  # echo $atest
  this is a test
  # read -p "your name :" named            //-p提示符-t 秒数
  your name :boxin
  # echo $named
  boxin
  6:数组:例子说明,关联和一般数组差别在于:索引从0开始的数字变成自定义

[*]  一般数组




[*]  关联数组



  bash的环境配置文件
  结构图:

  登陆欢迎信息

[*]  登录前 /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 才有)

页: [1]
查看完整版本: Bash shell和变量详解