shell知识1

shell就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。

一、记录命令历史

我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中

与命令历史有关的有一个有意思的字符那就是 ‘!’ 了。常用的应用:

1) !! 连续两个 ‘!’, 表示执行上一条指令;

[root@localhost ~]# pwd
/root
[root@localhost ~]# !!
pwd
/root

2) !n 这里的n是数字,表示执行命令历史中第n条指令,例如 !1002 表示执行命令历史中第1002个命令;

[root@localhost ~]# history |grep 1002
 1002  pwd
 1015  history |grep 1002
[root@localhost ~]# !1002
pwd
/root

history 命令如果未改动过环境变量,默认可以把最近1000条命令历史打印出来。

3) !字符串 (字符串大于等于1),例如 !pw 表示执行命令历史中最近一次以 ‘pw’ 为开头的指令。

[root@localhost ~]# !pw
pwd
/root

指令和文件名补全

按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名。连续按两次tab键,系统则会把所有的指令或者文件名都列出来。

别名

前面也出现过alias的介绍,这个就是bash所特有的功能之一了。我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。如果不想用了,还可以用unalias解除别名功能。直接敲alias会看到目前系统预设的alias.

系统预设的alias指令也就这几个而已,你也可以自定义你想要的指令别名。alias语法很简单, alias [命令别名]=['具体的命令']

[root@localhost ~]# alias aming='pwd'
[root@localhost ~]# aming
/root
[root@localhost ~]# unalias aming
[root@localhost ~]# aming
bash: aming: command not found

使用 unalias 命令别名 就可以把设置的别名给解除了。

通配符

在bash下,可以使用 * 来匹配零个或多个字符,而用 ? 匹配一个字符。

[root@localhost ~]# ls -d test*
test1.txt  test2  test3  test.pl  test.txt
[root@localhost ~]# ls -d test?
test2  test3

输入输出重定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>

管道符

前面已经提过过管道符 “|”, 就是把前面的命令运行的结果丢给后面的命令。

作业控制

当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)。

[root@localhost ~]# vi test1.txt
testtestsstststst
使用 “vi” 编辑test1.txt, 随便输入一些内容,按 “ESC” 后, 使用 “Ctrl + z” 使任务暂停

[root@localhost ~]# vi test1.txt

[1]+  Stopped vi test1.txt
可以看到提示 “vi test1.txt” 已经停止了,然后使用fg命令恢复它,此时又进入刚才的 “vi” 窗口了。再次使其暂停,然后输入 jobs, 可以看到在被暂停或者在后台运行的任务:

[root@localhost ~]# jobs
[1]+  Stopped vi test1.txt
如果想把暂停的任务丢在后台跑起来,就使用bg命令:

[root@localhost ~]# bg
[1]+ vi test1.txt &

[1]+  Stopped vi test1.txt
但是 vi 似乎并不支持在后台运行,那换一个其他的命令:

[root@localhost ~]# vmstat 1 > /tmp/1.log
^Z
[2]+  Stopped vmstat 1 > /tmp/1.log
[root@localhost ~]# jobs
[1]-  Stopped vi test1.txt
[2]+  Stopped vmstat 1 > /tmp/1.log
[root@localhost ~]# bg 2
[2]+ vmstat 1 > /tmp/1.log &

当多个被暂停的任务会有编号,使用 jobs 命令可以看到两个任务,那么使用bg或者fg的时候,就需要在后面加一个编号了,使用 bg 2 把第二个被暂停的任务丢到后台跑起来了,丢入后台需要使用在命令后边加一个 & 符号,中间有个空格

丢到后台的任务如何关掉呢?如果你没有退出刚才的shell, 那么先使用 fg 编号 把任务调到前台,然后使用 “Ctrl + c” 结束任务:

[root@localhost ~]# fg 2
vmstat 1 > /tmp/1.log
^C
另一种情况则是,关闭到当前的shell, 再次打开另一个shell时,使用jobs命令并不会显示在后台运行或者被暂停的任务,要想停掉它的话,则需要先知道其pid, 然后使用kill命令杀死那个进程。

