Bash这个Shell,了解一下概念

BoumeAgain Shell(bash),是一个Bourne Shell的增强版本,基准于GNU架构下发展出来。

GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。这个操作系统是GNU计划的主要目标,名称来自GNU’s Not Unix!的递归缩写,因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。
作为操作系统,GNU的发展仍未完成,其中最大的问题是具有完备功能的内核尚未被开发成功。GNU的内核,称为Hurd,是自由软件基金会发展的重点,但是其发展尚未成熟。在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux(见GNU/Linux命名争议)。

合法的shell需要被写入 /etc/shells ,某些服务在运行过程中,会在此检查使用者能够使用的shell

[root@student01 etc]# cd /etc/
[root@student01 etc]# cat -n shells
     1	/bin/sh  ## 已经被 /bin/bash替代
     2	/bin/bash ##Linux的默认Shell
     3	/sbin/nologin ##用来混淆视听的怪怪的shell 
     4	/bin/dash 
     5	/bin/tcsh  ## 整合C Shell,提供更多的功能
     6	/bin/csh  ##已经被 /bin/tcsh 所取代

以 /etc/passwd 为例,可以看到以下内容,最后一个数据就是对应账号登录后可以获得的默认shell

[root@student01 etc]# cat -n /etc/passwd
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

Bash shell功能

1 命令编辑能力 history

主文件夹内 .bash_history中会存储之前登录用过的1000个指令,本次登录的指令则会记录在内存中,只有登出才会持久化到.bash_history

优点 :记录足迹,但是要小心骇客入侵获取与系统有关的命令,例如直接输入mysql的密码在命令行上

2 命令与文件补全功能 tab

一次tab补全命令,两次tab显示备选文件

3 命令别名设置功能 alias

