bash的特征


目录:

bash的特性

bash特性一:引用

"" '' ``    # 双引号、单引号、反引号

""-->代表弱引用

​ 输入输出的内容完全一致,变量引用会被替换

[root@AAAA7 ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

双引号的优点:

1、双引号里可以有变量

2、双引号里可以出现转义符

--------------------------------------------------------------------

''-->代表强引用

​ 改变标准输入的内容,和原有内容不一致;变量引用不会被替换

[root@AAAA7 ~]# echo '$PATH'
$PATH

在Linux使用的bash下,单引号双引号是有区别的,单引号忽略所有的转义,双引号不会忽略以下特殊字符

Dollar signs ($),Back quotes (`),Backslashes (/),Excalmatory mark(!)

单引号的限制:

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无限的;

  2. 单引号字符串中不能出现单引号(对单引号使用转义符后也不行)。

--------------------------------------------------------------------

shell中单引号和双引号区别

‘’ 在单引号中所有的字符包括特殊字符($,'',`\)都将解释成字符本身而成为普通字符。

“” 在双引号中,除了$, '', `\以外所有的字符都解释成字符本身,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义

注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用
例1:
[root@test6 ~]#VAR1=123
[root@test6 ~]#echo $VAR1
123
[root@test6 ~]#echo \$VAR1
$VAR1

例2:给变量值赋于多个单词,需要使用单引号和双引号
[root@test6 ~]#VAR8='echo haha'
[root@test6 ~]#echo $VAR8
echo haha
选中一个模板,出现的黑色方框标志着选中的范围
插入新模板、收藏、复制,都是针对黑色方框进行操作。

例3:赋值时单引号和双引号的区别
[root@test6 ~]#VAR1=123
[root@test6 ~]#VAR8='hahaha cat $VAR1'          #单引号
[root@test6 ~]#VAR9="hahaha cat $VAR1"      #双引中$符号有作用
[root@test6 ~]#echo $VAR8
hahaha cat $VAR1
[root@test6 ~]#echo $VAR9
hahaha cat 123

注:单引号之间的内容原封不动赋值给变量, 双引号之间的内容如有特殊符号会保留它的特殊含义

删除变量
[root@test6 ~]#echo $VAR1
123
[root@test6 ~]#unset VAR1
[root@test6 ~]#echo $VAR1           #变量已经删除
--------------------------------------------------------------------
`` -->命令替换
[root@AAAA7 ~]# echo `date`
2018年 12月 25日 星期二 17:01:54 CST
[root@test ~]# echo `date +%F`
2018-12-26
--------------------------------------------------------------------
()-->调用命令
[root@test6 /opt 07:37:36]#echo $(date)     (直接调用)
2019年 01月 16日 星期三 19:39:28 CST

[root@test6 /opt 07:40:07]#echo $(date +%F) (格式化输出在调用)
2019-01-16

bash特性二:变量

定义变量

  1. keyword="VAR"
  2. export keyword="VAR"
  3. declare -A="VAR"

例如:variable_name=""
[root@test-6 ~]# country="Chian"
[root@test-6 ~]# name="penong"

Notice:

1,变量名和等号之间不能有空格;

2, 首个字符必须为字母(a-z,A-Z)。

3, 中间不能有空格,可以使用下划线(_)。

4, 不能使用标点符号。

5, 不能使用bash里的关键字(可用help命令查看保留关键字)。

6,单引号与双引号都可以,取决于你是什么内容。


1、declare -a aa 把aa定义成整型,就可以进行数字运算

2、还可以用let bb=1-8 ;echo $bb

3、还可以用cc=${5+8} ;echo $cc

image-20220624140006101

image-20220624140010234

image-20220624140013524

变量的使用

调用变量(2种方法):

格式1:echo $variable_name

格式2:echo ${variable_name} (建议用这种,最规范的)

说明:只需要在一个定义过的变量前面加上美元符号 $ 就可以了,另外,对于变量的{} 是可以选择的, 它的目的为帮助解释器识别变量的边界

重定义变量:直接把变量重新像开始定义的那样子赋值就可以了:
[root@test-6 ~]# country="zhongguo"         (重新定义的变量)
[root@test-6 ~]# echo $country              (再次使用变量)
zhongguo
只读变量: 用 readonly 命令 可以把变量字义为只读变量。
[root@test-6 ~]# readonly country="China"
#或
country="China"
readonly country
删除变量: 使用unset命令可以删除变量,但是不能删除只读的变量。用法:
unset variable_name
[root@test-6 ~]# country="china"        (说明:只读变量是不能删除的,以及不能重定义)
-bash: country: readonly variable
[root@test-6 ~]# unset country
-bash: unset: country: cannot unset: readonly variable

查看系统环境变量

以下4个命令都可以查看变量: https://linux265.com/course/linux-commands.html

set

env

export

printenv

局部变量与全局变量变量

在bash shell中,环境变量分为两类:全局变量和局部变量

局部变量: 它只在自己的进程当中使用

全局变量: 对于shell会话和所有的子shell都是可见的

例1:局部变量(只在自己的进程当中使用)

[root@test6 ~]#VAR1=123
[root@test6 ~]#echo $VAR1
123
[root@test6 ~]#vim a.sh
#!/bin/bash
echo $VAR1
[root@test6 ~]#echo $VAR1
123
[root@test6 ~]#bash a.sh            #执行a.sh 时,会使用另一个bash去执行,就访问不到$VAR1的值

例2:env命令查看所全局变量(set也可以查看,而且显示最全)

[root@test6 ~]# env
[root@test6 ~]# env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

image-20220624140545107

例3:使用export把这个局部变量输出为全局变量

[root@test ~]# VAR1="hahaha"
[root@test ~]# echo $VAR1
hahaha
[root@test ~]# export VAR1 
[root@test ~]#vim a.sh   #写入以下内容
#!/bin/bash
echo $VAR1
[root@test ~]#bash a.sh   #引用全局变量成功
hahaha

PATH环境变量

/etc/profile 是所有用户的环境变量
/etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是 
/etc/profile ->/etc/enviroment -->$HOME/.profile   -->$HOME/.env
SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径,path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序的。

环境变量必须是大写

例1:把一个目录添加到PATH路径内

[root@test ~]# vim /opt/backup
#!/bin/bash
echo "Backup is OK!"
[root@test ~]# chmod +x /opt/backup 
[root@test ~]# /opt/backup 
Backup is OK!
[root@test ~]# backup                   (不接绝对路径,是无法找到这个命令)
bash: backup: 未找到命令...

解决办法:将/opt/backup命令添加PATH中

[root@test ~]# echo $PATH               (查看PATH里面是否有/opt)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@test ~]# PATH=/opt/:$PATH         (将/opt/backup添加到PATH)
[root@test ~]# echo $PATH               (查看是否添加成功)
/opt/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@test ~]# backup           #发现命令可以直接执行了,不用写全路径了
Backup is OK! 

如果想让所有用户永久生效,把这个变量写入/etc下配置文件

[root@test ~]# vim /etc/profile         # 在文件最后追加以下内容,永久生效
export PATH=/opt/:$PATH
[root@test ~]# source  /etc/profile   #重新加载配置文件,使用配置生效  

如果想让当前用户永久生效,把这个变量写入家目录下的配置文件

格式:export PATH="$PATH":/opt/ (临时生效)

:/opt/ -->表示新加的路径

当前用户永久有效

[root@test-6 ~]# vim .bash_profile

在配置文件的最后面添加export PATH="$PATH":/opt/

最后:source .bash_profile

或者:. .bash_profile

image-20220624140921222

Notice:只把可执行文件所在的目录那一层,加入PATH里面。

----------------------------------------------------------

查看PATH:echo $PATH

修改方法一:

# 以添加mongodb server为列
export PATH=/usr/local/mongodb/bin:$PATH
//配置完后可以通过echo $PATH查看配置结果。
生效方法:立即生效
有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
用户局限:仅对当前用户

修改方法二:

通过修改.bashrc文件:
vim ~/.bashrc 
//在最后一行添上:
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户

修改方法三:

通过修改profile文件:
vim /etc/profile
/export PATH //找到设置PATH的行,添加
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户

修改方法四:

通过修改environment文件:
vim /etc/environment
在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin”
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户

Linux环境变量加载原理解析

​ 上面列出了环境变量的各种配置方法,那么Linux是如何加载这些配置的呢?是以什么样的顺序加载的呢?

特定的加载顺序会导致相同名称的环境变量定义被覆盖或者不生效。

环境变量的分类

环境变量可以简单的分成用户自定义的环境变量以及系统级别的环境变量。

用户级别环境变量定义文件:~/.bashrc、~/.profile(部分系统为:~/.bash_profile)

系统级别环境变量定义文件:/etc/bashrc、/etc/profile(部分系统为:/etc/bash_profile)、/etc/environment

另外在用户环境变量中,系统会首先读取~/.bash_profile(或者~/.profile)文件,如果没有该文件则读取~/.bash_login,根据这些文件中内容**再去读取**~/.bashrc

测试Linux环境变量加载顺序的方法

为了测试各个不同文件的环境变量加载顺序,我们在每个环境变量定义文件中的第一行都定义相同的环境变量UU_ORDER,该变量的值为本身的值连接上当前文件名称。

需要修改的文件如下:

/etc/environment

/etc/profile

/etc/profile.d/test.sh,新建文件,没有文件夹可略过

/etc/bashrc,或者/etc/bash.bashrc

~/.bash_profile,或者~/.profile

~/.bashrc

在每个文件中的第一行都加上下面这句代码,并相应的把冒号后的内容修改为当前文件的绝对文件名。

export UU_ORDER="$UU_ORDER:~/.bash_profile"

修改完之后保存,新开一个窗口,然后echo \$UU_ORDER观察变量的值:

dddd:~$ echo $UU_ORDER

$UU_ORDER:/etc/environment:/etc/profile:/etc/bash.bashrc:/etc/profile.d/test.sh:~/.profile:~/.bashrc

可以推测出Linux加载环境变量的顺序如下:

/etc/environment

/etc/profile

/etc/bashrc

/etc/profile.d/test.sh

~/.profile

~/.bashrc

Linux环境变量文件加载详解

由上面的测试可容易得出Linux加载环境变量的顺序如下:

系统环境变量 -> 用户自定义环境变量 /etc/environment -> /etc/profile -> ~/.profile

打开/etc/profile文件你会发现,该文件的代码中会加载/etc/bash.bashrc文件,然后检查/etc/profile.d/目录下的.sh文件并加载

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

# 其次再打开~/.profile文件,会发现该文件中加载了~/.bashrc文件。
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
  . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# 从~/.profile文件中代码不难发现,/.profile文件只在用户登录的时候读取一次,而/.bashrc会在每次运行Shell脚本的时候读取一次
一些小技巧

可以自定义一个环境变量文件,比如在某个项目下定义uusama.profile,在这个文件中使用export定义一系列变量,然后在~/.profile文件后面加上:source uusama.profile,这样你每次登陆都可以在Shell脚本中使用自己定义的一系列变量。

也可以使用alias命令定义一些命令的别名,比如alias rm="rm -i"(双引号必须),并把这个代码加入到~/.profile中,这样你每次使用rm命令的时候,都相当于使用rm -i命令,非常方便

Linux环境变量配置

https://mp.weixin.qq.com/s/OiGxpU7UgCJwpVqW64NwWA

https://www.cnblogs.com/youyoui/p/10680329.html

在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法

Linux读取环境变量

读取环境变量的方法:

export命令显示当前系统定义的所有环境变量

echo $PATH命令输出当前的PATH环境变量的值

这两个命令执行的效果如下

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

其次再打开~/.profile文件,会发现该文件中加载了~/.bashrc文件。
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
  . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# 从~/.profile文件中代码不难发现,/.profile文件只在用户登录的时候读取一次,而/.bashrc会在每次运行Shell脚本的时候读取一次
Linux环境变量配置方法一:  export  PATH

使用export命令直接修改PATH的值,配置MySQL进入环境变量的方法:

export PATH=/home/uusama/mysql/bin:$PATH
# 或者把PATH放在前面
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:立即生效

生效期限:当前终端有效,窗口关闭后无效

生效范围:仅对当前用户有效

配置的环境变量中不要忘了加上原来的配置,即\$PATH部分,避免覆盖原来配置

Linux环境变量配置方法二:  vim ~/.bashrc

通过修改用户目录下的~/.bashrc文件进行配置:

vim ~/.bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:使用相同的用户打开新的终端时生效,或者手动source ~/.bashrc生效

生效期限:永久有效

生效范围:仅对当前用户有效

如果有后续的环境变量加载文件覆盖了PATH定义,则可能不生效

Linux环境变量配置方法三:  vim ~/.bash_profile

和修改~/.bashrc文件类似,也是要在文件最后加上新的路径即可:

vim ~/.bash_profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:使用相同的用户打开新的终端时生效,或者手动source ~/.bash_profile生效

生效期限:永久有效

生效范围:仅对当前用户有效

如果没有~/.bash_profile文件,则可以编辑~/.profile文件或者新建一个

Linux环境变量配置方法四:vim /etc/bashrc

该方法是修改系统配置,需要管理员权限(如root)或者对该文件的写入权限:

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc
vim /etc/bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/bashrc生效

生效期限:永久有效

生效范围:对所有用户有效

Linux环境变量配置方法五:    vim /etc/profile

该方法修改系统配置,需要管理员权限或者对该文件的写入权限,和vim /etc/bashrc类似:

# 如果/etc/profile文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/profile
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/profile生效

生效期限:永久有效

生效范围:对所有用户有效

Linux环境变量配置方法六:vim /etc/environment

该方法是修改系统环境配置文件,需要管理员权限或者对该文件的写入权限:

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin

注意事项:

生效时间:新开终端生效,或者手动source /etc/environment生效

生效期限:永久有效

生效范围:对所有用户有效

shell位置变量

Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。  
$0  获取当前执行shell脚本的文件文件名,包括脚本路径,命令本身
$n  获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 ${10}表示。
例子:
[root@test ~]# vim print.sh  
#!/bin/bash
echo "本shell脚本的文件名: $0"
echo "第1个参数:  $1"
echo "第2个参数:  $2"
echo "第3个参数:  $3"
echo "第4个参数:  $4"
[root@test ~]# chmod +x print.sh
[root@test ~]# ./print.sh 111 222 a.txt 444
本shell脚本的文件名: ./print.sh
第1个参数:  111
第2个参数:  222
第3个参数:  a.txt
第4个参数:  444
 
使用场景:服务启动传参数
[root@test ~]# /etc/init.d/network restart

特殊变量

image-20220624141956153

image-20220624142001586

$*  $@ 的区别为: 
$*  $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2"  "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2$n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2"  "$n" 的形式输出所有参数。
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

例1:
[root@test ~]# vim special_variable.sh  #写入以一下内容
#!/bin/bash
echo "$* 表示这个程序的所有参数 "
echo "$#  表示这个程序的参数个数"
echo "$!  执行上一个后台指令的PID"
echo "$$  表示程序的进程ID "
echo "$? 表示上一个程序执行返回结果 "
[root@test ~]# bash special_variable.sh  11 22 33 44 55
11 22 33 44 55 表示这个程序的所有参数
5  表示这个程序的参数个数
45504  执行上一个后台指令的PID
45502  表示程序的进程ID
0 表示上一个程序执行返回结果
---------------------------------------------------------------------
例2:常用的环境变量
[root@test opt]# cd /opt/
[root@test opt]# vim env.sh
#!/bin/bash
echo $HOME
echo $PATH
echo $PWD
[root@test opt]# bash env.sh
/root
/opt/:/opt/:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
/opt
---------------------------------------------------------------------
[root@test6 etc]# echo $0       (确定当前的shell)
-bash
[root@test6 etc]# ps -p $$      (确定当前的shell)
   PID TTY          TIME CMD
  1590 pts/0    00:00:00 bash

Living Example:如何解决因环境变量引起的问题

1、如何解决命令行提示信息

image-20220624142214100

root用户下,复制skel里面的所有内容到改普通用户家目录下:

[root@test-6 ]# cp /etc/skel/.bash* /home/peng/

bash特性三:命令补全和路径补全

安装bash-completion:
[root@centos7 ~]# yum -y install bash-completion
加载bash-completion:
[root@centos7 /]# source /etc/profile.d/bash_completion.sh
或者这样加载:
# source /usr/share/bash-completion/bash_completion

命令补全tab键
    1、点击一下,若剩余路径为绝对路径则补全;若不为绝对路径,则需要再按tab键
    2、多次tab:在当前目录下,并非仅仅拥有一个文件
    3、若出现当前目录下并没有文件名可以补全,则无法实现命令补全

bash特性四:别名alias

概述:

alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号\'\'将原来的命令引起来,防止特殊字符导致错误。

alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。

Grammar

alias (Option) (参数)

Option

-p:打印已经设置的命令别名。

参数

命令别名设置:定义命令别名,格式为"命令别名='实际命令'"。

Living Example

alias 的基本使用方法为:

alias 新的命令='原命令 -选项/参数'
例如:alias l=‘ls -lsh'将重新定义ls命令,现在只需输入l就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。
要删除一个别名,可以使用 unalias 命令,如 unalias l

查看系统已经设置的别名:alias -p
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

定义别名:alias aa="ifconfig eth0"
取消定义:unalias aa
以上取名只是当前有效,重启网络过后就无效了


如何让root用户永久使用这个别名?
编辑[root@test-7 ~]# vim /root/.bashrc

image-20220624142452057

然后刷新一下:
[root@test-7 ~]# source /root/.bashrc
Notice:这个只是针对root用户
如果想让所有用户都可以使用这个别名勒?
编辑[root@test-7 ~]# vim /etc/bashrc
然后刷新一下:
[root@test-7 ~]# source /etc/bashrc

image-20220624142507549

bash特性五:之快捷键:[有助于用户快速输入输出]

删除:

ctrl+d或者delete  删除光标所在位置上的字符-->相当于vim里面的x或者dl或者delete
ctrl+h  删除删除光标所在位置前的字符-->相当于vim里面的hx或者dh
ctrl+k  删除光标后面所有字符-->相当于vim里面的d->shift+$
ctrl+u  删除光标前面所有字符-->相当于vim里面的d->shift+^
ctrl+w  删除光标前一个单词-->相当于vim里面的db
ctrl+y  恢复ctrl+u上次执行时删除的字符
ctrl+?  撤销前一次输入
alt+r   撤销前一次动作
alt+d   删除光标所在位置的后单词

移动:

ctrl+a或者home    将光标移动到命令行开头-->相当于vim里面的shift+^或者home
ctrl+e或者end     将光标移动到命令行结尾-->相当于vim里面的shift+$或者end
ctrl+f或者方向键的右键      光标向后移动一个字符-->相当于vim里面的l或者方向键的右键
ctrl+b或者方向键的左键      光标向前移动一个字符-->相当于vim里面的h或者方向键的左键键

ctrl+方向键左键      光标移动到前一个单词的开头-->vim里面一样可以使用
ctrl+方向键右键      光标移动到后一个单词的开头-->vim里面一样可以使用
ctrl+x  在上次光标所在字符和当前光标所在字符之间跳转
alt+f   跳到光标所在位置单词尾部

替换:

ctrl+t  将光标当前字符与前面一个字符替换】
alt+t   交换两个光标当前所处位置单词和光标前一个单词
alt+u   把光标当前位置单词变为大写
alt+l   把光标当前位置单词变为小写
^oldstr^newstr  替换前一次命令中字符串

历史命令编辑:

ctrl+p或者方向键上键       返回上一次输入命令字符
ctrl+r                      输入单词搜索历史命令
alt+p               输入字符查找与字符相接近的历史命令
alt+>               返回上一次执行的命令

其他:

ctrl+p或者方向键上键       返回上一次输入命令字符
ctrl+r                      输入单词搜索历史命令
alt+p               输入字符查找与字符相接近的历史命令
alt+>               返回上一次执行的命令

bash的特性六:命令展开

特殊的符号:

~:自动切换到家目录

{}:花括号,可以实现展开完整路径作用

# 一条命令创建目录a_c 、 b_c 、 a_d 、 b_d
[root@test6 tmp]# mkdir -pv {a,b}_{c,d}
mkdir: 已创建目录 "a_c"
mkdir: 已创建目录 "a_d"
mkdir: 已创建目录 "b_c"
mkdir: 已创建目录 "b_d"

bash的特性七:echo $?-->命令的执行状态结果

[root@test6 ~]# lsss
-bash: lsss: command not found
[root@test6 ~]# echo $?             (错误命令,返回值为除0其他的所有)
127
[root@test6 ~]# ls
a_c              anaconda-ks.cfg.lns  etc         install.log         ncdu-1.9.tar.gz
a_d              b_c                  etc.tar.gz  install.log.syslog  time.txt
anaconda-ks.cfg  b_d                  init.txt    ncdu-1.9            xxx.txt
[root@test6 ~]# echo $?         (正常命令,返回值为非0)
0

bash的特性八:history

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。

~/.bash_history 历史命令文件缓存保存的文件路径

该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,默认历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

Grammar

history (Option) (参数)

Option

-c:清空当前历史命令

-d OFFSET:删除指定的条目

例如:#[root@learn ~]# history -d 860 (删除第860条)

-a:将历史命令缓冲区中命令写入历史命令文件中;

-r:将历史命令文件中的命令读入当前历史命令缓冲区

-w:将当前历史命令缓冲区命令写入历史命令文件中

-n:从历史记录中读取所有未被读取的行

image-20220624142832464

参数

n:打印最近的n条历史命令。

Living Example

关于history文件的特殊设置文件:

1、使用history命令显示最近使用的10条历史命令,输入如下命令:
[root@AAAA7 network-scripts]# history 10
  853  history 
  854  fds a
  855  history 
  856  ls
  857  cd 
  858  ls
  859  cd /etc/sysconfig/network-scripts/
  860  history 
  861  history -d 860
  862  history 10
2、ctrl+r    #输入某条命令的keywords,找出对应的命令,按右光标键

image-20220624142906011

3、清除history记录:history -c
4[root@test6 ~]# echo $HISTSIZE    查看history记录总数:
1000

# 调用history:!编号         (中间没有空格)

image-20220624142934515

5[root@test6 ~]# echo $HISTFILESIZE 历史文件可以存储的大小[默认为1000]
1000
-----------------------------------------------------------------------------------------
6、若要修改相关缓存条数或者缓存历史文件大小,则使用export KEYWORD,
可以在.bash_profile里配置
HISTSIZE=3000 #默认保留1000条。
HISTFILESIZE=3000
HISTFILESIZE 定义了在 .bash_history 中保存命令的记录总数.
HISTSIZE 定义了 history 命令输出的记录数.
如果想禁用history, 可以设置HISTSIZE=0

[root@test6 ~]# export HISTSIZE=200
[root@test6 ~]# echo $HISTSIZE
200
如果需要永久有效:修改配置文件 [root@test6 ~]# vim /etc/profile

image-20220624143027171

[root@test6 ~]# source /etc/profile     (重新加载一下)
-----------------------------------------------------------------------------------------
历史记录前面加一个时间戳:
[root@test ~]# HISTTIMEFORMAT="%F %T "
        [root@test ~]# history
            18 2019-01-10 11:03:22 history
如果需要对所有用户,永久有效,还是在[root@test6 ~]# source /etc/profile里面添加一行
-----------------------------------------------------------------------------------------
[root@test6 ~]# echo "export TMOUT=800" >> /etc/profile         #800秒超时时间终端未作任何操作将自动注销终端
-----------------------------------------------------------------------------------------
7、历史命令的重新执行:
!!    执行上一次历史命令
!NUM  执行历史命令中的某NUM条
! string  执行最近一次历史列表中以string开头的历史命令
!*  执行上一次命令的所有参数
!$  获取前一个命令的最后一个参数。  mkdir 666 && cd !$
$_  扩展到上一个简单命令的最后一个参数。mkdir some_dir && cd $_  #是一个非常常见的组合

[root@test-7 network-scripts]# vim /etc/resolv.conf
[root@test-7 network-scripts]# cat !$       (调用了最后一部分)
0cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain 4
nameserver 192.168.211.2
nameserver 8.8.8.8
Esc.-->调用上一条命令的最后一个参数
[root@AAAA7 ~]# cd /etc/sysconfig/network-scripts/
[root@AAAA7 network-scripts]# /etc/sysconfig/network-scripts/
!:1-->操作符号返回某个命令使用的第一个文件名
[root@test6 ~]# ll init.txt  time.txt 
-rw-r--r--. 1 root root 243 12月 27 16:12 init.txt
-rw-r--r--. 1 root root  60 12月 25 18:21 time.txt
[root@test6 ~]# cat !:1
cat init.txt
/selinux/initial_contexts/init
/root/etc/sysconfig/init

8、如何控制历史命令的记录?[通过HISTCONTROL进行历史文件的环境变量控制]
通过HISTCONTROL参数对历史命令进行控制
[root@test-6 /]# echo $HISTCONTROL      查看 [默认是ignoredups]
ignoredups
参数解释:
    ignoredups 忽略重复命令,此重复必须是连续的
    ignorespace 忽略空格键   
    ignorboth 忽略空格和重复命令
更改:
    [root@test6 ~]# export HISTCONTROL=ignorboth


9、实时追加history,不必等用户退出才将内存中的history记录到文件
可以在.bash_profile里配置
PROMPT_COMMAND="history -a"

10、使用 HISTFILE 更改保存历史记录文件
可以在.bash_profile里配置
HISTFILE=./$USER-$UID.log


综合配置:
https://mp.weixin.qq.com/s/00OUQ0ASAnZ9pGpsl44mlg

配置环境变量,编辑/etc/profile

vim /etc/profile    #添加以下内容
USER_IP=`who -u am i 2>/dev/null |awk '{print $NF}' |sed -e 's/[()]//g'`
LOG_NAME=`who -u am i |awk '{print $1}'`
HIST_DIR=/var/log/.history
if [ -z ${USER_IP} ]
then
    USER_IP=`hostname`
fi

if [ ! -d ${HIST_DIR} ]
then
    mkdir -p ${HIST_DIR}
    chmod 777 ${HIST_DIR}
fi

if [ ! -d ${HIST_DIR}/${LOG_NAME} ]
then
    mkdir -p ${HIST_DIR}/${LOG_NAME}
    chmod 777 ${HIST_DIR}/${LOG_NAME}
fi
PROMPT_COMMAND="history -a"
export HISTSIZE=4000
export HISTFILESIZE=4000
export HISTTIMEFORMAT="[%F %T] [$(whoami)] [${USER_IP}] "
DT=`date +"%Y%m%d"`
export HISTFILE="${HIST_DIR}/${LOG_NAME}/${USER_IP}.history.$DT"
chmod 777 ${HIST_DIR}/${LOG_NAME}/*.history* 2>/dev/null
export PS1="\[\e[33;40m\][\u@\h \w \T]\\$\[\e[0m\]" #黄色

刷新环境变量
source /etc/profile

查看历史命令
history

根据用户名在.history目录下创建目录并生成以登录客户端ip和时间命名的文件
# tailf /var/log/.history/root/39.155.188.41.history.20211107

bash的特性九-->重定向:> < >> <<

重定向概述:

程序是由:指令+数据
    读取数据:标准输入INPUT
        通过键盘、鼠标
    输出数据:标准输出OUTPUT
        通过显示器[实现人机交互的过程]
标准输入、输出在计算机中拥有一定的工作法则:
    通过描述符进行描述
标准输入(stdin): 0
正确标准输入的描述符:1
正确标准输出的描述符:1

标准输入(stdin): 0
错误标准输入的描述符:2
错误标准输出的描述符:2

计算机的fd的标示符进行分区[File Description]

默认情况下: echo $PATH 将在标准输出设备上显示,执行结果;但是某些情况用户需求将其写入另外的一些文件中,而并不是标准输入。此时就必须使用重定向

重定向命令讲解

I/O重定向:改变程序执行的标准输入、输出的位置

输出重定向:

将标准的输出的内容,重定向到指定的位置

Grammar:

COMMAND > FILEPATH
COMMAND >> FILEPATH

重点:

  • 输出重定向,这个符号表示要清空原来那个文件里面的内容,

  • 追加重定向,这个符号就表示不清空原来文件里面的东西,叠加效果

Notice:在实际生产环境中,由于人为操作失误往往只有">"输出重定向,而没有>>,会引起严重的后果。

防范措施:(只在当前shell有效)

set -C //禁止将内容覆盖输出至已有文件中[打开此功能]

set +C //关闭此功能

Living Example:
[root@redhat7-min tmp]# set -C
[root@redhat7-min tmp]# echo "aaaaa" > ./passwd 
-bash: ./passwd: 无法覆盖已存在的文件
Notice:如果打开了此功能,我们有时需要强制输出重定向,我们可以用 >|
Living Example:
[root@redhat7-min tmp]# cat passwd 
saddasdasdaaaaaaddddd
[root@redhat7-min tmp]# set -C
[root@redhat7-min tmp]# echo "1234566" >| passwd 
[root@redhat7-min tmp]# cat passwd 
1234566
---------------------------------------------------------
Living Example:
输出的东西放在一个文件里面而不放在桌面   cal > xx.txt 

(cal:表示命令,> :表示输出到哪里,xx.txt:表示输出到的是这个文件里面)  
[root@test-6 tmp]# cal > xx.txt
[root@test-6 tmp]# cat xx.txt 
     十二月 2018                             1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

错误输出重定向:

2>只有错误的内容才能输出重定向到指定的文件

2>>只有错误的内容才能追加输出重定向到指定的文件

[root@redhat7-min tmp]# ls
1.txt   passwd
[root@redhat7-min tmp]# cat -n 1.txt ;cat -n  passwd 
     1  qweasdzc
     1  dasdasfffff
[root@redhat7-min tmp]# cat 1.txt 2> passwd 
qweasdzc
[root@redhat7-min tmp]# cat -n 1.txt 
     1  qweasdzc
[root@redhat7-min tmp]# cat -n passwd 
[root@redhat7-min tmp]# csssat 1.txt 2> passwd 
[root@redhat7-min tmp]# cat passwd 
-bash: csssat: 未找到命令
---------------------------------------------------------
Living Example:若要将标准输出和错误输出各自重定向不同的位置:
方法1:
[root@redhat7-min tmp]# cat /etc/passwd 2> 1.txt  > passwd

方法2:
&>:无论是正确还是错误都要重定向
[root@redhat7-min tmp]# cattt /etc/passwd &> 1.txt &> passwd

2>&1 是一个 shell 的输出重定向符号,表示将标准错误输出(stderr)重定向到标准输出(stdout)。具体来说,2 表示标准错误输出文件描述符,> 表示重定向,&1 表示标准输出文件描述符。

在 Linux 系统中,所有的进程都有三个默认已打开的文件描述符:0、1 和 2。其中,0 表示标准输入(stdin)、1 表示标准输出(stdout)、2 表示标准错误输出(stderr)。

使用 2>&1 可以将标准错误输出重定向到与标准输出相同的位置。例如,如果你运行了一个命令,并希望将其输出和错误信息都保存到同一个文件中,可以这样做:

command > output.txt 2>&1

这里的 command 是需要运行的命令,> 符号表示将标准输出重定向到 output.txt 文件中,2>&1 则表示将标准错误输出重定向到标准输出去,即也重定向到 output.txt 文件中。

需要注意的是,2>&1 必须放在命令末尾,否则可能会出现无效的输出或错误输出无法重定向的情况。

2>&-2>& 都是用来重定向标准错误的用法,但它们有一些区别。

  • 2>&- 是将标准错误关闭或丢弃。它表示将文件描述符 2(表示标准错误)与特殊文件 /dev/null(空设备)进行重定向,从而将标准错误输出关闭,不再显示错误消息。这在某些情况下可以防止错误信息干扰脚本的输出或日志记录。
  • 2>& 是将标准错误重定向到其他文件描述符或文件。例如,2>&1 表示将标准错误重定向到与标准输出相同的位置。这样,标准输出和标准错误都会合并,并输出到相同的位置。

总结来说,2>&- 关闭或丢弃标准错误,而 2>& 将标准错误重定向到其他位置。

输入重定向:
  • ​ < 输入重定向

  • ​ << 追加输入重定向

cat << 连用:用于创建文档[一般用于做标准输入多个文档使用]
[root@redhat7-min tmp]# cat << EOF
> qazwsx
> EOF
qazwsx

Notice:

​ EOF代表的含义[END OF FILE]

作用:一般用于shell脚本中,给予用户提示信息语句;可以从键盘中键入一些字符,将其保存到指定的文件中

如果需要保持原内容不变需要单引号把EOF囊括起来

cat > test.log << 'EOF'
`date '+%H:%M:%S'` >> /logs/app.log;
EOF

如果需要内容美观,那么需要在EOF加一个横线
cat > test.log <<-'EOF'
    `date '+%H:%M:%S'` >> /logs/app.log;
    aaa
    bbb
    ccc
EOF
# cat test.log 
    `date '+%H:%M:%S'` >> /logs/app.log;
    aaa
    bbb
    ccc

综合应用:不追加内容:

[root@redhat7-min tmp]# cat > xxx.txt << EOF
exit
qaz
EOF
[root@redhat7-min tmp]# cat xxx.txt 
exit
Qaz

综合应用:追加内容:

[root@Gitlab-9 ~]# cat test.log
6666
7777
7777
[root@Gitlab-9 ~]# cat >> test.log << EOF
qaz
wsx
EOF
[root@Gitlab-9 ~]# cat test.log
6666
7777
7777
qaz
wsx

利用输出重定向清空文件里面的内容:

cat /dev/null > /etc/test.txt

或者直接重定向

> filename

利用输出重定向创建文件 -->创建文件命令 > 输出重定向

[root@test-6 tmp]# > a.txt
[root@test-6 tmp]# cat a.txt

bash的特性十:通配符(5个)

https://www.cnblogs.com/0zcl/p/6821213.html

[]表示匹配中括号内任意一个字符就成立
        [a-z]:表示a到z任意一个小写字母
        [0-9]:表示0-9任意一个数字
        [A-Z]:表示A-Z任意一个大写字母
?:任意单个字符(只是这个字符我所谓什么字符)
*:表示任意长度的任意字符(可以是一个可以是多个或者0个)
^:这个符号都表示否定的意思。(必须和[]这个用[^])
!  表示非
----------------------------------------------------------
tr可以使用的字符类:                                                            
[:alnum:]:字母和数字
[:alpha:]:字母
[:upper:]:大写字母
[:lower:]:小写字母
[:digit:]:数字
[:punct:]:标点符号
[:space:]:空白字符
[:graph:]:图形字符
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符
-----------------------------------------------------------                                          
{}:touch {1,2,3}意思就是创建了1和2和3,这3个文件。
{1..9}:表示1 2 3 4 5 6 7 8 9 

[]与{}区别:

  • []只能用来找文件

  • {} 用来找文件,或创造文件,生成序列

总结:通配符用于找文件,正则表达式用于处理字符

免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。