linux基础命令及bash shell特性

时间:2021-05-19 16:50:03   收藏:0   阅读:26

linux基础命令及bash shell特性


1.linux基础命令

1.1 查看内核版本和linux发行版本

1.2 查看服务器硬件信息

1.3 关机和重启命令

shutdown [OPTIONS...] [TIME] [WALL...]
  options:
  -r --reboot    重启机器
  -h             关机
  -k             不关机,仅发送警告信息
  -c             取消关机操作

其中[TIME]字段为延迟关机的时间,有如下几种格式:

  1. hh:mm:24小时格式,表示在制定的时间关机或重启;
  2. +m:表示m分钟后执行关机或重启;
  3. now:表示立即关机或重启;

[WALL...]字段表示关机前发送的告警信息,会向所有的在线用户进行发送。

shutdown用法如下:

#系统的23:00进行关机
[root@xuzhichao ~]# shutdown -h 23:00 "The system will be shutdown at 23:00"
Shutdown scheduled for Sun 2021-05-16 23:00:00 CST, use ‘shutdown -c‘ to cancel.
#取消关机
[root@xuzhichao ~]# shutdown -c

Broadcast message from root@xuzhichao (Sun 2021-05-16 21:26:11 CST):

The system shutdown has been cancelled at Sun 2021-05-16 21:27:11 CST!

#系统在10分钟后进行重启
[root@xuzhichao ~]# shutdown -r +10 "The system will be reboot after 10 min"
Shutdown scheduled for Sun 2021-05-16 21:38:05 CST, use ‘shutdown -c‘ to cancel.

Broadcast message from root@xuzhichao (Sun 2021-05-16 21:28:05 CST):

The system will be reboot after 10 min
The system is going down for reboot at Sun 2021-05-16 21:38:05 CST!

1.4 显示时间和日期命令

linux的时钟分为硬件时钟和系统时钟两种:

  1. 硬件时钟:由计算机的主板内部物理芯片计时,并由主板上的电池进行供电。
  2. 系统时钟:系统启动时,从硬件时钟读取,由linux内核通过CPU工作频率进行计时。

1.4.1 date命令

date命令语法格式如下:

