Linux基础操作-篇二

发布于:2022-11-09 ⋅ 阅读:(2) ⋅ 点赞:(0) ⋅ 评论:(0)

认识与学习Bash

指令下达,可以直接 回车,敲入的命令就会直接执行,如果命令一行太长,就可以使用 \ 操作符,表示 下一个 回车后 继续键入命令,在新行中,会有一个 > 表示 可以继续输入指令
一定要注意 \+Enter 中间不能有其他字符,一定是紧跟着的两个操作

如果要快速删除指令,可以采用下面的快捷方式:
image

bash中变量的定义规则:

  • 变量与变量的内容通过= 连接,等号两边不能直接有空格
  • 变量名称只能是英文字母和数字,开头字符不能是数字
  • 变量内容如果有空格符可以使用双引号"' 将变量内容 结合起来
    • 双引号"" 内的特殊字符,如$可以保持原有的特性
    • 单引号'' 内的特殊字符,如$就认为是一般字符,就是纯文本
  • 使用 跳脱字符\(转义字符), 可以将特殊符号($, ,, 等)变为一般字符
  • 在 一串指令的执行中,如果需要 借助其他额外的 指令提供的信息,可以使用 反撇号 , 或者 $
    一般使用 反撇号 包起来的指令,会被优先执行,执行的结果会作为 外部的输入信息
  • 若变量需要在其他 子程序中执行,则需要用 export 来使变量生成环境变量
    子程序就是在当前shell 下 启动另外一个新的shell
  • 通常大写字符为系统默认变量,自行设定的变量可以使用小写字符,方便判断(只是一般的习惯,不是约定)
  • 取消变量使用 unset + 变量名称

image

可以查看系统的环境变量:
image

系统预设变量

$:表示当前 shell 的进程代号,即 process ID

?: 上个执行指令的 返回值,一般 执行成功就返回0,否则就返回 非0

image

限制关系

bash可以限制用户的某些资源,包括开启的文件数量、CPU使用时间、内存使用量等,使用 ulimit 命令实现,主要参数如下:
image

想要复原ulimit 的设定最简单的方法就是 注销再登录,否则就需要重新用 ulimit 设定
这里要注意的是,如果一般身份的使用者,使用ulimit 设定了 -f 选项的文件大小,那么此用 只能继续减小文件容量,无法增加文件容量

变量的删除、取代与替换

变量设定好了之后,不仅仅可以进行删除,也可以进行取代和替换,基本规则如下:
image

个人感觉使用不多,就不再 赘述了,具体参见 10.2.8

变量别名

alias 可以给 某个命令设置一个别名,比如很常用的 ls -l 命令,设置别名为 ll

alias ll='ls -l'

alias 的定义规则与 变量的定义规则基本一致,alias 别名='指令 选项'

取消别名使用unalias 实现,unalias +别名 就可以实现取消这个 别名 的定义

获取历史命令

可以直接查询 曾经执行过的命令:
image

使用 history -w 可以将目前的 历史命令全部 写入到 histfile 文件中,在默认情况下,历史记录会写入 ~/.bash_history
正常情况下,历史命令的读取过程如下:

  • 用户登录系统后,系统自动读取 家目录下的~/.bash_history,读取以前下达过的指令,该文件存储的 历史指令的数量,由 上面系统变量中的 HISTFILESIZE 值的记录有关
  • 在 注销登录后,系统会将 最近的 HISTFILESIZE 条记录保存到 ~/.bash_history 文件中,每次都保留最新的,舍弃旧的
  • 使用 history -w 可以强制 写入 文件,即使还没有注销登录

在使用了history 命令之后,我们可以使用相关的功能帮我们执行命令:
image

基本上 history 的用途很大的!但是需要小心安全的问题!尤其是 root 的历史纪录文件,这是 Cracker
的最爱!因为不小心的 root 会将很多的重要数据在执行的过程中会被纪录在 ~/.bash_history 当中,
如果这个文件被解析的话,后果不堪吶!无论如何,使用 history 配合『 ! 』曾经使用过的指令下
达是很有效率的一个指令下达方法