[root@localhost ~]# vmstat 1 > /tmp/1.log &
[1] 9433
[root@localhost ~]# ps aux |grep vmstat
root  9433  0.0  0.0   6180   516 pts/2S09:57   0:00 vmstat 1
root  9435  0.0  0.0 103308   848 pts/2S+   09:58   0:00 grep vmstat
使用 & 把任务丢入后台运行,它会显示pid信息,如果忘记这个pid,我们还可以使用 ps aux 命令找到那个进程,关于 ps 这个命令阿铭会在后面讲解的。想结束掉该进程,需要使用 kill 命令:

[root@localhost ~]# kill 9433
[1]+  已终止   vmstat 1 > /tmp/1.log
kill命令语法很简单,直接在后面加pid即可,如果遇到杀不死的进程时,可以在kill 后面加一个选项: kill -9 [pid]

变量

环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的。变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可。你可以使用echo命令显示变量的值。

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $LOGNAME
root
除了PATH, HOME, LOGNAME外,系统预设的环境变量还可以用env查看

[root@localhost ~]# env
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.72.137.107 50947 22
SSH_TTY=/dev/pts/0
USER=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:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=10.72.137.107 50947 10.72.137.159 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
使用 env 命令即可全部列出系统预设的全部系统变量了。不过登录的用户不一样这些环境变量的值也不一样。当前显示的就是root这个账户的环境变量了。

PATH 决定了shell将到哪些目录中寻找命令或程序 HOME 当前用户主目录 HISTSIZE 历史记录数 LOGNAME 当前用户的登录名 HOSTNAME 指主机的名称 SHELL 前用户Shell类型 LANG 语言相关的环境变量,多语言可以修改此环境变量 MAIL 当前用户的邮件存放目录 PWD 当前目录

env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。

[root@localhost ~]# set
BASH=/bin/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]="i386-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=168
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=i386
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=44
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=i386-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=27377
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.72.137.107 50947 22'
SSH_CONNECTION='10.72.137.107 50947 10.72.137.159 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
_=-
colors=/etc/DIR_COLORS
set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。

[root@localhost ~]# myname=Aming
[root@localhost ~]# echo $myname
Aming
[root@localhost ~]# set |grep myname
myname=Aming
虽然你可以自定义变量,但是该变量只能在当前shell中生效。

[root@localhost ~]# echo $myname
Aming
[root@localhost ~]# bash
[root@localhost ~]# echo $myname

[root@localhost ~]# exit
exit
[root@localhost ~]# echo $myname
Aming

使用 bash 命令即可再打开一个shell,此时先前设置的 “myname” 变量已经不存在了,退出当前shell回到原来的shell, “myname” 变量还在。有两种情况:

1) 要想系统内所有用户登录后都能使用该变量

需要在 “/etc/profile” 文件最末行加入 export myname=Aming 然后运行 source /etc/profile 就可以生效了。此时再运行bash命令或者直接 su - test 账户可以看到效果。

[root@localhost ~]# echo "export myname=Aming" >> /etc/profile
[root@localhost ~]# source !$
source /etc/profile
[root@localhost ~]# bash
[root@localhost ~]# echo $myname
Aming
[root@localhost ~]# exit
exit
[root@localhost ~]# su - test
[test@localhost ~]$ echo $myname
Aming

2)只想让当前用户使用该变量

需要在用户主目录下的 .bashrc 文件最后一行加入 export myname=Aming 然后运行 source .bashrc 就可以生效了。这时候再登录test账户,myname变量则不会生效了。上面用的source命令的作用是,将目前设定的配置刷新,即不用注销再登录也能生效。

那么在linux下设置自定义变量有哪些规则呢?

设定变量的格式为 “a=b”, 其中a为变量名,b为变量的内容,等号两边不能有空格;
变量名只能由英、数字以及下划线组成,而且不能以数字开头;
当变量内容带有特殊字符(如空格)时,需要加上单引号;
[root@localhost ~]# myname='Aming Li'
[root@localhost ~]# echo $myname
Aming Li
有一种情况,需要你注意,就是变量内容中本身带有单引号,这就需要用到双引号了。

[root@localhost ~]# myname="Aming's"
[root@localhost ~]# echo $myname
Aming's
如果变量内容中需要用到其他命令运行结果则可以使用反引号;
[root@localhost ~]# myname=`pwd`
[root@localhost ~]# echo $myname
/root
变量内容可以累加其他变量的内容,需要加双引号;
[root@localhost ~]# myname="$LOGNAME"Aming
[root@localhost ~]# echo $myname
rootAming
在这里如果你不小心把双引号加错为单引号,将得不到你想要的结果

