第11章 认识和学习bash

时间:2023-03-09 20:44:03
第11章 认识和学习bash

认识bash这个shell

硬件、内核和shell

用户操作计算机流程如下:

用户——>用户界面(shell,KDE,application)——>核心(kernel)——>硬件(hardware)

应用程序处于最外层,因此称为shell,shell的功能是提供用户操作系统的一个接口。狭义的shell指的是命令行软件(包括bash),广义的shell包括图形界面软件

系统的合法shell和/etc/shells功能

系统合法的shell都写入到/etc/shells这个软件,查看该文件如下:

[root@localhost wuchao_test]# cat /etc/shells
/bin/sh            (已经被/bin/bash所替代)
/bin/bash           (Linux默认的shell)
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost wuchao_test]#

用户登陆后可以取得的默认shell都会记录在/etc/passwd文件内:

[root@localhost wuchao_test]# cat /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
games:x:::games:/usr/games:/sbin/nologin
ftp:x:::FTP User:/var/ftp:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:::systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:::systemd Network Management:/:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin
polkitd:x:::User for polkitd:/:/sbin/nologin
abrt:x::::/etc/abrt:/sbin/nologin
tss:x:::Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:::Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:::usbmuxd user:/:/sbin/nologin
colord:x:::User for colord:/var/lib/colord:/sbin/nologin
amandabackup:x:::Amanda user:/var/lib/amanda:/bin/bash
saslauth:x:::Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
geoclue:x:::User for geoclue:/var/lib/geoclue:/sbin/nologin
rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
setroubleshoot:x::::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:::RealtimeKit:/proc:/sbin/nologin
ntp:x::::/etc/ntp:/sbin/nologin
qemu:x:::qemu user:/:/sbin/nologin
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
radvd:x:::radvd user:/:/sbin/nologin
chrony:x::::/var/lib/chrony:/sbin/nologin
sssd:x:::User for sssd:/:/sbin/nologin
pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x::::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x::::/var/spool/postfix:/sbin/nologin
sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x::::/:/sbin/nologin
wuchao:x:::rootUser(wuchao):/home/wuchao:/bin/bash

bash shell的功能

既然/bin/bash是Linux默认的shell,接下来了解下这个shell。

bash有以下优点:

命令记忆功能

可以记下使用过的命令,只要在命令行按上下关键就可以找到前/后输入过的命令。这些命令记录在~/.bash_history,注意的是该文件只记录上次之前的命令,本次的所有命令暂存在内存里

命令补全功能

tab键接在一串命令的第一个字后面,则为命令补全,tab键接在一串命令的第二个字以后,则为文件补全

命令别名设置

当我们想列出所有文件时,需要输入ls -al命令,更快捷的方式是使用别名代替这个命令,设置别名:alias lm=‘ls -al’

//设置别名
[root@localhost wuchao_test]# alias lm='ls -al'
[root@localhost wuchao_test]# lm .
total
drwxr-xr-x. root root 6月 : .
drwxrwxrwt. root root 7月 : ..
-rw-r--r--. root root 6月 : hosts
-rw-r--r--. root root 4月 : inittab
-rw-------. root root 6月 : test2.txt
-rw-------. root root 6月 : .test2.txt.swo
-rw-r--r--. root root 6月 : test.txt //取消别名
[root@localhost wuchao_test]# unalias lm
[root@localhost wuchao_test]# lm .
bash: lm: command not found...
[root@localhost wuchao_test]#

作业控制、前台、后台控制

第17章Linux过程控制部分再讲

程序脚本(shell script)

可以将平时管理系统需要执行的连续命令写成一个文件

通配符

比如查询/usr/bin下有多少以X开头的文件,输入:ls -l /usr/bin/X*

bash shell的内置命令:type

使用type可以查看命令是bash内置的,还是来源于其他

