Linux-shell

shell的版本

可以在“/etc/shells”中查看当前系统支持的shell。

[root@192 Ethan]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

快速编辑按键

组合键功能
[Ctrl+u] [Ctrl+k]分别是从光标处向前删除命令串及向后删除命令串
[Ctrl+a] [Ctrl+e]分别是将光标移动到行首与行尾

Bash Shell功能

  • 历史命令(history)
    可以使用“”来执行历史命令
    ! #:表示执行第n条历史命令
    ! command:从最近的命令查到以command开头的命令执行
    !! :执行上一条命令
  • 命令与文件补全功能([Tab])
  • 命令别名设置(alias)
  • 任务管理、前台、后台(job control、foreground、background)
  • 程序化脚本(shell scripts)
  • 通配符(Wildcard)
    ll /etc/*

内置命令

查询命令是否为内置命令(type)

Shell变量

变量是脚本语言的核心,shell脚本又是无类型的。变量本质上存储数据的一个或多个计算机内存地址,分为本地变量(用户当前shell生命期使用,随shell进程的消亡而无效,类似局部变量)、环境变量(适用于所有由登录进程所产生的子进程)和位置参数(向shell脚本传递参数,只读)。

变量就是以一组文字或符号等,来替换一些设置或一串保留的数据。

变量的使用(echo)

可以看到有两种方式:$PATH,${PATH}。

推荐在变量名外加上“{}”。

使用【echo】可以取得变量的值

[root@192 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@192 ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

当一个名称尚未被设置时,默认的内容是空。

变量设置规则

  • 设置变量可以直接使用“变量=变量内容”的方法,也可以使用【set
  • 变量与变量内容以一个等号来连接;
  • 等号两边不能直接接空格;
  • 变量名称只能是英文字母或数字,开头字符不能是数字;
  • 变量内容若有空格需要使用引号将内容组合;
  • 变量内容可以使用转义符;
  • 变量内容当需要借助其它命令时,可以使用【·】或【$(command)】来表示;
  • export】使局部变量变为全局环境变量,使得子进程可以使用该变量;
  • 通常大写字符变量名为系统默认变量;
  • 取消变量使用【unset】;
单引号与双引号的区别
  • 单引号内的特殊字符仅为一般字符;
  • 双引号内的字符保持原来的特性;
    例:echo “Path is : ${PATH}”,显示的结果为“Path is : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin”

环境变量

使用【env】可以查看当前的环境变量。

[root@Ethan ~]# env
XDG_SESSION_ID=2956
HOSTNAME=Ethan
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=100.80.107.250 2126 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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;......
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=100.80.107.250 2126 192.16.185.189 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
  • XDG_SESSION_ID
    “会话ID”,可用于各种文件名。 虽然它通常就是审计会话ID的值(/proc/self/sessionid), 但是其值本身并没有什么特别的含义。 因为在整个系统运行期间,每个 ID 仅会被分配一次, 所以可以将其视为本次会话的可靠标签,用于标记文件或其他资源。 将”会话ID”与启动标识符(sd_id128_get_boot(3))组合在一起, 即可在全局范围内唯一标识当前会话。
  • HOSTNAME
    主机名
  • TREM
    终端使用的环境是什么类型
    xterm 是图形界面下virtual terminal的一个实现 。
  • SHELL
    指使用的是哪种Shell
  • HISTSIZE
    内存中记录历史命令的最大数
  • OLDPWD
    上一次的工作目录
  • LC_ALL
    使用语系
  • USER
    使用者名称
  • LS_COLORS
    使用【ls】时一些颜色的设置,如根据不同的文件类型,不同的文件后缀显示不同的颜色。
  • MAIL
    使用者邮箱所在位置
  • PATH
    决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接。
  • PWD
    目前的工作目录
  • LANG
    语系
  • HOME
    使用者的家目录
  • LOGNAME
    使用者登录的用户名
  • RANDOM
    产生一个随机数,可使用【echo】测试,随机数生成器”/dev/random”。范围:0-32767。
  • _=/usr/bin/env
    上一次使用的命令的最后一个参数(或命令本身)

其它变量

使用【set】可以观察当前所有变量。

BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend: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]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(1)-release'
COLUMNS=136
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=Ethan
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=45
LOGNAME=root
LS_COLORS='rs=0:di=01;33: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:*.arc=01;31:*.arj=01;......'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=6575
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
TERM=linux
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=2971
_=clear
colors=/root/.dir_colors
  • BASH
    bash程序路径
  • BASH VERSINFO
    bash版本信息
  • BASH VERSION
    bash版本信息
  • COLUMNS
    在目前终端环境下,使用的栏位长度。
  • HISTFILE
    记录历史命令的文件路径
  • HISTFILESIZE
    记录历史命令的文件能够记录的命令最大数
  • IFS
    默认的分隔符
  • LINES
    目前终端下的最大行数
  • MACHTYPE
    使用的机器的类型
  • OSTYPE
    操作系统类型
  • HOSTTYPE
    主机类型
  • PS1
    命令提示字符(Prompt String)
  • PS2
    命令在换行后显示的提示字符,默认为“>”
  • PS3
    Shell脚本中使用select时的提示符
  • PS4
    set -x”用来修改跟踪输出的前缀
  • SHELLOPTS
    它记录了处于开状态的shell选项列表,它是一个只读变量。
  • SHLVL
    记录Shell嵌套的层次,启动第一个shell时,$SHLVL=1
  • $
    表示当前这个shell的进程号
  • ?
    记录上个执行命令的返回值
    一般来说,0表示上一个命令成功执行,其它数字表示为错误代码。

PS】详细情况点击链接。

变量读取、数组、声明

变量的读取
变量声明

在默认情况下,直接在命令行下定义一个变量,那么变量的无类型(字符型)。可以使用下面的命令来定义带类型的变量。

bash环境中的数值运算,默认最多仅能达到整数形态,如1/3结果为0。

变量内容的删除替换

变量内容的删除
  • #
    从头开始搜索,符合【关键词】的【最短的】那一个
  • ##
    从头开始搜索,符合【关键词】的【最长的】那一个
  • %
    从尾开始搜索,符合【关键词】的【最短的】那一个
  • %%
    从尾开始搜索,符合【关键词】的【最长的】那一个

首先创建一个变量进行实验。

[root@Ethan /Ethan]# path=${PATH}
[root@Ethan /Ethan]# echo ${path}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

现在以“/usr*:”为例。

[root@Ethan /Ethan]# echo ${path#/usr*:}
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@Ethan /Ethan]# echo ${path##/usr*:}
/root/bin

这里在进行匹配时,是从字符串的第一个字符进行匹配的,每一个匹配不成功,也就不能再进行下去。也就是说,只能进行删除头、删除尾,想要删除中间的东西不可能。”%”也是如此。

变量内容的替换
  • ${varname/oldstr/newstr}
    从头开始搜索,替换第一个匹配的。
  • ${varname//oldstr//newstr}
    从头开始搜索,替换全部匹配的。

变量的测试与替换

在一些时刻,我们需要判断某个变量是否存在,若存在,则使用已经存在的设置,若不存在时,我们需要给该变量设置一个初始值。

变量设置方式 str没有设置str为空字符串str已经设置为
非空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr
var=expr
str不变
var=
str不变
var=$str
var=${str:=expr}str=expr
var=expr
str=expr
var=expr
str不变
var=$str
var=${str?expr}expr输出至stderrvar=var=$str
var=${str:?expr}expr输出至stderrexpr输出至stderrvar=$str

  • 若str未设置(不包括空),则将expr的值赋给var
  • +
    若str设置,则将expr的值赋给var
  • =
    expr–>str–>var
    一层一层传递,若有内容则中断传递。将原来的内容向下传递。
    例,expr将内容传递至str,但str有内容(空字符串或非空),此时将str内容传递给var。
  • ?
    若str未设置时,可以给予用户提示消息(expr)。
  • :
    排除或添加str为空的状态

系统资源限制

当Linux服务器上有多个用户时,需要对用户可以使用的系统资源进行限制,我们可以使用【ulimit】。

Bash shell的操作环境

命令查找顺序

  • 查找相对/绝对路径下的命令,如”/bin/ls”or”./ls”
  • alias定义下找到该命令
  • 由bash内置命令
  • 通过${PATH}查找命令

bash的登录与欢迎信息

一共有三个文件与登录显示信息有关。

  • /etc/issue
  • /etc/issue.net
    当使用Telnet登录主机时使用
  • /etc/motd
issue内的代码意义
\d本地端的日期
\l显示第几个终端界面
\m显示硬件的等级
\n显示主机的网络名称
\O显示domain name
\r操作系统的版本(等同于uname -r)
\t显示本地端的时间
\S操作系统的名称
\v操作系统的版本

bash环境配置文件

  • login shell
    取得bash时需要完整的登录流程,在登录时需要输入帐号、密码。
  • non-login shell
    取得bash的方法不需要重复登录过程,不需要输入帐号、密码。

login与non-login shell登录时,所读取的配置文件是不同的。

login shell所读取配置文件
  • /etc/profile
    系统整体的配置文件,最好不要修改
  • ~/.bash_profile或~./bash_login或~./profile
    用户的配置文件

可以通过【source】来动态的改变当前环境配置。

non-login shell则只读取~/.bash_profile中的内容。

其它相关配置文件
  • /etc/man_db.conf
  • ~/.bash_history
  • ~/.bash_logout

终端环境的设置

Bash默认的组合键

组合按键执行结果
Ctrl+C终止目前的命令
Ctrl+D输入结束
Ctrl+M回车
Ctrl+S暂停屏幕的输出
Ctrl+Q恢复屏幕的输出
Ctrl+U在提示字符下,将整列命令删除
Ctrl+Z暂停目前执行的命令

通配符与特殊符号

通配符

符号意义
*表示0个到无穷多个字符
?表示一个任意字符
[]表示括号内的一个字符,范围限制在括号内
[-]用来表示连续字符,如“a-c”表示“a,b,c”
[^]反向选择

特殊符号

符号内容
#注释符号
\转义符
|管道
;连续命令分隔符
~用户家目录
$使用变量前导符
&任务管理:使命令在后台执行
!逻辑运算意义上的非
/目录符号
>,>>数据流重定向
<,<<数据流重定向
单引号,不具备变量替换的功能(纯文本格式)
“”双引号,具备变量替换的功能
中间填充可执行文件,等于$()
()子shell的起始与结束
{}中间填充命令区块的组合

数据流重定向

在默认的情况下,我们执行命令后,所有的信息会从终端输出,不区别正确与错误信息。

标准输入指将原来需要由键盘输入的数据,改由文件内容来替换。

标准输出指命令正确执行后输出的信息,标准错误输出指的是命令执行失败后,所输出的内容。

  • 标准输入(stdin)
    代码为0,使用 < or <<
  • 标准输出(stdout)
    代码为1,使用 > or >> or 1> or 1>>
  • 标准错误输出(stderr)
    代码为2,使用 2> or 2>>

‘>’与’>>’的区别

使用’>’输出到一个文件会将该文件原来的内容覆盖掉,而使用‘>>’是追加的意思,即在文件尾部继续写入。

/dev/null垃圾桶黑洞设备与特殊写法

当我们想要将标准错误输出不显示在屏幕上时,可以将标准错误输出至‘/dev/null’中。

当我们想要在输出标准输出后,连带标准错误输出同时输出到一个文件中时,可以使用特殊写法 ‘2>&1‘ or ‘&>’。

2>&1的意义是将标准错误输出转为标准输出。

1>&2的意义是将标准输出转为标准错误输出。

[root@Ethan /Ethan]# ls
a.txt
[root@Ethan /Ethan]# ll a.txt b.txt > ll.log 2>&1
[root@Ethan /Ethan]# cat ll.log 
ls: cannot access b.txt: No such file or directory
-rw-r--r-- 1 root root 0 Mar 14 18:07 a.txt

‘<‘与'<<‘的意义

‘<’是指把文件内容传递到命令中,作为命令的参数。

[root@Ethan /Ethan]# cat < man.txt > catout 
[root@Ethan /Ethan]# ll man.txt catout 
-rw-r--r-- 1 root root 35609 Mar 14 17:53 catout
-rw-r--r-- 1 root root 35609 Mar 14 17:52 man.txt

‘<<‘是指结束命令的字符串。

[root@Ethan ~]# python << eof
> print 'hello world'
> eof
hello world

重定向的重要性

  • 屏幕输出的信息很重要,需要将它保存下来;
  • 后台执行中的程序,不希望它干扰屏幕正常的输出结果;
  • 一些系统的计划任务命令的执行结果,希望过程可以保留下来;
  • 一些执行命令的错误信息;
  • 错误信息与正确信息分别输出;

命令执行的判断根据:‘;’、‘&&’、‘||’

命令说明
cmd1 &&cmd21.若cmd1执行完毕且正确($?=0),则开始执行cmd2
2.若cmd1执行完毕错误$($?=0),则不执行cmd2
cmd1 || cmd21.若cmd1执行完毕且正确($?=0),则不执行cmd2
2.若cmd1执行完毕错误$($?=0),则开始执行cmd2

管道命令(pipe)

  • 管道命令仅会处理标准输出,对于标准错误予以忽略;
  • 管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行;

选取命令

排序命令

双向重定向

字符转换命令

划分命令

参数代换

关于“-”的用途

“-”可以作为前一个命令的stdout。

tar -cvf - /home | tar -xvf - -C /tmp/homeback

参考资料

http://www.jinbuguo.com/systemd/pam_systemd.html
https://blog.csdn.net/taiyang1987912/article/details/38869577

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值