[root@localhost ~]# myname='$LOGNAME'Aming
[root@localhost ~]# echo $myname
$LOGNAMEAming
通过上面几个例子也许你能看得出,单引号和双引号的区别,用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。

多次使用了 bash 命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下。

[root@localhost ~]# pstree |grep bash
 |-login---bash
 |-sshd---sshd---bash-+-grep
[root@localhost ~]# bash
[root@localhost ~]# pstree |grep bash
 |-login---bash
 |-sshd---sshd---bash---bash-+-grep
pstree 这个指令会把linux系统中所有进程通过树形结构打印出来。可以直接输入pstree查看即可。在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令。

[root@localhost ~]# abc=123
[root@localhost ~]# echo $abc
123
[root@localhost ~]# bash
[root@localhost ~]# echo $abc

[root@localhost ~]# exit
exit
[root@localhost ~]# export abc
[root@localhost ~]# echo $abc
123
[root@localhost ~]# bash
[root@localhost ~]# echo $abc
123
export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量。

[root@localhost ~]# export
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x 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:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="3"
declare -x SSH_CLIENT="10.72.137.107 50947 22"
declare -x SSH_CONNECTION="10.72.137.107 50947 10.72.137.159 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="root"
declare -x abc="123"
declare -x myname="\$LOGNAMEAming"
在最后面连同我们自定义的变量都被声明了。

前面光讲如何设置变量,如果想取消某个变量怎么办?只要输入 unset 变量名 即可。

[root@localhost ~]# echo $abc
123
[root@localhost ~]# unset abc
[root@localhost ~]# echo $abc

系统环境变量与个人环境变量的配置文件

那么在linux系统中,这些变量被存到了哪里呢,为什么用户一登陆shell就自动有了这些变量呢?

/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umask等等。

/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如linux系统PS1就是 [root@localhost ~]#, 我们不妨看一下PS1的值:

[root@localhost ~]# echo $PS1
[\u@\h \W]\$
\u 就是用户, \h 主机名, \W 则是当前目录,\$ 就是那个 ‘#’ 了,如果是普通用户则显示为 ‘$’.

除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:

.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。

.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。

.bash_history :记录命令历史用的。

.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。

linux shell中的特殊符号
你在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字。下面阿铭就说一说常用到的特殊字符。

* 代表零个或多个任意字符。
[root@localhost ~]# ls -d test*
test  test1  test2  test3
? 只代表一个任意的字符
[root@localhost ~]# touch testa
[root@localhost ~]# touch testb.txt
[root@localhost ~]# ls -d test?
test1  test2  test3  testa
不管是数字还是字母,只要是一个都能匹配出来。

# 这个符号在linux中表示注释说明的意思,即 # 后面的内容linux忽略掉。
[root@localhost ~]# abc=123 #aaaaa
[root@localhost ~]# echo $abc
123
\ 脱意字符,将后面的特殊符号(例如”*” )还原为普通字符。
[root@localhost ~]# ls -d test\*
ls: 无法访问test*: 没有那个文件或目录
| 管道符,前面多次出现过,它的作用在于将符号前面命令的结果丢给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍。
[root@localhost ~]# cat testb.txt |wc -l
0
wc -l 用来计算一个文档有多少行。在这里一下子列出来很多对你陌生的命令,其实这些命令在日常的处理文档工作中非常实用。

知识点

1、习题

1. 设置环境变量 HISTSIZE , 使其能够保存10000条命令历史。
vim /etc/profile  
把 HISTSIZE=1000 改为 HISTSIZE=10000


2. 为什么如果这样设置PS1 (PS1="[\u@\h \W]\$ ")  显示的结果和我们预想的不一样,那要如何设置才能恢复原来默认的?
应该是 PS1='[\u@\h \W]\$ '


3. 想办法把当前目录下的文件的文件名中的小写字母全部替换为大写字母。
for f in `ls`; do if echo $f |grep -q '[a-z]'; then mv $f `echo $f|tr '[a-z]' '[A-Z]'`;fi; done


