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返回空值,而其他会直接报错。
变量的设置规则:
-
变量与变量内容以一个等号连接
-
等号两边不能直接连空白字符
-
变量名称只能是英文字母与数字,但开头字符不能是数字
-
可以使用跳脱字符“\”将特殊字符变成一般字符
-
如果该变量为拓展变量内容时,可以使用" 变 量 名 称 “ 或 变量名称“或 变量名称“或{变量}累加内容
[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
-
若改变量需要在其他子程序执行,则需要以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
-
通常大写字符位系统默认变量,自行设置变量可以使用小写字符,方便判断
-
取消变量的方法为使用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
?:关于上一个执行指令的回传值