Usage: date [OPTION]... [+FORMAT]     <==显示系统时间
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]    <==设定系统时间
  
 options:
 -d, --date=STRING         显示指定字符串的时间
 -s, --set=STRING          设定系统时间
 
 FORMAT可用格式如下:
  %%   a literal %
  %a   星期缩写 (e.g., Sun)
  %A   星期全写 (e.g., Sunday)
  %b   月份缩写 (e.g., Jan)
  %B   月份全写 (e.g., January)
  %c   时间和日期格式 (e.g., Thu Mar  3 23:05:25 2005)
  %d   日期,只显示数字 (e.g., 01)
  %D   显示日志,相当于 %m/%d/%y(e.g., 05/16/21)
  %F   完整日期,相当于%Y-%m-%d(e.g., 2021-05-16)
  %H   小时,24小时制格式(00..23)
  %I   小时,12小时制格式 (01..12)
  %k   小时, 显示格式为 ( 0..23); same as %_H
  %l   小时, 显示格式为 ( 1..12); same as %_I
  %m   月,显示格式为 (01..12)
  %M   分钟,显示格式为 (00..59)
  %r   显示格式为 (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M(e.g., 21:59)
  %s   从1970年1月1日到此时所经历的秒数,显示格式为1621173674
  %S   秒,显示格式为 (00..60)
  %T   显示时间,相当于%H:%M:%S(e.g., 22:01:52)
  %y   只显示年的后两位(00..99)
  %Y   年份(e.g., 2021)

date的用法如下:

#以默认格式显示当前日期
[root@xuzhichao test]# date
Sun May 16 22:06:31 CST 2021

#以特定格式显示当前日期
[root@xuzhichao test]# date +%c
Sun May 16 21:52:57 2021
[root@xuzhichao test]# date +%D
05/16/21
[root@xuzhichao test]# date +%F
2021-05-16
[root@xuzhichao test]# date +%R
21:59
[root@xuzhichao test]# date +%s
1621173674
[root@xuzhichao test]# date +%T
22:01:52
[root@xuzhichao test]# date +"%F %T" 
2021-05-16 22:05:52

#以特定格式显示指定时间的日期
[root@xuzhichao test]# date -d "1 day" +%F
2021-05-17
[root@xuzhichao test]# date -d "-1 day" +%F
2021-05-15
[root@xuzhichao test]# date +%F
2021-05-16
[root@xuzhichao test]# date -d "20210101" +%F
2021-01-01
[root@xuzhichao test]# date --date=20210302121212 +"%F %T"
2021030212-12-12 00:00:00
[root@xuzhichao test]# date --date=20210302 +%s   <==此格式多用于shell脚本中计算时间差使用
1614614400
[root@xuzhichao test]# date --date=‘@2147483647‘ +"%F %T"  
2038-01-19 11:14:07

#设定系统时间
[root@xuzhichao test]# date 030104052021.02
Mon Mar  1 04:05:02 CST 2021
[root@xuzhichao test]# date -s "-1 day"
Sun Feb 28 04:05:20 CST 2021

1.4.2 hwclock/clock命令:操作硬件时间

hwclock用于同步硬件时间和系统时间,主要选项如下:

选项 说明
-s --hctosys 以硬件时间为准,设定系统时间
-w --systohc 以系统时间为准,设定硬件时间

hwclock命令的主要用法如下:

#显示硬件时间
[root@xuzhichao test]# hwclock 
Sun May 16 22:26:16 2021  -0.784858 seconds
[root@xuzhichao test]# clock
Sun May 16 22:26:18 2021  -0.362403 seconds
[root@xuzhichao test]# date
Sun Feb 28 04:16:40 CST 2021

#以硬件时间校准系统时间
[root@xuzhichao test]# hwclock -s
[root@xuzhichao test]# date
Sun May 16 22:26:36 CST 2021

#以系统时间校准硬件时间
[root@xuzhichao test]# hwclock -w
[root@xuzhichao test]# hwclock 
Sun May 16 22:26:55 2021  -0.836115 seconds

1.4.3 cal命令:显示日历

#显示当前日期的月厉
[root@xuzhichao test]# cal
      May 2021      
Su Mo Tu We Th Fr Sa
                   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

#显示指定年和月的月厉
[root@xuzhichao test]# cal 9 1752
   September 1752   
Su Mo Tu We Th Fr Sa
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


#显示指定年的月厉
[root@xuzhichao test]# cal 2021
                               2021                               

       January               February                 March       

Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6       1  2  3  4  5  6
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    7  8  9 10 11 12 13
10 11 12 13 14 15 16   14 15 16 17 18 19 20   14 15 16 17 18 19 20
17 18 19 20 21 22 23   21 22 23 24 25 26 27   21 22 23 24 25 26 27
24 25 26 27 28 29 30   28                     28 29 30 31
31
        April                   May                   June        
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3                      1          1  2  3  4  5
 4  5  6  7  8  9 10    2  3  4  5  6  7  8    6  7  8  9 10 11 12
11 12 13 14 15 16 17    9 10 11 12 13 14 15   13 14 15 16 17 18 19
18 19 20 21 22 23 24   16 17 18 19 20 21 22   20 21 22 23 24 25 26
25 26 27 28 29 30      23 24 25 26 27 28 29   27 28 29 30
                       30 31
        July                  August                September     
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7             1  2  3  4
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    5  6  7  8  9 10 11
11 12 13 14 15 16 17   15 16 17 18 19 20 21   12 13 14 15 16 17 18
18 19 20 21 22 23 24   22 23 24 25 26 27 28   19 20 21 22 23 24 25
25 26 27 28 29 30 31   29 30 31               26 27 28 29 30

       October               November               December      

Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6             1  2  3  4
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    5  6  7  8  9 10 11
10 11 12 13 14 15 16   14 15 16 17 18 19 20   12 13 14 15 16 17 18
17 18 19 20 21 22 23   21 22 23 24 25 26 27   19 20 21 22 23 24 25
24 25 26 27 28 29 30   28 29 30               26 27 28 29 30 31
31

1.4.4 设置时区

linux的时区文件放置在/etc/localtime文件中,通过软链接的方式指定时区。

[root@xuzhichao test]# ll /etc/localtime 
lrwxrwxrwx. 1 root root 35 Nov  4  2020 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

设置时区可以使用timedatectl命令,永久生效。

timedatectl主要命令如下:

Commands:
  status                   Show current time settings
  set-time TIME            Set system time
  set-timezone ZONE        Set system time zone
  list-timezones           Show known time zones
  set-local-rtc BOOL       Control whether RTC is in local time
  set-ntp BOOL             Control whether NTP is enabled

timedatectl命令用法如下:

[root@xuzhichao test]# timedatectl status
      Local time: Sun 2021-05-16 22:36:32 CST
  Universal time: Sun 2021-05-16 14:36:32 UTC
        RTC time: Sun 2021-05-16 14:36:32
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
[root@xuzhichao test]# timedatectl list-timezones 
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
...(此处省略)...
[root@xuzhichao test]# timedatectl set-timezone Asia/Shanghai
[root@xuzhichao test]# timedatectl
      Local time: Sun 2021-05-16 22:37:26 CST
  Universal time: Sun 2021-05-16 14:37:26 UTC
        RTC time: Sun 2021-05-16 14:37:26
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

1.5 用户登录信息查看命令

1.6 echo命令

echo命令在linux中用于回显信息,也支持以特定格式显示。

echo命令的选项如下:

选项 说明
-E 不支持\解释功能(默认)
-e 支持\解释功能
-n 不自动换行

当启用-e选项时,以下字符将具有特殊意义:

字符 意义
\a 发出警告声
\b 退格键
\c 最后不加换行符
\n 换行且光标移到行首
\r 回车,光标移到行首,不换行
\t tab键
\\ 插入“\”键

echo支持输出带颜色的字体,使用如下格式:

echo -e “\033[字背景颜色;字体颜色m字符串\033[控制码”

字体背景颜色 :
40:黑  41:深红  42:绿   43:黄色  44:蓝色  45:紫色  46:深绿  47:白色

字体颜色 :
1:高亮  5:闪烁  30:黑  31:红  32:绿  33:黄   34:蓝色   35:紫色   36:深绿 37:白色

echo的用法如下:

[root@xuzhichao test]# echo "abc"
abc

#显示变量
[root@xuzhichao test]# echo $LANG
en_US.utf8

#不换行
[root@xuzhichao test]# echo -n "abc"
abc[root@xuzhichao test]# 

[root@xuzhichao test]# echo  -e "abc\tcba"
abc	cba

[root@xuzhichao test]# echo -e "\033[40;31mabc\033[m"
abc

1.7 linux命令分类

linux中的命令可以分为内部命令,外部命令,别名三种。

1.7.1 内部命令

内部命令是指集成在特定shell中的命令,shell工具中默认包含了一些工具,常用的/bin/bash shell中就有很多内部命令。

shell程序是加载到内存中的,因此内部命令的执行效率很高。

[root@xuzhichao test]# enable 
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable compopt
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
... (此处省略部分内容)...
[root@xuzhichao test]# type alias
alias is a shell builtin    <==内部命令为此提示
[root@xuzhichao test]# help alias 
alias: alias [-p] [name[=value] ... ]
    Define or display aliases.    

    Without arguments, `alias‘ prints the list of aliases in the reusable
    form `alias NAME=VALUE‘ on standard output.
    
    Otherwise, an alias is defined for each NAME whose VALUE is given.
    A trailing space in VALUE causes the next word to be checked for
    alias substitution when the alias is expanded.
    
    Options:
      -p	Print all defined aliases in a reusable format
    
    Exit Status:
    alias returns true unless a NAME is supplied for which no alias has been
    defined.

1.7.2 外部命令

外部命令为独立的外部文件所提供的命令,可以使用type命令判断:

[root@xuzhichao test]# type hostname
hostname is /usr/bin/hostname      <==外部命令可以看到命令的文件路劲
[root@xuzhichao test]# hostname
xuzhichao
[root@xuzhichao test]# type hostname
hostname is hashed (/usr/bin/hostname)   <==执行过的外部文件在系统中会有缓存

外部命令实际是一个磁盘中的实际文件,当用户输入一个外部命令时,系统如果去磁盘中搜索所有的文件,那效率会相当低下。

实际上,在系统中有一个变量PATH,里面保存了外部命令存放的路径。执行外部命令时,系统会根据PATH中存放的目录顺序依次查找文件,一旦在某个目录中找到,就会停止向下查找,执行该命令。

[root@xuzhichao test]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

为了加快命令执行的速度,每次执行完外部命令时,系统会将其命令路径缓存到内存中,下次执行命令时,直接在缓存中查找路径即可,这样可以大大加快命令执行速度。

1.7.3 别名

别名:就是将一些常用的命令,起一个较短的名称,这样执行别名就相当于执行这些命令了。

如果别名和某个内部或外部命令同名时,系统会优先执行别名,如果需要执行内部或外部命令可以使用以下方法:

  1. \别名;
  2. ‘别名’
  3. 命令的完整路径
  4. command 别名
#默认执行别名,内容带颜色显示
[root@xuzhichao ~]# ls
anaconda-ks.cfg  boot  fstab  fstab.~1~  initial-setup-ks.cfg  passwd

#执行外部命令ls而非别名
[root@xuzhichao ~]# \ls
anaconda-ks.cfg  boot  fstab  fstab.~1~  initial-setup-ks.cfg  passwd
[root@xuzhichao ~]# ‘ls‘
anaconda-ks.cfg  boot  fstab  fstab.~1~  initial-setup-ks.cfg  passwd
[root@xuzhichao ~]# which ls
alias ls=‘ls --color=auto‘
	/usr/bin/ls
[root@xuzhichao ~]# /usr/bin/ls
anaconda-ks.cfg  boot  fstab  fstab.~1~  initial-setup-ks.cfg  passwd
[root@xuzhichao ~]# command ls
anaconda-ks.cfg  boot  fstab  fstab.~1~  initial-setup-ks.cfg  passwd

1.7.4 linux执行命令流程

linux中执行一个命令的执行流程如下:

  1. 系统先判断是否是别名,如果是别名,则执行别名;

  2. 若不是别名,系统判断是否是内部命令,若果是,执行该内部命令;

  3. 若不是内部命令,则查询hash的缓存,若果能找到此命令对应的路径,则按照此路径执行命令,若找到的路径已经删除,则提示“no such file or directory”;

  4. 如果hash缓存中未找到此命令,则按照PATH变量中定义的路径顺序查找,一旦在某个目录中找到命令文件,则停止查找,直接执行此命令。如果PATH变量中有多个路径都有此命令文件,则只会执行排序在前的目录下的命令文件;

  5. 如果PATH变量中的所有路径都没有此命令文件,则提示“command not found”,执行失败。

    [root@xuzhichao ~]# who
    root     pts/0        May 16 15:56 (192.168.20.1)
    root     pts/1        May 16 21:25 (192.168.20.1)
    [root@xuzhichao ~]# hash 
    hits	command
       1	/usr/bin/date
       1	/usr/bin/cat
       2	/usr/bin/vim
       1	/usr/bin/whereis
       1	/usr/bin/who
       5	/usr/bin/ls
    
    #删除缓存中who命令文件,执行报错
    [root@xuzhichao ~]# mv /usr/bin/who /usr/bin/who.bak
    [root@xuzhichao ~]# who
    -bash: /usr/bin/who: No such file or directory
    
    [root@xuzhichao ~]# mv /usr/bin/who.bak /usr/bin/who
    [root@xuzhichao ~]# who
    root     pts/0        May 16 15:56 (192.168.20.1)
    root     pts/1        May 16 21:25 (192.168.20.1)
    

1.8 linux的语系

linux中已经支持很多语言和编码,通过变量和一些命令可以调整语系。

1.9 修改linux主机名

2.bash shell特性

shell提供了用户和内核进行交互的一种接口。shell是一种命令解释器,它把用户输入的命令送到内核中去执行。

目前linux各个发行版中主流的shell都是/bin/bash程序,系统支持的bash程序可以在/etc/shells文件中看到。

[root@xuzhichao ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

2.1 历史命令

bash shell会记录用户所有操作的命令到缓存区,用户注销时自动保存到~/.bash_history文件中,当用户下次登录系统时,会读取该文件中的命令到命令缓存中。

2.1.1 history命令

history命令用于显示和管理历史命令,主要选项如下:

选项 说明
-c 清空历史命令
-d offset 删除历史中第offset条命令
n 显示最近的n条命令
-a 追加本次会话新执行的命令到~/.bash_history中
-r 读取历史文件追加到历史命令列表中
-w 保存历史命令到/.bash_history文件中,会覆盖原有/.bash_history文件中的命令。慎用!
-n 读取历史文件中未读过的行到历史列表中
-p 展开历史参数成多行,但不存在历史列表中
-s 展开历史参数成一行,附加到历史列表中

history命令的用法如下:

#显示历史命令
[root@xuzhichao ~]# history 
    1  2021-05-17 18:29:36 init 3
    2  2021-05-17 18:29:36 hostnamectl set-hostname Centos7-8
    3  2021-05-17 18:29:36 exit
    4  2021-05-17 18:29:36 ip add
    5  2021-05-17 18:29:36 nmcli connection 
    6  2021-05-17 18:29:36 nmcli connection modify ens33 con-name ens33 ifname ens33 method none ipv4.addresses 192.168.20.27/24
 
#显示最近3条历史命令
[root@xuzhichao ~]# history 3
  620  2021-05-17 18:29:43 echo $LANG
  621  2021-05-17 18:30:12 history 
  622  2021-05-17 18:31:16 history 3

#删除第623条历史命令
[root@xuzhichao ~]# history 1
  623  2021-05-17 18:32:08 history 1
[root@xuzhichao ~]# history -d 623
[root@xuzhichao ~]# history 3
  622  2021-05-17 18:32:00 history -d 622
  623  2021-05-17 18:32:31 history -d 623
  624  2021-05-17 18:32:34 history 3

#清空历史命令列表
[root@xuzhichao ~]# history -c
[root@xuzhichao ~]# history 
  247  2021-05-17 18:33:47 history 
  
[root@xuzhichao ~]# tail ~/.bash_history 
#1621248034
hostnamectl set-hostname efg
#1621248040
cat /etc/hostname 
#1621248046
hostnamectl 
#1621248063
cat /etc/hostname 
#1621248755
cat /etc/sysconfig/network
[root@xuzhichao ~]# history 
  247  2021-05-17 21:41:59 history 
  248  2021-05-17 21:44:22 tail ~/.bash_history 
  249  2021-05-17 21:45:28 echo "abc"
  250  2021-05-17 21:45:31 history 

#追加本次会话到到历史命令文件中
[root@xuzhichao ~]# history -a
[root@xuzhichao ~]# tail ~/.bash_history 
#1621258919
history 
#1621259062
tail ~/.bash_history 
#1621259128
echo "abc"
#1621259131
history 
#1621259140
history -a

#清除命令列表再把命令列表覆盖写入历史命令文件中,会导致丢失历史命令。
[root@xuzhichao ~]# history -c
[root@xuzhichao ~]# history -w
[root@xuzhichao ~]# cat ~/.bash_history 
#1621259799
history -w

#-p参数可以使得命令不记录在历史命令中,仅对部分命令有效
[root@xuzhichao ~]# history -p `id`
uid=0(root)
gid=0(root)
groups=0(root)
[root@xuzhichao ~]# history 
  247  2021-05-17 21:56:39 history -w
  248  2021-05-17 21:56:50 cat ~/.bash_history 
  249  2021-05-17 21:58:51 echo "aaa"
  250  2021-05-17 21:58:55 history 
  251  2021-05-17 21:58:58 history -r
  252  2021-05-17 21:56:39 history -w
  253  2021-05-17 21:59:00 history 
  254  2021-05-17 22:00:54 history -r
  255  2021-05-17 21:56:39 history -w
  256  2021-05-17 22:00:57 history
  257  2021-05-17 22:01:17 cat ~/.bash_history 
  258  2021-05-17 22:03:49 history 
  
# -s 选项可以用来在历史列表末尾添加命令,而不真正执行它们,从而在接下来的调用中可以使用它们。
[root@xuzhichao ~]# history -s "rm -rf /"
[root@xuzhichao ~]# history 
  247  2021-05-17 21:56:39 history -w
  248  2021-05-17 21:56:50 cat ~/.bash_history 
  249  2021-05-17 21:58:51 echo "aaa"
  250  2021-05-17 21:58:55 history 
  251  2021-05-17 21:58:58 history -r
  252  2021-05-17 21:56:39 history -w
  253  2021-05-17 21:59:00 history 
  254  2021-05-17 22:00:54 history -r
  255  2021-05-17 21:56:39 history -w
  256  2021-05-17 22:00:57 history
  257  2021-05-17 22:01:17 cat ~/.bash_history 
  258  2021-05-17 22:03:49 history 
  259  2021-05-17 22:05:27 rm -rf /
  260  2021-05-17 22:05:30 history

PS:如果需要永久保存上述变量,需要写入/etc/profile或~/.bash_profile文件中。

2.1.2 历史命令的快捷键

2.2 命令行展开{}

{}:可包含一个以逗号分隔的字符串或序列,能够将其展开为多个字符串。

使用示例如下:

[root@xuzhichao ~]# echo a{b,c,d}e
abe ace ade
[root@xuzhichao ~]# echo /tmp/{a,b,c}
/tmp/a /tmp/b /tmp/c
[root@xuzhichao ~]# echo {1..6}
1 2 3 4 5 6
[root@xuzhichao ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@xuzhichao ~]# echo {1..10..2}
1 3 5 7 9
[root@xuzhichao ~]# echo {a..z..2}
a c e g i k m o q s u w y

2.3 通配符

通配符glob,使用特定的字符,对相关的一系列文件进行匹配。

通配符的元字符如下:

元字符 说明
* 匹配任意长度字符
匹配任意单个字符
[] 中括号匹配指定集合内的任意单个字符,[xu]代表x,u两个字符中的任意一个
[0-9] 匹配任意数字
[a-z] 匹配任意单个小写字母
[[:upper:]] 匹配任意单个大写字母
[[:lower:]] 匹配任意单个小写字母
[[:digit:]] 匹配任意单个数字
[[:alnum:]] 匹配任意单个所有字母和数字
[[:alpha:]] 匹配任意单个大写和小写字母
[[:space:]] 匹配单个空白字符
[[:punctl:]] 匹配单个标点符号
[^xu] 匹配除了x,u以外的其他单个字符
[^a-z] 匹配除了小写字母以外的其他单个字符

通配符使用示例:

[root@xuzhichao test]# touch file{a..d} file{A..D}
[root@xuzhichao test]# ls
fileA  fileB  fileC  fileD  filea  fileb  filec  filed

#显示a-z的所有文件,注意字母的排序为aAbBcCdD
[root@xuzhichao test]# ls file[a-c]
fileA  fileB  filea  fileb  filec
[root@xuzhichao test]# ls file[[:upper:]]
fileA  fileB  fileC  fileD
[root@xuzhichao test]# ls file[^aAd]
fileB  fileC  fileD  fileb  filec

[root@xuzhichao test]# ls /etc/rc.d/rc[0-6]*/S*
/etc/rc.d/rc2.d/S10network  /etc/rc.d/rc3.d/S10network  /etc/rc.d/rc4.d/S10network  /etc/rc.d/rc5.d/S10network

#显示/etc下的非隐藏目录
[root@xuzhichao test]# ls /etc/[^.]*/ -d

#显示/etc下以conf结尾的文件
[root@xuzhichao test]# ls /etc/*.conf

2.4 bash shell的快捷键

bash shell的常用快捷键如下:

2.5 变量

2.5.1 变量的声明及引用

bash中变量需要预先定义,才能进行引用。

? 变量名=变量的值

变量的使用需要遵循如下规则:

  1. 变量两边不能直接使用空格符。

  2. 变量名称只能包含英文字母和数字,但是开头字符不能是数字。

  3. 不能使用shell中定义的命令或关键字作为变量名称。

  4. 变量内容中如有空格,使用单引号或双引号括起来。

    [root@xuzhichao ~]# str="a b c"
    [root@xuzhichao ~]# echo $str
    a b c
    [root@xuzhichao ~]# str1=a\ b\ c
    [root@xuzhichao ~]# echo $str1
    a b c
    
  5. 可以使用转义字符“\”将特殊符号,如[enter]、$、空格符、\、!、单引号(‘)等变为一般字符。

    [root@xuzhichao ~]# money=\$10000
    [root@xuzhichao ~]# echo $money
    $10000
    [root@xuzhichao ~]# money=$10000
    [root@xuzhichao ~]# echo $money
    cul0000
    
  6. 若变量没有赋值直接引用,变量的值为空,null。

  7. 变量引用时,若变量名与其他字符相连接,需要使用${变量名}格式

    [root@xuzhichao ~]# name=xuzhichao
    [root@xuzhichao ~]# echo $nameabc
    [root@xuzhichao ~]# echo ${name}abc
    xuzhichaoabc
    [root@xuzhichao ~]# echo ${name}_${str}
    xuzhichao_a b c
    
  8. 变量需要增加内容时,可以使用“\(变量名”或\){变量名}累加内容。

    [root@xuzhichao ~]# echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@xuzhichao ~]# PATH=${PATH}:/usr/local/bin
    [root@xuzhichao ~]# echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin
    
  9. 在命令中引用其他命令的结果可以使用“``”或“$()”格式。

    [root@xuzhichao ~]# ll `which awk`
    lrwxrwxrwx. 1 root root 4 Nov  4  2020 /usr/bin/awk -> gawk
    [root@xuzhichao ~]# version=$(uname -r)
    [root@xuzhichao ~]# echo $version
    3.10.0-1127.el7.x86_64
    [root@xuzhichao ~]# touch file.log.`date +"%F %T"`
    [root@xuzhichao ~]# ls file.log.2021-05-18 
    file.log.2021-05-18
    

2.5.2 变量类型

变量可以分为以下变量类型:

  1. 普通变量:普通变量的作用域为当前的shell进程,不包含其子进程,在shell进程结束时,普通变量会被注销。
  2. 本地变量:本地变量在函数中使用,作用域为当前函数,声明方式如下:
    • local 变量名
  3. 环境变量:环境变量用于控制shell的一些特性,作用域为当前shell及其子进程,环境变量一般使用大写字母作为变量名,声明方式如下:
    • export 变量名
    • declare -x 变量名
  4. 只读变量:根据变量是否可修改又有一种只读变量,该类型变量不能修改,声明方式如下:
    • readonly 变量名
    • declare -r 变量名

以上类型变量的使用示例如下:

#普通变量声明
[root@xuzhichao ~]# age=20
[root@xuzhichao ~]# echo $age
20

#开启一个字shell进程
[root@xuzhichao ~]# bash
[root@xuzhichao ~]# echo $age   <==显示为空

#退出到父进程
[root@xuzhichao ~]# exit
exit

#变量仍然可以显示内容
[root@xuzhichao ~]# echo $age
20

#把变量声明为环境变量
[root@xuzhichao ~]# export age

#开启子shell进程,可以显示变量的内容
[root@xuzhichao ~]# bash
[root@xuzhichao ~]# echo $age
20

#只读变量不能修改内容和删除变量
[root@xuzhichao ~]# declare -r name=xu
[root@xuzhichao ~]# name=wang
-bash: name: readonly variable   <==无法修改内容
[root@xuzhichao ~]# unset name
-bash: unset: name: cannot unset: readonly variable    <==不能删除只读变量

2.5.3 常用环境变量

linux中内置了一些常用的环境变量,实行了shell的特定功能。

2.5.4 单引号、双引号、反向单引号

在使用变量时,单引号、双引号、反向单引号的区别如下:

使用示例如下:

[root@xuzhichao ~]# echo "echo username is $USER"
echo username is root
[root@xuzhichao ~]# echo ‘echo username is $USER‘
echo username is $USER
[root@xuzhichao ~]# echo `echo username is $USER`
username is root

2.6 bash shell命令的执行逻辑

2.6.1 分号连接多个命令

把多个命令合并在一起执行,缺点是无论前一个命令是否执行成功都会执行下一个命令。若命令之间存在逻辑性,则会存在问题。

使用格式如下:

使用示例:

[root@xuzhichao ~]# ls a ; cd /data ; pwd
ls: cannot access a: No such file or directory
/data

[root@xuzhichao data]# sync ; sync ; shutdown -h 0

2.6.2 小括号()包含多个命令

小括号()包含多个命令,可以一次执行多个命令,提高执行效率。

使用格式如下:

注意:小括号会开启一个字shell进程,所有在()中的变量不会影响到当前shell的变量。

[root@xuzhichao /]# ls /data/ ; pwd ; (cd /data;pwd);pwd
python  python-v1.1  python-v1.2  test   <==ls /data/的结果
/                                        <==第二个pwd的执行结果
/data                                    <==()中的pwd执行结果
/                                        <==最后一个pwd的执行结果,在()中的执行的cd /data命令不会影响当前shell的环境

[root@xuzhichao ~]# name=123;(name=abc; echo $name);echo $name
abc
123    <==()中变量的赋值不会影响当前shell的变量

2.6.3 大括号{}包含多个命令

大括号{}包含多个命令,可以一次执行多个命令,提高执行效率。

使用格式如下:

注意:大括号{}中不会开启子shell,{}中的命令是在当前shell下执行的,会对当前shell的变量产生影响

[root@xuzhichao ~]#  name=123;{ name=abc; echo $name; };echo $name
abc
abc

2.6.4 && 和||的用法

多个命令之间如果存在逻辑判断关系,例如前一个命令执行成功则执行下一条命令,此时就需要&&和||的帮助了。

&&和||的用法示例如下:

#/data/test目录如果存在则在该目录下创建file1文件
[root@xuzhichao ~]# ls /data/test && touch /data/test/file1
ls: cannot access /data/test: No such file or directory
[root@xuzhichao ~]# ll /data/test/file1
ls: cannot access /data/test/file1: No such file or directory  <==因为/data/test不存在,file1没有创建

[root@xuzhichao ~]# mkdir /data/test
[root@xuzhichao ~]# ls /data/test && touch /data/test/file1
[root@xuzhichao ~]# ls /data/test/file1
/data/test/file1                                               <==因为/data/test已经存在,故file1创建成功

#/data/test如果不存在就创建该目录
[root@xuzhichao ~]# rm -rf /data/test/
[root@xuzhichao ~]# ls /data/test/ || mkdir /data/test/
ls: cannot access /data/test/: No such file or directory
[root@xuzhichao ~]# ll /data/test/ -d
drwxr-xr-x 2 root root 6 May 18 23:52 /data/test/              <==因为/data/test不存在,故/data/test创建成功

#无论/date/test/目录是否存在,都需要在/data/test下创建/data/test/file1文件
#当ls /data/test/命令运行失败时,执行mkdir /data/test/和touch /data/test/file1,当ls /data/test/命令运行成功时,只执行ch /data/test/file1命令
[root@xuzhichao ~]# rm -rf /data/test/
[root@xuzhichao ~]# ls /data/test/ || mkdir /data/test/ && touch /data/test/file1
ls: cannot access /data/test/: No such file or directory
[root@xuzhichao ~]# ls /data/test/file1
/data/test/file1

#判断/data/test/目录是否存在,存在则显示exist,不存在则显示not exist
[root@xuzhichao ~]# ls /data/test/ &> /dev/null && echo "exist" || echo "not exist"
exist
[root@xuzhichao ~]# rm -rf /data/test/
[root@xuzhichao ~]# ls /data/test/ &> /dev/null && echo "exist" || echo "not exist"
not exist

注意:以上两个例子中&&和||混合使用时&&和||放置的位置,位置不同实现的功能也不通。

2.7 I/O重定向

2.7.1 输出重定向

输出重定向分为以下三种类型:

技术分享图片

第二种命令实现的逻辑示例图如下:

技术分享图片

```shell
#示例一:把标准输出重定向到stdout.txt,把错误输出重定向到stderr.txt 
[root@xuzhichao ~]# ls /data/ err > stdout.txt 2> stderr.txt 

#示例二:把标准输出和错误输出合并到一个文件stdall.txt
[root@xuzhichao ~]# ls /data/ err &> stdall.txt
[root@xuzhichao ~]# ls /data/ err > stdall.txt 2>&1

#示例三:把标准输出和错误输出合并到一个文件stdall.txt,使用追加的方式
[root@xuzhichao ~]# ls /data/ err >> stdall.txt 2>&1
[root@xuzhichao ~]# ls /data/ err &>> stdall.txt

#示例四:使用/dev/null可以把一些不需要的输出屏蔽掉,/dev/null称为垃圾桶。
#使用id命令判断xu用户是否存在
[root@xuzhichao ~]# id xu &> /dev/null
[root@xuzhichao ~]# echo $?
0                                 <==结果为0代表用户xu存在

#示例五:把多条命令的正确执行结果合并到一个文件
[root@xuzhichao ~]# (id xu ; date) > all.log
[root@xuzhichao ~]# cat all.log 
uid=1000(xu) gid=1000(xu) groups=1000(xu)
Wed May 19 11:45:11 CST 2021

#示例六:通过覆盖软链接可以把真实文件覆盖
[root@xuzhichao ~]# cat all.log 
uid=1000(xu) gid=1000(xu) groups=1000(xu)
Wed May 19 11:45:11 CST 2021
[root@xuzhichao ~]# ln -s all.log all.link
[root@xuzhichao ~]# ll all.*
lrwxrwxrwx 1 root root  7 May 19 11:47 all.link -> all.log
-rw-r--r-- 1 root root 71 May 19 11:45 all.log
[root@xuzhichao ~]# > all.link 
[root@xuzhichao ~]# cat all.log   <==内容被覆盖
[root@xuzhichao ~]# 
```

2.7.2 输入重定向

很多命令的默认是从键盘获取数据,可以使用文件来代替键盘获取输入。

#示例一:使用文件中的y作为rm命令的输入
[root@xuzhichao ~]# rm f1
rm: remove regular empty file ‘f1‘? y
[root@xuzhichao ~]# echo "y" > y.txt
[root@xuzhichao ~]# rm f2 < y.txt 
rm: remove regular empty file ‘f2‘? 

#示例二:利用标准输入,备份文件
[root@xuzhichao ~]# echo "welcome" > /etc/motd 
[root@xuzhichao ~]# cat > motd.bak < /etc/motd
[root@xuzhichao ~]# cat motd.bak 
welcome

#示例三:使用文件作为cat的输入
[root@xuzhichao ~]# cat < /etc/issue
\S
Kernel \r on an \m

2.7.3 多行输入重定向

当我们需要一次性输入多行数据,批量提交时,可以使用多行重定向实现。

多行重定向格式为:

command << [-] 结束符
line1
line2
...
结束符

说明:
1.结束符可以是任意字符,但需要保持一致,一般使用EOF;
2.结束符必须为独立的一行,前后不能有其他字符;
3.“-”一般用于在脚本中实现对齐效果;

使用示例如下:

[root@xuzhichao ~]# cat > file1 <<EOF
> abc
> 123
> qwe
> EOF
[root@xuzhichao ~]# cat file1
abc
123
qwe

2.8 管道

利用管道符“|”可以把两个无关的程序结合起来实现复杂功能。管道可以把前一个程序输出的结果作为后一个程序的输入进行处理。

管道使用格式如下:

注意:管道只能用于传递前一个命令的标准输出,不能传递错误输出。

如果需要让command2接收command1的错误输出,可以使用如下格式:

管道的使用示例如下:

[root@xuzhichao ~]# echo "1+1" | bc
2
[root@xuzhichao ~]# echo {1..100} | tr ‘ ‘ ‘+‘ | bc
5050
[root@xuzhichao ~]# ls 
22:18:01  all.link  all.log  anaconda-ks.cfg  boot  file.log.2021-05-18  file1  fstab  fstab.~1~  initial-setup-ks.cfg  
[root@xuzhichao ~]# ls | tr ‘a-z‘ ‘A-Z‘
22:18:01
ALL.LINK
ALL.LOG
ANACONDA-KS.CFG
BOOT
FILE.LOG.2021-05-18
FILE1
FSTAB
FSTAB.~1~
INITIAL-SETUP-KS.CFG

#处理前一个命令的错误输出
[root@xuzhichao ~]# ls err | tr ‘a-z‘ ‘A-Z‘
ls: cannot access err: No such file or directory
[root@xuzhichao ~]# ls err |& tr ‘a-z‘ ‘A-Z‘
LS: CANNOT ACCESS ERR: NO SUCH FILE OR DIRECTORY

2.8.1 tee命令

tee命令可以接收标准输入,实现同时将数据分送到文件和屏幕。实现的逻辑如下:

技术分享图片

tee命令的语法格式:

tee [OPTION]... [FILE]...

-a, --append              追加到文件,而非覆盖

tee用法如下:

[root@xuzhichao ~]# hostname | tee -a tee.log | tr ‘a-z‘ ‘A-Z‘
XUZHICHAO
[root@xuzhichao ~]# cat tee.log 
xuzhichao

2.8.2 减号“-”的用法

在管道中,经常会使用前一个命令的输出作为后一个命令的输入,当某些命令需要使用到文件名来处理时,stdin和stdout就可以使用减号“-”来代替文件。

示例:

#将/home目录的内容备份到当前目录下。
[root@xuzhichao ~]# tar -cvf - /home/ | tar -xvf -

这个例子意思是将/home目录下的文件打包,打包的数据不是记录到文件,而是传送到stdout;经过管道后将-传送给后一个命令tar -xvf - ,这样后一个命令的“-”则是取前一个命令的stdout,这样我们就不需要临时文件了。

原文:https://www.cnblogs.com/xuwymm/p/14785268.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!