4. 使用sort以":"为分隔符,对/etc/passwd文件的第5段排序。
sort -t: -k5  /etc/passwd


5. 使用cut以":"为分隔符,截出/etc/passwd的第三段字符。
cut -d: -f3 /etc/passwd


6. 简述这几个文件的作用: /etc/profile, /etc/bashrc, .bashrc, .bash_profile.
/etc/profile :  设置系统全局环境变量和启动程序,当用户登录Linux时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。预设的系统全局变量包括PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。

/etc/bashrc : 为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。默认情况下,这个文件主要预设umask以及PS1等。

.bash_profile : 定义用户专有的环境变量和启动程序。当用户登录时,该文件仅仅执行一次。 默认情况下,它设置了一些环境变量,执行用户的.bashrc文件。

.bashrc :该文件包含专用于用户的shell的bash信息,当用户登录时以及每次打开新的shell时,该该文件被读取。可以将用户自定义的alias和变量写到这个文件中。



7. export 的作用是什么?
export 用来声明变量,可以使声明的变量在子shell中生效。


8. linux下自定义变量要符合什么样的规则呢?
(1) 设定变量的格式为“a=b”, 其中a为变量名,b为变量的内容,等号两边不能有空格;

(2)变量名只能由英、数字以及下划线组成,而且不能以数字开头;

(3)当变量内容带有特殊字符(如空格)时,需要加上单引号,变量内容中本身带有单引号的情况则使用双引号;

(4)如果变量内容中需要用到其他命令运行结果则可以使用反引号;

(5)变量内容可以累加其他变量的内容,需要加双引号。



9. 如何把要运行的命令丢到后台跑?又如何把后台跑的进程给调到前台?
要将运行的命令丢到后台,可以先按CTRL+Z让其暂停,然后使用bg命令将其丢到后台运行;或者执行命令时添加&后台标识,格式为“命令+空格+&”。

将后台运行的进程调到前台,可以输入fg快捷键。



10.  列出当前目录下以"test"开头的文件和目录。
ls test*


11.  如何把一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件内?
使用tee命令,如 cat /etc/passwd |tee 2.txt


12. 假如有个命令很长,我们如何使用一个简单的字符串代替这个复杂的命令呢?请举例说明。
使用alias  如 alias abc="/usr/local/apache/bin/apachectl -t"


13. 我如何实现这样的功能,把一条命令丢到后台运行,而且把其正确输出和错误输出同时重定向到一个文件内?
ls la 1.txt ; ls -la 2.txt & | &> 1.conf


14. 如何按照大小(假如按照10M)分隔一个大文件,又如何按照行数(假如10000行)分隔?
split -b 10M bigfile
split -l 10000 bigfile


15. 做实验,搞明白 ; && || 这三个符号的含义。
;:只是用来分割多个命令,各条命令相互独立运行,没有任何关联性。

&&:只有前面的命令成功执行后,后面的命令才会执行。如果前面的命令执行失败,则忽略后面的命令。

||:多条命令中只要一条命令执行成功,则忽略后面的命令,否则运行后面的命令。


16. 如果只想让某个用户使用某个变量如何做?
vim  /home/username/.bashrc  增加一行  export  abc=123
然后再 source  /home/username/.bashrc


17. 使用哪个命令会把系统当中所有的变量以及当前用户定义的自定义变量列出来?
set

Linux环境变量之“PS1"

http://www.lishiming.net/thread-5364-1-1.html

Linux支持中文

http://www.lishiming.net/thread-5360-1-1.html

让命令历史永久保存并加时间戳

http://www.lishiming.net/thread-283-1-1.html

linux 下/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc

 http://www.lishiming.net/thread-909-1-1.html

关于PROMPT_COMMAND环境变量的含义

http://www.linuxnote.org/prompt_command-environment-variables.html

source和 exec 区别

http://alsww.blog.51cto.com/2001924/1113112

Linux特殊符号大全

http://ask.apelearn.com/question/7720

sort并未按ASCII排序

http://blog.csdn.net/zenghui08/article/details/7938975

简易审计系统

http://www.68idc.cn/help/server/linux/2014042190951.html

转载于:https://my.oschina.net/u/3850989/blog/1823066

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值