[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
[root@localhost ~]# type cd
cd is a shell builtin
[root@localhost ~]# type which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

shell的变量功能

变量的显示与设置:echo,unset

变量的显示:echo $变量名或echo ${变量名}

root@iZ28o1pcxtmZ:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1..0_77/bin:/usr/local/java/jdk1..0_77/bin
root@iZ28o1pcxtmZ:~#

变量的设置规则:

1.变量与变量内容用“=”号连接

2.单引号内的字符仅为一般字符,双引号内的特殊字符可保持原有特性

root@iZ28o1pcxtmZ:~# name1='$PATH'
root@iZ28o1pcxtmZ:~# name2="$PATH" root@iZ28o1pcxtmZ:~# echo $name1
$PATH
root@iZ28o1pcxtmZ:~# echo $name2
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1..0_77/bin:/usr/local/java/jdk1..0_77/bin root@iZ28o1pcxtmZ:~#

3.可用转义字符“\”将特殊字符变为一般字符

4.在一串命令中,如果还需要其他命令提供信息,使用反单引号`命令`或$(命令)

root@iZ28o1pcxtmZ:~# version=$(uname -r)
root@iZ28o1pcxtmZ:~# echo $version
3.13.--generic
root@iZ28o1pcxtmZ:~#

5.在变量后追加变量内容,可用“$变量名称”或${变量名称}累加内容

root@iZ28o1pcxtmZ:~# name1=hello
root@iZ28o1pcxtmZ:~# name2=${name1}wuchao root@iZ28o1pcxtmZ:~# echo $name2
hellowuchao
root@iZ28o1pcxtmZ:~#

6.若该变量需要在其他子进程使用,需要export来使变量称为环境变量

环境变量的功能

用env查看环境变量

[root@localhost 桌面]# env
XDG_VTNR=
XDG_SESSION_ID=
SSH_AGENT_PID=
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/run/user//keyring/gpg::
VTE_VERSION=
XDG_MENU_PREFIX=gnome-
SHELL=/bin/bash
TERM=xterm-256color
HISTSIZE=
WINDOWID=
IMSETTINGS_MODULE=IBus
USER=root
LS_COLORS=rs=:di=;;:ln=;;:mh=;;;:pi=;;;:so=;;:do=;;:bd=;;;;;:cd=;;;;;:or=;;;;;:mi=;;;;;;:su=;;;;;:sg=;;;;;:ca=;;;;;:tw=;;;;;:ow=;;;;;:st=;;;;;:ex=;;:*.tar=;;:*.tgz=;;:*.arc=;;:*.arj=;;:*.taz=;;:*.lha=;;:*.lz4=;;:*.lzh=;;:*.lzma=;;:*.tlz=;;:*.txz=;;:*.tzo=;;:*.t7z=;;:*.zip=;;:*.z=;;:*.Z=;;:*.dz=;;:*.gz=;;:*.lrz=;;:*.lz=;;:*.lzo=;;:*.xz=;;:*.bz2=;;:*.bz=;;:*.tbz=;;:*.tbz2=;;:*.tz=;;:*.deb=;;:*.rpm=;;:*.jar=;;:*.war=;;:*.ear=;;:*.sar=;;:*.rar=;;:*.alz=;;:*.ace=;;:*.zoo=;;:*.cpio=;;:*.7z=;;:*.rz=;;:*.cab=;;:*.jpg=;;:*.jpeg=;;:*.gif=;;:*.bmp=;;:*.pbm=;;:*.pgm=;;:*.ppm=;;:*.tga=;;:*.xbm=;;:*.xpm=;;:*.tif=;;:*.tiff=;;:*.png=;;:*.svg=;;:*.svgz=;;:*.mng=;;:*.pcx=;;:*.mov=;;:*.mpg=;;:*.mpeg=;;:*.m2v=;;:*.mkv=;;:*.webm=;;:*.ogm=;;:*.mp4=;;:*.m4v=;;:*.mp4v=;;:*.vob=;;:*.qt=;;:*.nuv=;;:*.wmv=;;:*.asf=;;:*.rm=;;:*.rmvb=;;:*.flc=;;:*.avi=;;:*.fli=;;:*.flv=;;:*.gl=;;:*.dl=;;:*.xcf=;;:*.xwd=;;:*.yuv=;;:*.cgm=;;:*.emf=;;:*.axv=;;:*.anx=;;:*.ogv=;;:*.ogx=;;:*.aac=;;:*.au=;;:*.flac=;;:*.mid=;;:*.midi=;;:*.mka=;;:*.mp3=;;:*.mpc=;;:*.ogg=;;:*.ra=;;:*.wav=;;:*.axa=;;:*.oga=;;:*.spx=;;:*.xspf=;;:
SSH_AUTH_SOCK=/run/user//keyring/ssh
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/,unix/unix:/tmp/.ICE-unix/
USERNAME=root
GNOME_SHELL_SESSION_MODE=classic
DESKTOP_SESSION=gnome-classic
MAIL=/var/spool/mail/root
PATH=/usr/local/java/jdk1..0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
QT_IM_MODULE=ibus
PWD=/root/桌面
JAVA_HOME=/usr/local/java/jdk1..0_91
XMODIFIERS=@im=ibus
LANG=zh_CN.UTF-
GDM_LANG=zh_CN.UTF-
GDMSESSION=gnome-classic
HISTCONTROL=ignoredups
SHLVL=
HOME=/root
XDG_SEAT=seat0
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=root
XDG_SESSION_DESKTOP=gnome-classic
CLASSPATH=/usr/local/java/jdk1..0_91/jre/lib/ext:/usr/local/java/jdk1..0_91/lib/tools.jar
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XFSA7YGZp6,guid=46b270284336ec9172459a4e5777171e
LESSOPEN=||/usr/bin/lesspipe.sh %s
WINDOWPATH=
DISPLAY=:
XDG_RUNTIME_DIR=/run/user/
XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME
XAUTHORITY=/run/gdm/auth-for-root-Qkf798/database
_=/usr/bin/env
[root@localhost 桌面]#

以下对几个常见的环境变量简单的介绍下:

HOME:代表用户的主文件夹

SHELL:告知目前环境使用的shell是哪个程序

HISTSIZE:历史命令的记录数

MAIL:当我们使用mail命令时,系统读取的邮件信箱文件

LANG:语系数据,英文通常为en_US.UTF-8,中文通常是zh_CN.gb2312和zh_CN.UTF-8

RANDOM:随机数的变量,可以通过$RANDOM获取,范围为0~32767

set查看所有变量(环境变量和自定义变量)

[root@localhost 桌面]# set
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([]="" []="" []="" []="" []="release" []="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(1)-release'
CLASSPATH=/usr/local/java/jdk1..0_91/jre/lib/ext:/usr/local/java/jdk1..0_91/lib/tools.jar
COLUMNS=
COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XFSA7YGZp6,guid=46b270284336ec9172459a4e5777171e
DESKTOP_SESSION=gnome-classic
DIRSTACK=()
DISPLAY=:
EUID=
GDMSESSION=gnome-classic
GDM_LANG=zh_CN.UTF-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_SHELL_SESSION_MODE=classic
GPG_AGENT_INFO=/run/user//keyring/gpg::
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=
HISTSIZE=
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=
IFS=$' \t\n'
IMSETTINGS_INTEGRATE_DESKTOP=yes
IMSETTINGS_MODULE=IBus
JAVA_HOME=/usr/local/java/jdk1..0_91
LANG=zh_CN.UTF-
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=
LOGNAME=root
LPATHDIR=/root/.cache/abrt
LS_COLORS='rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=
OPTERR=
OPTIND=
OSTYPE=linux-gnu
PATH=/usr/local/java/jdk1..0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
PIPESTATUS=([]="")
PPID=
PROMPT_COMMAND=__vte_prompt_command
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=$'/root/\346\241\214\351\235\242'
QT_IM_MODULE=ibus
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/,unix/unix:/tmp/.ICE-unix/
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=
SINCE=
SINCEFILE=/root/.cache/abrt/lastnotification
SSH_AGENT_PID=
SSH_AUTH_SOCK=/run/user//keyring/ssh
TERM=xterm-256color
TMPPATH=/root/.cache/abrt/lastnotification.w46b8i8T
UID=
USER=root
USERNAME=root
VTE_VERSION=
WINDOWID=
WINDOWPATH=
XAUTHORITY=/run/gdm/auth-for-root-Qkf798/database
XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/
XDG_SEAT=seat0
XDG_SESSION_DESKTOP=gnome-classic
XDG_SESSION_ID=
XDG_VTNR=
XMODIFIERS=@im=ibus
//后面省略

上面会列出很多变量,记住几个比较重要的变量:

PS1:提示符设置

\d:显示星期月日的日期格式

\H:完整的主机名

\h:主机名第一个小数点前面的部分

\t:显示时间,24小时格式,HH:MM:SS

\T:显示时间,12小时格式,HH:MM:SS

\A:显示时间,24小时格式,HH:MM

\@:显示时间,12小时,am/pm样式

\u:目前用户的账号名称

\v:BASH的版本

\w:完整的工作目录名称

\W:利用basename取得的工作目录名称,所有仅会列出最后一个目录名

\#:执行的第几个命令

\$:提示符,如果是root时显示#

查看上面内容可知PS1='[\u@\h \W]\$ ',故命令行显示[root@localhost ~]#

OSTYPE,HOSTYPE,MACHTYPE

主机硬件与内核等级

export:自定义变量转成环境变量

当我们登陆Linux时便取得一个bash,这个bash就是一个独立的进程,在这个bash执行的命令都是由这个bash衍生出来的,因此被执行的命令称为子进程,子进程仅会继承父进程的环境变量,不会继承自定义变量。

使用“export 变量名”将自定义变量设为环境变量,使用“export”可以查看所有的环境变量。

影响显示结果的语系变量(local)

使用locale -a查看所有支持的语系

[root@localhost ~]# locale -a
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE@euro
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8
//省略
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.iso88591
zu_ZA.utf8
[root@localhost ~]#

查看需要设置的语系变量

直接输入locale

[root@localhost ~]# locale
LANG=zh_CN.UTF-
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[root@localhost ~]#

当设置了LANG或者LC_ALL时,其他的语系变量都会被这两个变量替换,所以我们通常只设置LANG变量即可。centos7以前在/etc/sysconfig/i18n设置,centos7在/etc/loacle.conf文件设置LANG="zh_CN.UTF-8"

变量的有效范围

环境变量可以被子进程使用,类似于全局变量,其余变量不可以被子进程使用,类似于局部变量。

变量键盘的读取、数组与声明:read,array,declare

read

读取来自键盘输入的变量

read [-pt] 变量名

参数:

-p:后面可以接提示符

-t:后面接等待的秒数

[root@localhost 桌面]# read -p "please input your name:" -t  name
please input your name:wuchao
[root@localhost 桌面]# echo $name
wuchao
[root@localhost 桌面]#

declare/typeset

declare和typeset是一样的功能,就是声明变量的类型

如果declare后面不接任何参数,功能和set一样,显示所有变量和内容

declare [-aixr] 变量名

参数:

-a:将变量定义为数组

-i:将变量定义为整型

-x:定义为环境变量

-r:将变量定义为readonly,不能更改内容,也不能重设

//变量类型默认为字符串
[root@localhost 桌面]# sum=++
[root@localhost 桌面]# echo $sum
++ //定义为整型,后面才会当成计算式
[root@localhost 桌面]# declare -i sum=++
[root@localhost 桌面]# echo $sum [root@localhost 桌面]#

数组类型:

[root@localhost 桌面]# var[]="cat"
[root@localhost 桌面]# var[]="dag"
[root@localhost 桌面]# var[]="monkey"
[root@localhost 桌面]# echo "${var[1]},${var[2]},${var[3]}"
cat,dag,monkey
[root@localhost 桌面]#

与文件系统及程序的限制关系:ulimit

ulimit [-SHacdfltu]  [配额]

变量内容的删除、替代与替换

变量的删除与替换

#定义一个变量并赋值
[wuchao@localhost 桌面]$ value=/wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin
[wuchao@localhost 桌面]$ echo $value
/wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin #删除变量从左侧开始匹配的最短字符“/*wuchao/sbin:”,*表示匹配0到多个字符
[wuchao@localhost 桌面]$ echo ${value#/*wuchao/sbin:}
/root/bin:/root/sbin #删除变量从左侧开始匹配的最短字符“/*:”,*表示匹配0到多个字符
[wuchao@localhost 桌面]$ echo ${value#/*:}
/wuchao/sbin:/root/bin:/root/sbin #删除变量从左侧开始匹配的最长字符“/*:”,*表示匹配0到多个字符
[wuchao@localhost 桌面]$ echo ${value##/*:}
/root/sbin

#表示从左侧匹配删除,%表示从右侧匹配删除,/表示匹配替换

变量设置方式 说明
${变量#关键字} 从头开始匹配,删除符合的最短匹配内容
${变量##关键字} 从头开始匹配,删除符合的最长匹配内容
${变量%关键字} 从尾开始匹配,删除符合的最短匹配内容
${变量%%关键字} 从尾开始匹配,删除符合的最长匹配内容
${变量/旧字符/新字符} 把第一个符合的旧字符用新字符替换
${变量//旧字符/新字符} 把所有符合的旧字符用新字符替换

变量的测试与内容替换

new_var=${old_var-content}

判断一个变量是否存在,若不存在,则设置该变量

[wuchao@localhost 桌面]$ echo ${username-wuchao}
wuchao

new_var=${old_var:-content}

判断一个变量是否存在,若不存在或者为空字符,则设置该变量

[wuchao@localhost 桌面]$ username=""
[wuchao@localhost 桌面]$ echo ${username:-wuchao}
wuchao
[wuchao@localhost 桌面]$

命令别名与历史命令

命令别名设置:alias,unalias

格式:alias lm='ls -l | more'

取消别名:unalias lm

历史命令:history

history [n] :列出最近n条命令

history:列出目前内存中的所有命令

历史命令的执行:

//查看内存中的历史命令
[wuchao@localhost 桌面]$ history
tar VMware Tools
tar --help
cd /tmp
ls -a
ls mount-point
mount
df
ls -a
value=wuchao/bin:wuchao/sbin:root/bin/root/sbin
echo $value
echo ${value#/*wuchao/sbin:}
12 echo ${value#*wuchao/sbin:}
13 value=wuchao/bin:wuchao/sbin:root/bin/root/sbin
14 value=/wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin
15 echo $value
16 echo ${value#/*wuchao/sbin:}
17 echo ${value#/*:}
18 echo ${value##/*:}
19 echo ${username-wuchao}
20 username=""
21 new_var=${old_var-content}
22 判断一个变量是否存在,若不存在,则设置该变量
23 username=""
24 echo ${username:wuchao}
25 echo ${username:-wuchao}
26 history
27 history -r
28 tar VMware Tools
29 tar --help
30 cd /tmp
31 ls -a
32 ls mount-point
33 mount
34 df
35 ls -a
36 history //执行第4条历史命令
[wuchao@localhost 桌面]$ !4
ls -a
. .. VMware Tools //执行以d开头的历史命令
[wuchao@localhost 桌面]$ !d
df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 49746196 6395416 43350780 13% /
devtmpfs 1417484 0 1417484 0% /dev
tmpfs 1432772 156 1432616 1% /dev/shm
tmpfs 1432772 9104 1423668 1% /run
tmpfs 1432772 0 1432772 0% /sys/fs/cgroup
/dev/sda1 508588 160376 348212 32% /boot
tmpfs 286556 16 286540 1% /run/user/1000
[wuchao@localhost 桌面]$

Bash Shell的操作环境

路径与命令查找顺序

  1. 以相对或绝对路径执行命令,如“/bin/ls“
  2. 由alias找到执行的命令
  3. 由bash内置命令来执行
  4. 通过$PATH这个变量的顺序找到的第一个命令

bash的登陆与欢迎信息:/etc/issue,/etc/motd

登陆时的提示符放在/etc/issue内

登陆后的欢迎信息放在/etc/motd内

bsh的环境配置文件

配置文件用于bash启动时的环境配置,比如自定义变量,别名等。

首先了解login shell和non-login shell的区别:

login shell:取得bash时所需的完整登录流程

non-login shell:取得bash接口的方法不需要重复登录的举动

login shell会读取以下两个配置文件:

1. /etc/profile:这是系统整体的设置,不建议修改

2. ~/.bash_profile或~/.bash_login或~/.profile :属于用户个人设置,可以在此修改

/etc/profile(login shell才会读)

配置用户的整体环境

PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录

MAIL:根据账号设置用户的邮箱到/var/spool/mail/账户名

USER:根据账户名设置

HOSTNAME:依据主机的hostname设置

HISTSIZE:设置历史纪录命令数

[wuchao@localhost ~]$ cat /etc/profile
# /etc/profile # System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc # It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates. pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$
else
PATH=$:$PATH
fi
esac
} if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`id -u`
UID=`id -ru`
fi
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi # Path manipulation
if [ "$EUID" = "" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi HOSTNAME=`/usr/bin/hostname >/dev/null`
HISTSIZE=
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt ] && [ "`id -gn`" = "`id -un`" ]; then
umask
else
umask
fi for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done unset i
unset -f pathmunge
JAVA_HOME=/usr/local/java/jdk1.8.0_91
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[wuchao@localhost ~]$

~/.bash_profile(login shell才会读)

bash读取了整体环境配置文件/etc/profile后,利用该文件读取用户的个人配置。个人配置文件包括以下三个:

1. ~/.bash_profile

2. ~/.bash_login

3. ~/.profile

实际上,bash的login shell只会读取上面三个文件中的一个,依据顺序读取,第一个存在时,便只会读取第一个。

[wuchao@localhost ~]$ cat ~/.bash_profile
# .bash_profile # Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin export PATH
[wuchao@localhost ~]$

source:读取环境配置

source 配置文件名:将主文件夹~/.bashrc的设置读入到目前的bash环境

也可以表示为“. ~/.bashrc”,如上面示例中的if语句内所示,如果~/.bashrc存在,则读取该文件。

~/.bashrc(non-login shell会读)

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi # Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER= # User specific aliases and functions
[wuchao@localhost ~]$

可以看出,该配置文件还会调用/etc/bashrc

通配符与特殊符号

通配符如下:

符号 意义
* 代表0到无穷个任意字符
代表一定有一个字符
[] 代表一定有一个在括号内的字符
[-] 代表在编码顺序内的所有字符,[0-9]代表0-9直接的所有数字
[^] [^abc]表示不是abc的其他字符

bash环境的其他特殊符号:

符号 意义
# 批注符号,后面内容不执行
\ 转义
| 管道,分隔两个管道命令的界定
连续命令执行分隔符
~ 用户的主文件夹
$ 使用变量前导符
& 作业控制,将命令变成背景下工作
逻辑非
/ 路径分割符
>,>> 数据流重定向,输出导向,分别是“替换”和“累加”
<,<< 数据流重定向,输入导向
‘’ 单引号,不具有变量置换的功能
“” 具有变量置换的功能
·· 两个“·”中间为先执行的命令,也可以表示为$()
() 在中间为子shell的起始与结束
{} 在中间为命令块的组合

数据流重定向

什么是数据流重定向

将某个命令执行后应该要显示在屏幕上的数据传输到其他的地方。

1.标准输入:代码0,使用<或<<

2.标准输出:代码1,使用>或>>

3.标准错误输出:代码2,使用2>或2>>

//列出根目录的文件名,重定向到~/rootfile文件中
[wuchao@localhost ~]$ ls -l / > ~/rootfile
//查看该文件
[wuchao@localhost ~]$ ls -l ~/rootfile
-rw-rw-r--. wuchao wuchao 7月 : /home/wuchao/rootfile
[wuchao@localhost ~]$

注意:使用“>”时,当文件不存在则创建文件,当存在时,覆盖文件内容,使用“>>”则在原来文件后追加数据。

注意:若要将标准输出和标准错误输出都指向同一个文件,可以使用“> filename 2>&1”或者"&> filename"

//在cat后加入>后,catfile文件将主动创建,键盘输入内容放在该文件,ctrl+d退出
[wuchao@localhost ~]$ cat > catfile
this is a testing file
test
[wuchao@localhost ~]$ cat catfile
this is a testing file
test
//用某个文件的内容代替键盘输入
[wuchao@localhost ~]$ cat > catfile < ~/.bashrc
[wuchao@localhost ~]$ ls -l catfile ~/.bashrc
-rw-rw-r--. wuchao wuchao 7月 : catfile
-rw-r--r--. wuchao wuchao 11月 /home/wuchao/.bashrc
[wuchao@localhost ~]$

“<<”表示结束输入

[wuchao@localhost ~]$ cat > catfile << "end"
> this is test
> test
> end //输入end后,自动退出
[wuchao@localhost ~]$

命令执行的判断依据: ; , && ||

cmd;cmd (不考虑命令相关性的连续执行)

比如:

[wuchao@localhost ~]$ sync;sync;shutdown -h now

$?(命令回传码)与&&或||

命令 说明
cmd1 && cmd2

若cmd1执行完毕且正确执行($?=0),则开始执行cmd2

若cmd1执行完毕且为错误($?不为0),则不执行cmd2

cmd1 || cmd2

若cmd1执行完毕且正确执行($?=0),则不执行cmd2

若cmd1执行完毕且为错误($?不为0),则执行cmd2

管道命令

1.管道命令仅会处理标准输出,对于标注错误输出则会忽略

2.管道命令必须能够接受来自前一个命令的数据成为标准输入继续处理才行

选取命令:cut,grep

cut:将一段信息的某一段切出来

cut -d ‘分隔符’ -f fields

-d:后面接分隔符

-f:后面接选取第几段

-c:以字符的单位取出固定字符区间

[wuchao@localhost ~]$ echo $PATH
/usr/local/java/jdk1..0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/wuchao/.local/bin:/home/wuchao/bin
//以‘:’分割,选取第3和第5段
[wuchao@localhost ~]$ echo $PATH | cut -d ':' -f ,
/usr/local/sbin:/usr/sbin
[wuchao@localhost ~]$ export
declare -x XDG_CURRENT_DESKTOP="GNOME-Classic:GNOME"
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="gnome-classic"
declare -x XDG_SESSION_ID=""
declare -x XDG_VTNR=""
declare -x XMODIFIERS="@im=ibus"
//显示第12个及以后的字符
[wuchao@localhost ~]$ export | cut -c -
XDG_CURRENT_DESKTOP="GNOME-Classic:GNOME"
XDG_MENU_PREFIX="gnome-"
XDG_RUNTIME_DIR="/run/user/1000"
XDG_SEAT="seat0"
XDG_SESSION_DESKTOP="gnome-classic"
XDG_SESSION_ID=""
XDG_VTNR=""
XMODIFIERS="@im=ibus"
[wuchao@localhost ~]$

grep:分析一行信息,若有需要的则拿出来

grep [-acinv] [--color=auto] '查找字符串' filename

参数:

-a:将binary文件以test文件的方式查找

-c:计算查找到字符串的次数

-i:忽略大小写

-n:顺便输出行号

-v:反向选择,即显示没有查找到字符串的那一行

--color=auto:将查找到的关键字部分加颜色显示

//显示最后登录用户信息中含有root字符串的行
[wuchao@localhost ~]$ last | grep 'root'
root pts/ : Sat Jul : - crash (+:)
root pts/ : Sat Jul : - crash (+:)
root : : Sat Jul : - crash (+:)
root pts/ : Tue Jun : - : (:)
root : : Tue Jun : - crash (+:)
root pts/ : Mon Jun : - crash (:)
root : : Mon Jun : - crash (:)
root tty1 Mon Jun : - : (:)
root tty2 Mon Jun : - crash (+:)
root pts/ : Mon Jun : - : (:)
root : : Sun Jun : - : (:)
root : : Fri May : - crash (+:)
root pts/ : Thu May : - crash (+:)
root : : Thu May : - crash (+:)
root pts/ : Thu May : - : (:)
root : : Thu May : - : (:)
root pts/ : Thu May : - : (:)
root pts/ : Thu May : - : (:)
root : : Thu May : - : (:)
root pts/ : Thu Apr : - : (:)
root pts/ : Thu Apr : - : (:)
root : : Thu Apr : - : (:)

排序命令:sort,wc,uniq

sort

sort [-fbMnrtuk] [file or stdin]

参数:

-f:忽略大小写的差异

-b:忽略最前面的空格部分

-M:以月份的名称排序

-n:使用纯数字排序

-r:反向排序

-u:相同的数据,仅显示一行

-t:分隔符,默认是tab键来分割

-k:以那个区间来排序

[wuchao@localhost ~]$ cat /etc/passwd | sort
abrt:x::::/etc/abrt:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:::bin:/bin:/sbin/nologin
chrony:x::::/var/lib/chrony:/sbin/nologin
colord:x:::User for colord:/var/lib/colord:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin
ftp:x:::FTP User:/var/ftp:/sbin/nologin
games:x:::games:/usr/games:/sbin/nologin
gdm:x::::/var/lib/gdm:/sbin/nologin
geoclue:x:::User for geoclue:/var/lib/geoclue:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
halt:x:::halt:/sbin:/sbin/halt

uniq

uniq [-ic]

参数:

-i:忽略大小写

-c:进行计数

wc

计算数据有多少字,多少行,多少字符

wc [-lwm]

参数:

-l:仅列出行

-w:仅列出多少字

-m:多少字符

双向重定向:tee

tee会同时将数据流送到文件和屏幕

tee  [-a]  file

参数:

-a:以累加的方式,将数据写入file

[wuchao@localhost 桌面]$ last | tee last.list | cut -d " " -f
wuchao
wuchao
(unknown
reboot
wuchao
wuchao
wuchao
wuchao
wuchao
(unknown
reboot
root
root
root
(unknown
reboot
root
root
(unknown
wuchao //查看写入文件的内容
[wuchao@localhost 桌面]$ cat last.list
wuchao   pts/0        :0               Fri Jul 15 09:31   still logged in   
wuchao   :0           :0               Fri Jul 15 09:29   still logged in   
(unknown :0           :0               Fri Jul 15 09:16 - 09:29  (00:13)    
reboot   system boot  3.10.0-327.el7.x Fri Jul 15 09:15 - 09:32  (00:16)    
wuchao   pts/0        :0               Thu Jul 14 21:26 - crash  (11:48)    
wuchao   pts/0        :0               Thu Jul 14 19:16 - 21:26  (02:10)    
wuchao   pts/0        :0               Wed Jul 13 16:54 - 19:16 (1+02:22)   
wuchao   pts/0        :0               Wed Jul 13 16:08 - 16:08  (00:00)    
wuchao   :0           :0               Wed Jul 13 16:07 - crash (1+17:07)   
(unknown :0           :0               Wed Jul 13 16:06 - 16:07  (00:00)    
reboot   system boot  3.10.0-327.el7.x Wed Jul 13 16:06 - 09:32 (1+17:26)   
root     pts/1        :0               Sat Jul  2 10:26 - crash (11+05:40)  
root     pts/0        :0               Sat Jul  2 09:22 - crash (11+06:43)  
root     :0           :0               Sat Jul  2 09:21 - crash (11+06:44)  
(unknown :0           :0               Sat Jul  2 09:20 - 09:21  (00:01)    
reboot   system boot  3.10.0-327.el7.x Sat Jul  2 09:19 - 09:32 (13+00:12)  
root     pts/0        :0               Tue Jun 28 09:15 - 09:16  (00:01)    
root     :0           :0               Tue Jun 28 08:47 - crash (4+00:31)   
(unknown :0           :0               Tue Jun 28 08:47 - 08:47  (00:00)    
wuchao   pts/0        :0               Tue Jun 28 08:46 - 08:47  (00:00)    
wuchao   :0           :0               Tue Jun 28 08:43 - 08:47  (00:04)    
(unknown :0           :0               Tue Jun 28 08:41 - 08:43  (00:01)    
reboot   system boot  3.10.0-327.el7.x Tue Jun 28 08:40 - 09:32 (17+00:51)  
root     pts/0        :0               Mon Jun 27 13:16 - crash  (19:23)    
root     :0           :0               Mon Jun 27 13:15 - crash  (19:25)    
(unknown :0           :0               Mon Jun 27 11:30 - 13:15  (01:44)    
root     tty1                          Mon Jun 27 11:30 - 11:30  (00:00)    
root     tty2                          Mon Jun 27 08:19 - crash (1+00:20)   
root     pts/0        :0               Mon Jun 27 07:23 - 11:30  (04:07)    
root     :0           :0               Sun Jun 26 20:56 - 11:30  (14:34)    

字符转换命令:tr,col,join,paste,expand

tr

删除或替换一段信息中的文字

tr  [-ds] SET1 ...

参数:

-d:删除信息中的SET1字符串

-s:替换重复的字符串

//将小写转为大写
[wuchao@localhost 桌面]$ last | tr '[a-z]' '[A-Z'
WUCHAO PTS/ : FRI JUL : STILL LOGGED IN
WUCHAO : : FRI JUL : STILL LOGGED IN
(UNKNOWN : : FRI JUL : - : (:)
REBOOT SYSTEM BOOT 3.10.-.EL7.X FRI JUL : - : (:)
WUCHAO PTS/ : THU JUL : - CRASH (:)
WUCHAO PTS/ : THU JUL : - : (:)
WUCHAO PTS/ : WED JUL : - : (+:)
WUCHAO PTS/ : WED JUL : - : (:)
WUCHAO : : WED JUL : - CRASH (+:)
(UNKNOWN : : WED JUL : - : (:)
REBOOT SYSTEM BOOT 3.10.-.EL7.X WED JUL : - : (+:)
ROOT PTS/ : SAT JUL : - CRASH (+:)
ROOT PTS/ : SAT JUL : - CRASH (+:)
ROOT : : SAT JUL : - CRASH (+:)
(UNKNOWN : : SAT JUL : - : (:)
REBOOT SYSTEM BOOT 3.10.-.EL7.X SAT JUL : - : (+:)
ROOT PTS/ : TUE JUN : - : (:)
ROOT : : TUE JUN : - CRASH (+:)
(UNKNOWN : : TUE JUN : - : (:)
WUCHAO PTS/ : TUE JUN : - : (:)
WUCHAO : : TUE JUN : - : (:) //删除“:”后显示
wuchao@localhost 桌面]$ cat /etc/passwd | tr -d ':'
rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
syncx50sync/sbin/bin/sync
shutdownx60shutdown/sbin/sbin/shutdown
haltx70halt/sbin/sbin/halt
mailx812mail/var/spool/mail/sbin/nologin
operatorx110operator/root/sbin/nologin
gamesx12100games/usr/games/sbin/nologin
ftpx1450FTP User/var/ftp/sbin/nologin

col

col [-xb]

参数:

-x:将tab键转换成对等的空格键

-b:在文字内有反斜杠(\)时,仅保留反斜杠最后接的那个字符

//-A可显示所有特殊按键,^I便是tab键
[wuchao@localhost ~]$ cat -A ./.bashrc
# .bashrc$
$
# Source global definitions$
if [ -f /etc/bashrc ]; then$
^I. /etc/bashrc$
fi$
$
# Uncomment the following line if you don't like systemctl's auto-paging feature:$
# export SYSTEMD_PAGER=$
$
# User specific aliases and functions$ //将tab替换成空格
[wuchao@localhost ~]$ cat ./.bashrc | col -x | cat -A | more
# .bashrc$
$
# Source global definitions$
if [ -f /etc/bashrc ]; then$
. /etc/bashrc$
fi$
$
# Uncomment the following line if you don't like systemctl's auto-paging feature:$
# export SYSTEMD_PAGER=$
$
# User specific aliases and functions$
[wuchao@localhost ~]$

join

将两个文件当中有相同数据的那一行加在一起

join [-ti12] file1 file2

参数:

-t:join默认以空格符分隔数据,并且对比第一个字段的数据,如果两个文件相同,则将两条数据连成一行,且第一个字段放在第一个

-i:忽略大小写

-1:代表第一个文件要用哪个字段来分析

-2:代表第二个文件要用哪个字段来分析

//查看两个文件前三行内容
[root@localhost 桌面]# head -n /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin ==> /etc/shadow <==
root:$$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0:::::::
bin:*:::::::
daemon:*:::::::
[root@localhost 桌面]# //使用“:”分隔,两个文件每行第一个字段相同的部分整合在一行,以“:”隔开,每行第一个为字段
[root@localhost 桌面]# join -t ':' /etc/passwd /etc/shadow
root:x:::root:/root:/bin/bash:$$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0:::::::
bin:x:::bin:/bin:/sbin/nologin:*:::::::
daemon:x:::daemon:/sbin:/sbin/nologin:*::::::: //当我们想把两个文件的不同字段作为同一字段比较时
[root@localhost 桌面]# join -t ':' - /etc/passwd - /etc/group

paste

直接将两个文件的对应行整合在一起

join [-d]

参数:

-d:后面接分隔符,默认为tab

-:如果file部分写成-,表示来自标准输入的数据的意思

[root@localhost 桌面]# paste -d '=' /etc/passwd /etc/shadow | head -n
root:x:::root:/root:/bin/bash=root:$$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0:::::::
bin:x:::bin:/bin:/sbin/nologin=bin:*:::::::
daemon:x:::daemon:/sbin:/sbin/nologin=daemon:*:::::::

expand

将tab键转成空格键

expand [-t] file

参数:

-t:定义转成几个空格键

切割命令:split

将大文件切割成多个小文件

split [-bl] file prefix

参数:

-b:切割的文件大小,比如200k,200b,200m

-l:以行数来切割

prefix:作为切割文件的前导文字

[root@localhost 桌面]# ls -l /etc/shadow
----------. root root 4月 : /etc/shadow
//按1k大小切割
[root@localhost 桌面]# split -b 1k /etc/shadow ~/shadow
//查看切割的文件
[root@localhost 桌面]# ls -l ~/shadow*
-rw-r--r--. root root 7月 : /root/shadowaa
-rw-r--r--. root root 7月 : /root/shadowab
[root@localhost 桌面]# //整合切割的文件
[root@localhost 桌面]# cat ~/shadow* >> ~/shadow
[root@localhost 桌面]# ls -l ~/shadow*
-rw-r--r--. root root 7月 : /root/shadow
-rw-r--r--. root root 7月 : /root/shadowaa
-rw-r--r--. root root 7月 : /root/shadowab
[root@localhost 桌面]#

参数代换:xargs

[root@localhost 桌面]#
[root@localhost 桌面]# cut -d: -f1 < /etc/passwd | sort | xargs echo
abrt adm avahi avahi-autoipd bin chrony colord daemon dbus ftp games gdm geoclue gnome-initial-setup halt libstoragemgmt lp mail nfsnobody nobody ntp operator polkitd postfix pulse qemu radvd root rpc rpcuser rtkit saslauth setroubleshoot shutdown sshd sssd sync systemd-bus-proxy systemd-network tcpdump tss unbound usbmuxd wuchao

关于“-”的用途

在管道命令中,经常需要前一个的stdout作为后一个的stdin,这是stdout和stdin用“-”来表示

//将home里面的文件打包,打包的数据传送到stdout,作为后面指令的stdin
[root@localhost 桌面]# tar -cvf - /home | tar -xvf -