如果在使用 xshell 这样的远程软件,有多个 root 用户登录,那么 history 该怎么保存?

因为等到注销时才会更新记录文件,所以, 最后 注销 的那个 bash 才会是最后写入的数据。唔!如此一来其他 bash 的指令操作就不会被记录下来了 (其实有被记录,只是被后来的最后一个 bash 所覆盖更新了)

bash 的环境配置文件

首先要知道两个区别,因为这两个读取的文件是不同的

  • login shell: 取得 bash 时需要完整的登录流程(需要输入 用户名和密码的过)
  • non-login shell: 不需要重复登录使用 的shell,比如登录图形化界面后打开终端的shell、在任意终端敲入的第二个shell命令,都不再需要重复 输入用户名和密码,都是 non-login shell

上面中两种方式中,取得 bash 的情况是不同的,一般来说:login shell 只会读取以下这两个文件:
/etc/profile:系统的整体设定,轻易不要修改
~/.bahs_profile 或 ~/.bash_login 或 ~/.profile:不同用户设定,个性化数据

/etc/profile 整体bash文件

每个使用者登录 bash 一定会读取的配置文件,如果要配置所有使用者的整体环境,就需要在此文件中修改,有如下几个重要变量:

  • PATH :依据 UID 决定 PATH变量要不要含有 sbin 的系统指令目录
  • MAIL : 依据账号设定好的 使用者的 mailbox 到 /var/spool/mail/username
  • USER : 根据用户的账号设置这个内容
  • HOSTNAME : 根据主机的 hostname 指令决定此变量内容
  • HISTSIZE : 历史命令记录笔数,CentOS7 设定为 1000
  • umask : 包括 root 默认为 022,一般用户为 002,用于设定用户权限

