Bash shell和变量详解
本文的结构:bash shell简介-->变量和变量操作、数组-->bash的环境配置文件分析
什么是shell:
操作系统是一组软件,用于控制整个硬件和管理系统活动,若直接使用操作系统,操作不当会导致系统崩溃,用户不可随意操作,所以通过“shell”将我们输入的命令与内核通信,让内核准确的控制硬件工作
shell是在操作系统上开发的应用程序,是用户可操作的最外层,也就是“shell”壳
什么是bash
Bourne Again SHell,Bourne shell的增强版
shell有很多版本,很多东西都一样,出现后就会有很多的发展者,像操作系统有很多种是一样的道理
shell种类查看:
[[email protected] ~]# cat /etc/shells // 文件记录了所有合法的shell
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
用户登录时根据 /etc/passwd 的记录获得shell
[[email protected] ~]# 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:变量设置规则
变量名开头不可为数字
单双引号
[[email protected] ~]# lang="lang is $LANG" //双引号,保持特性
[[email protected] ~]# echo $lang
lang is en_US.UTF-8
[[email protected] ~]# lang='lang is $LANG' //单引号,纯文本
[[email protected] ~]# echo $lang
lang is $LANG
反单引号`` 和 $()
[[email protected] ~]# version=$(uname -r) //命令执行结果作为变量作为外部输入信息
[[email protected] ~]# echo $version
2.6.32-431.el6.x86_64
[[email protected] ~]# version=`uname -r`
[[email protected] ~]# 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
增加变量内容
[[email protected] ~]# version="$version"hello
[[email protected] ~]# echo $version
2.6.32-431.el6.x86_64hello
[[email protected] ~]# version=${version}hello
[[email protected] ~]# echo $version
2.6.32-431.el6.x86_64hellohello
取消变量:unset 变量名
3:环境变量
env:(environment) 查看本shell下所有的环境变量
set:查看环境变量 + 自定义变量
export:将自定义变量改为环境变量
4:语系变量 locale (影响显示和结果)
[[email protected] ~]# 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"
[[email protected] ~]# cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
5:变量读取:read [[email protected] ~]# read atest
this is a test
[[email protected] ~]# echo $atest
this is a test
[[email protected] ~]# read -p "your name :" named //-p提示符 -t 秒数
your name :boxin
[[email protected] ~]# 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 才有)
转载于:https://blog.51cto.com/boxinknown/1664229