[root@student01 ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

别名设置办法:

[root@student01 ~]# alias la='ls -al'
[root@student01 ~]# la
total 248
dr-xr-x---. 27 root root  4096 Nov 17 09:26 .
dr-xr-xr-x. 22 root root  4096 Nov 17 08:32 ..
......

4 工作控制、前景背景控制 job control、foreground、background

使用前、背景的控制可以让工作进行的更为顺利!

至于工作控制(jobs)的用途则更广, 可以让我们随时将工作丢到背景中执行!而不怕不小心使用了 [Ctrl] + c 来停掉该程序。此外,也可以在单一登陆的环境中,达到多任务的目的。

5 程序化脚本 shell scripts

将系统管理常需要下达的连续指令写成一个文件,该文件可以通过对谈互动式的方式来进项主机的侦测工作。

借由shell提供的环境变量和相关指令来设计程序

6 万用字符 Wildcard

例如 *

[root@student01 bin]# ll /usr/bin/X*
lrwxrwxrwx. 1 root root       4 Oct  5  2015 /usr/bin/X -> Xorg
-rwsr-xr-x. 1 root root 2274256 Nov 23  2013 /usr/bin/Xorg

常用指令介绍

type 查询指令是否为Bash shell的内置命令

[root@student01 bin]# type ls  
ls is aliased to `ls --color=auto'	#列出ls主要使用状态
[root@student01 bin]# type -t ls
alias								#列出ls执行时的依据
[root@student01 bin]# type -a ls
ls is aliased to `ls --color=auto'	#最先使用aliase
ls is /bin/ls						#外部指令的位置在 /bin/ls
[root@student01 bin]# type -p ls	#如果是外部指令,则会显示完整文件名

指令下达的快速编辑

\ + [Enter] - 折到下一行

[ctrl] + u - 从光标处向删除指令串

[ctrl] + k - 从光标出向删除指令串

[ctrl] + a - 让光标移动到整个指令串的最前面

[ctrl] + e - 让光标移动到整个指令串的最后面

Shell的变量功能

Linux是一个多用户环境,每个人登录系统都能取得一个bash shell,每个人都能使用bash下达mail这个指令来接受自己的邮件。而bash获知邮件新乡是哪个文件,就需要依赖变量了。

What?

1 变量的可变性与方便性

方便读取对应条件下的资源,例如多用户环境下,单用户登录时调用对应的mail邮箱

2 影响bash环境操作变量

例如下达ls这个指令时,系统是通过PATH这个变量里面内容记录的路径顺序来搜索指令

#set env
JAVA_HOME=/usr/local/src/java/jdk1.8.0_51
JAVA_BIN=/usr/local/src/java/jdk1.8.0_51/bin
HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1
ZK_HOME=/usr/local/src/zookeeper/zookeeper-3.4.7
PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ZK_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH HADOOP_HOME ZK_HOME

如果不在命令中,就会返回这样的指示

[root@student01 mail]# hello
-bash: hello:命令找不到

3 脚本程序设计(shell script)的帮手

如果使用变量,可以在script中设置变量的引用,就可以避免在更换主机,且涉及到引用程序、指令路径变化时造成的尴尬…无穷无尽的修改。

变量的取用与设置:echo,变量设置规则,unset

1 变量的取用:echo

[root@student01 ~]# echo $hadoop

[root@student01 ~]# echo $HADOOP_HOME
/usr/local/src/hadoop/hadoop-2.7.1
[root@student01 ~]# echo ${HADOOP_HOME}
/usr/local/src/hadoop/hadoop-2.7.1

变量在被调用时,前面必须加点钱 $ ,不然没钱不办事哦,另外变量名一定得正确,变量名可以在外围加{ },也可以不加。

2 变量的设置

设置或修改?一个“=”能帮你

[root@student01 ~]# echo $myName

[root@student01 ~]# myName=Liang
[root@student01 ~]# echo $myName
Liang

其实变量是不可以随便设置的,例如编码中用到的驼峰命名规则,变量也有自己的命名规则

每一种shell的语法都是不同的,bash中要显示未设置的变量时,echo返回空值,而其他会直接报错。

变量的设置规则:

  1. 变量与变量内容以一个等号连接

  2. 等号两边不能直接连空白字符

  3. 变量名称只能是英文字母与数字,但开头字符不能是数字

  4. 可以使用跳脱字符“\”将特殊字符变成一般字符

  5. 如果该变量为拓展变量内容时,可以使用" 变 量 名 称 “ 或 变量名称“或 {变量}累加内容

    [root@student01 ~]# myName=${myName}hello
    [root@student01 ~]# echo $myName
    lianghello
    [root@student01 ~]# myName="myName"World ##错误示范,没给钱版本
    [root@student01 ~]# echo $myName
    myNameWorld
    [root@student01 ~]# myName="$myName"Hey
    [root@student01 ~]# echo $myName
    myNameWorldHey
    
  6. 若改变量需要在其他子程序执行,则需要以export来使变量变成环境变量

    子程序?就是在目前shell的情况下,去启用另外一个新的shell,新的shell就是子程序

    [root@student01 ~]# myName=liang
    [root@student01 ~]# echo $myName
    liang
    [root@student01 ~]# bash
    [root@student01 ~]# echo $myName
    
    [root@student01 ~]# exit
    exit
    [root@student01 ~]# export myName
    [root@student01 ~]# bash
    [root@student01 ~]# echo $myName
    liang
    [root@student01 ~]# exit
    exit
    
  7. 通常大写字符位系统默认变量,自行设置变量可以使用小写字符,方便判断

  8. 取消变量的方法为使用unset

[root@student01 ~]# echo $myName
Liang
[root@student01 ~]# unset myName
[root@student01 ~]# echo $myName

变量设置中,双引号可以保有变量内容,单单引号仅能是一般自负,不会有特殊符号

练习:更换工作目录

[root@student01 ~]# work="/usr/local/src/hadoop"
[root@student01 ~]# echo $work
/usr/local/src/hadoop
[root@student01 ~]# cd $work
[root@student01 hadoop]# 

3 环境变量的功能

– 用env观察环境变量和常见环境变量说明

[root@student01 ~]# env
HOSTNAME=student01 #当前主机名
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash  #目前环境使用的Shell
HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1
HISTSIZE=1000   #主文件夹内 .bash_history的最大记录条数,记录之前登录用过的历史命令,本次在内存中
SSH_CLIENT=192.168.161.1 51684 22
SELINUX_USE_CURRENT_RANGE=
myName=myNameWorldHey  #刚刚设置的变量
OLDPWD=/usr/local/src/hadoop #上一次操作的目录
ZK_HOME=/usr/local/src/zookeeper/zookeeper-3.4.7
SSH_TTY=/dev/pts/0
USER=root #当前用户名
JAVA_BIN=/usr/local/src/java/jdk1.8.0_51/bin
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
HADOOP_COMMON_LIB_NATIVE_DIR=/usr/local/src/hadoop/hadoop-2.7.1/lib/native
MAIL=/var/spool/mail/root #当使用这个指令收信时,系统回去读取邮件信箱文件mailbox
PATH=/usr/local/src/java/jdk1.8.0_51/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/src/hadoop/hadoop-2.7.1/sbin:/usr/local/src/hadoop/hadoop-2.7.1/bin:/usr/local/src/zookeeper/zookeeper-3.4.7/bin:/root/bin #可执行文件搜寻路径,按顺序搜索
PWD=/root
JAVA_HOME=/usr/local/src/java/jdk1.8.0_51
LANG=zh_TW.utf8 #当前系统字符集
HADOOP_OPTS=-Djava.library.path=/usr/local/src/hadoop/hadoop-2.7.1/lib:/usr/local/src/hadoop/hadoop-2.7.1/lib/native
SELINUX_LEVEL_REQUESTED=
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root #当前使用者的主文件夹
CLASSPATH=.:/usr/local/src/java/jdk1.8.0_51/lib/dt.jar:/usr/local/src/java/jdk1.8.0_51/lib/tools.jar
SSH_CONNECTION=192.168.***.1 51684 192.168.***.121 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env

– 用set观察所有变量(含环境变量和自订变量)

除了环境变量,还有一些与bash操作接口有关的变量,以及使用者自定义的变量

[root@student01 ~]# set
BASH=/bin/bash #bash主程序放置路径
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") #bash版本
BASH_VERSION='4.1.2(1)-release' #bash版本
CLASSPATH=.:/usr/local/src/java/jdk1.8.0_51/lib/dt.jar:/usr/local/src/java/jdk1.8.0_51/lib/tools.jar
COLORS=/etc/DIR_COLORS
COLUMNS=133 #目前终端机黄金霞,使用的字段有几个字符长度
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HADOOP_COMMON_LIB_NATIVE_DIR=/usr/local/src/hadoop/hadoop-2.7.1/lib/native
HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1
HADOOP_OPTS=-Djava.library.path=/usr/local/src/hadoop/hadoop-2.7.1/lib:/usr/local/src/hadoop/hadoop-2.7.1/lib/native
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history #存放历史命令的目录
HISTFILESIZE=1000 #histfile存放历史命令的条目数(以往登陆)
HISTSIZE=1000 #内存中可以存储的历史命令最大笔数(当前登录)
HOME=/root
HOSTNAME=student01
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n' #默认的分割符号
JAVA_BIN=/usr/local/src/java/jdk1.8.0_51/bin
JAVA_HOME=/usr/local/src/java/jdk1.8.0_51
LANG=zh_TW.utf8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=21
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/usr/local/src/hadoop
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/src/java/jdk1.8.0_51/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/src/hadoop/hadoop-2.7.1/sbin:/usr/local/src/hadoop/hadoop-2.7.1/bin:/usr/local/src/zookeeper/zookeeper-3.4.7/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=2373
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ ' #命令提示字符 【root@student01】# 或【datsai~ 】$的设置值
PS2='> ' #如果使用跳脱符号,第二行以后的提示字符
PS4='+ '
PWD=/root
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT='192.168.161.1 51684 22'
SSH_CONNECTION='192.168.161.1 51684 192.168.161.121 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
ZK_HOME=/usr/local/src/zookeeper/zookeeper-3.4.7
_=env
colors=/etc/DIR_COLORS
myName=myNameWorldHey
work=/usr/local/src/hadoop
__udisks () 
{ 
    local IFS='
';
    local cur="${COMP_WORDS[COMP_CWORD]}";
    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--show-info" ]; then
        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
    else
        if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--inhibit-polling" ]; then
            COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
        else
            if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--mount" ]; then
                COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
            else
                if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--unmount" ]; then
                    COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                else
                    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--detach" ]; then
                        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                    else
                        if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-refresh" ]; then
                            COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                        else
                            if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-simulate" ]; then
                                _filedir || return 0;
                            else
                                if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--set-spindown" ]; then
                                    COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                                else
                                    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--poll-for-media" ]; then
                                        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                                    else
                                        COMPREPLY=($(IFS=: compgen -W "--dump:--inhibit-polling:--inhibit-all-polling:--enumerate:--enumerate-device-files:--monitor:--monitor-detail:--show-info:--help:--mount:--mount-fstype:--mount-options:--unmount:--unmount-options:--detach:--detach-options:--ata-smart-refresh:--ata-smart-wakeup:--ata-smart-simulate:--set-spindown:--set-spindown-all:--spindown-timeout:--poll-for-media" -- $cur));
                                    fi;
                                fi;
                            fi;
                        fi;
                    fi;
                fi;
            fi;
        fi;
    fi
}

PS1:提示字符的设置

$:关于本shell的PID

?:关于上一个执行指令的回传值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值