/etc/profile 不止有上面的这几个字段,还会 使用很多配置文件来 进行设置,如下

  • /etc/profile.d/*.sh: 在 该目录下,拓展名为 .sh 的,并且当前用户对该文件有 r 权限,就可以被执行,主要用于 规范 bash 操作接口的 颜色、语系、llls 命令的别名、viwhich 命令的别名等,如果要自行建立 配置文件,就可以在此目录下 自行建立 .sh 后缀的文件。
  • /etc/locale.conf : 由 /etc/profile.d/lang.sh 文件 引入,决定 bash 预设 使用哪个语系
  • /user/share/bash-completion/completions/* : 进行 指令的 选项/参数 补齐,由 /etc/profile.d/bash_completion.sh 文件载入

bash 的 login shell 情况下所读取的整体环境配置文件其实只有 /etc/profile,但是/etc/profile 还会呼叫出其他的配置文件,所以让我们的 bash 操作接口变的非常的友善啦

用户个人配置文件

用户个人的配置文件主要有三个,按照次序分别为以下三个:

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

bash 的 登录脚本,只会读取上面三个文件中的一个,读取的顺序就是 按照上面 文件排列的原则 进行读取,如果有上面的文件,并且读取了,那么下面的文件就不会在读取了

查看 ~/.profile 文件源码如下:

[root@AliComputer etc]# 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/bin

export PATH

判断家目录下的 ~/.bashrc 存在否,若存在则读入 ~/.bashrc

所以 bash 配置文件整体的读入流程如下:
image

读入环境配置文件:source

由于 /etc/profile~/.bash_profile 文件都是在 取得 登录脚本之后才会读取的文件,所以如果在本地登录期间,修改了 配置文件,并不会立即生效,而是需要 注销后重新登录才会生效,这里使用 source 命令 可以是实现 直接重新读取配置文件而不用注销登录:
image

非登录环境配置和其他相关配置文件

如果是 non-login shell 这种非登录的情况,会读取 ~/.bashrc ,该文件如下:

[root@AliComputer etc]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi
# added by Anaconda3 5.3.1 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/root/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "/root/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/root/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="/root/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<
alias php='php -c /www/server/php/74/etc/php-cli.ini'
alias php56='php56 -c /www/server/php/56/etc/php-cli.ini'
alias php74='php74 -c /www/server/php/74/etc/php-cli.ini'
[root@AliComputer etc]#

该文件会主动的呼叫 /etc/bashrc 这个文件,因为 /etc/bashrc 帮我们的 bash 定义出底下的数据:

  • 依据不同的 UID 规范出 umask 的值;
  • 依据不同的 UID 规范出提示字符 (就是 PS1 变量);
  • 呼叫 /etc/profile.d/*.sh 的设定

*你要注意的是,这个 /etc/bashrc 是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他不同的
distributions 可能会放置在不同的文件就是了。由于这个 ~/.bashrc 会呼叫 /etc/bashrc
/etc/profile.d/*.sh

其他会影响 bash操作的文件如下:

  • /etc/man_db.conf
    该文件 规范了 man 操作 的查找路径
  • ~/.bash_history
    预设的 历史命令 的存储路径
  • ~/.bash_logout
    注销登录后,系统要执行的操作

终端机的环境设置

stty -a 命令可以得到 目前环境中 所有的 按键列表,其中 ^ 表示的是 ctrl 按键,几个有重要意义的如下:
image

还可以使用 set 命令来设置 自定义的按键值:

image
image

一般不建议修改,如下是 默认的 bash组合键
image

通配符与特殊符号

如下列出常用的几个通配符,通配符 和正则表达式的通配符是一样的
image

除了通配符,还有 常用的特殊符号:
image

因为这样的特殊字符的存在,就不要在 文件名中 涉及这些 特殊字符了

数据重定向

数据重定向 可以简单的理解为 将本来应该要出现在 屏幕上的内容,重定向到 其他地方

每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入stdin;1:标准输出stdout;2:标准错误stderr
我们就可以使用这三个数字分别代表不同的 操作,操作不同的 文件描述符了

标准输出

这里再简单区分下 >表示覆盖即 删掉原有的内容,使用新的内容 和 >>表示追加 即在原有的内容后面增加

下面就可以考虑将上的命令组合,实现一些具体的操作了:

1>	以覆盖的方式,将 正确数据 输出到指定的文件中
1>>	以追加的方式,将 正确数据 输出到指定的文件中
2>	以覆盖的方式,将 错误数据 输出到指定的文件中
2>>	以追加的方式,将 错误数据 输出到指定的文件中

有如下应用:可以分别指定两个文件,用来接受 标准输出和标准错误

# 将标准输出 和 标准错误 分别 重定向到不同的文件中,屏幕就不再打印任何消息了
find /home -name .bashrc > list_right 2> list_error

一般在执行 shell脚本时 ,会将 错误信息输出到 /dev/null 中,这个文件就是 专门用来接收 各种 错误信息的

find /home -name .bashrc 2> /dev/null

我们有时还可以 将 正确和错误的数据,全部都放入同一个文件中(就类似日志文件那样)

# 错误写法: 会造成 数据交叉写入,造成 数据混乱
find /home -name .bashrc > list 2> list

# 推荐写法
find /home -name .bashrc >list 2>&1
# 同理的变形写法
find /home -name .bashrc &> list

2>&1 表明将 文件描述2(标准错误输出)的内容重定向到 文件描述符1(标准输出)
为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符
在前面我们知道,>list又将 文件描述符1 的内容重定向到了文件 list 中,那么最终标准错误也会重定向到list中

为何 2>&1 要写在后面?
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

标准输出还有其他作用,如下:

  • 屏幕输出的信息很重要,需要保存时
  • 背景执行中的程序,不希望干扰 屏幕正常的输出结果时
  • 一些系统的例行命令的执行结果,需要保存起来
  • 一些执行命令 可能有已知 的错误信息,需要将其 丢弃 2>/dev/null
  • 错误信息与正确信息需要分别输出

标准输入

标准输入standard input:<<< , 表示 将原本需要 由键盘输入的数据,改由 文件内容来获取

如下可以使用 cat 命令建立一个 文件:

[root@AliComputer test]# cat > catfile
testing
cat file test[root@AliComputer test]# ll
total 4
-rw-r--r-- 1 root root 21 May 21 19:07 catfile
[root@AliComputer test]# cat catfile
testing
cat file test[root@AliComputer test]#

由于在 cat 命令之后增加了> 表示标准输入,catfile 文件就会被主动建立,内容就是 后面键入的内容

我们甚至可以 用某个文件的内容来取代 键盘的敲击:
image

下面再解释一下<<,这个的含义是:结束的输入字符,就是可以使用 它定义的字符来结束输入,使用如下:

# 只要在输入的内容中 含有 eof了,输入就会停止
[root@AliComputer test]# cat >catfile1 <<"eof"
> This is a test
> catfile1
> now Stop
> eof
[root@AliComputer test]# ll
total 8
-rw-r--r-- 1 root root 21 May 21 19:07 catfile
-rw-r--r-- 1 root root 33 May 21 19:14 catfile1
[root@AliComputer test]# cat catfile1
This is a test
catfile1
now Stop
[root@AliComputer test]#

使用 << 右侧的控制字符,就可以终止一次输入,不用使用 Ctrl+d 来结束了

双向重定向

上面的命令都是 单纯的 输入重定向 和 输出重定向,使用 tee 可以实现 同时将 数据流 分送到 文件与屏幕(就是输出)
image

tee [-a] file
-a 以累加的方式,将数据 放入 file文件中

使用如下:
image

命令执行的 判断依据

可以使用 ; 分隔开不同的命令,这样就会顺序执行 键入的命令
前一个指令执行成功与否 与 后一个指令 是否执行无关!

如果要 建立关联,就需要使用 逻辑运算符了 &&||

在 Linux中通过 $? 来获取 上一个 指令 执行的返回值,如果正确执行,一般返回 1(true),否则 返回 0(false), 逻辑运算符就是通过 命令的返回值来进行判断,然后确定 下一个指令是否要执行的:
image

可以有如下应用,我们可以实现 一个命令先创建目录,再在该目录下创建文件:
image

有 C语言的基础,还有 逻辑判断 和 短路 的基础,还是很好理解的

管道符、数据筛选命令

在 Linux-shell脚本编程中学习

uniq 命令从来 去重
image

字符转换命令

tr 命令可以实现 删除一段文本中的字符串,或者进行 文本 替换

tr [-ds] SET1
-d  删除数据中的 SET1 这个字符
-s  取代 重复的字符

使用如下:
image

这个命令也支持正规文法,用来 取代数据

col 命令:有很多其他用途,这里可以实现 将 tab 键 变为 空格键
image


join 命令 用于处理两个文件直接的数据,只要在两个文件之中,有 相同数据 的行,才会 加在一起,在处理 相关的文件数据时,特别有效

join [-til2] file1 file2
-t  join默认使用 空格符 作为分隔符,并且比对 第一个字段 的数据,如果两个文件相同,则将这两个数据连成一行,且	第一个字段放在第一个
-i  忽略大小写
-1  表示 第一个文件要用那个字段来分析
-2  表示 第二个文件要用那个字段来分析

使用如下:
image


paste 命令可以 将 两行 直接 拼接在一起,中间用 tab 键 分割

paste [-d] file1 file2
-d  后面接 分隔符,预设是 tab,可以修改为其他 分隔符
-	如果 file 部分写成 - ,表示是来自 标准输入standard input 的意思

使用如下:
image


expand 命令可以将 tab 键转换为 空格键

expand [-t] file
-t  后面可以接数字,一般来说,一个 tab 按键 可以用 8个空格(shell编程中可以这样认为)取代,可以自定义tab键表示多少个空格

使用如下:
image

分区命令

如果文件太大,导致 无法复制等问题,就可以使用 split命令来 将一个大文件,按照 文件大小 或 行数进行区分,就可以将 大文件 区分为小文件了
要恢复的话,再使用 重定向就可以了

split -[bl] file PREFIX
-b  指定要 分区成的文件大小,可以加单位,b,k,m等
-l  按照行数来区分
PREFIX  作为前导符,可作为分区文件的前导文字

使用如下:
image

按照行来划分:
image

参数代换

是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行

基本使用:

somecommand |xargs -item  command
-a file 从文件中读入作为 stdin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧

范例:
image

最后

一起提高,慢慢变强。