[linux]五、重定向和文本处理的命令—1(编译型和解释型语言、cpython和pypy、标准输入和标准输出、proc和文件描述符、在vim编辑器中实现自动缩进以及其他功能、重定向)

目录

1、编译型和解释型的区别

2、scp

3、pypy和python3的运行速度比较 

3.1、为什么第一次执行pypy的时候比较慢

3.2、查看这个字节码文件

3.3、利用网页安装包安装高版本pypy

3.4、修改PATH变量,将pypy3二进制添加到PATH变量中

4、查看编程语言的详细信息

5、标准输入(stdin)和标准输出(stdout)

5.1、新建用户和设置密码

5.2、写一个设置用户名和密码的脚本

5.3、如何知道整个linux系统里边有哪些用户

5.4、指定路径新建用户和删除这个用户的家目录

6、重定向

6.1、交互式硬件设备 

6.1.1、查看linux内核的限制参数(ulimit -a)

6.1.2、查看当前linux登录的用户的情况

6.1.3、在VMware里切换终端

6.1.4、往别的终端里输入东西  

6.2、查看当前shell的进程号

6.3、文件描述符(fd)  file descriptor ⭐

7、发广播消息(wall)

8、杀死某个进程的命令(kill)

8.1、查看kill有哪些信号类型

 8.1.1、SIGKILL和SIGTERM的区别

8.2、为什么只开启了一个进程,却显示还有别的进程存在

8.3、如何远程登录其他的机器(ssh)

 9、重定向

9.1、标准正确输出重定向

9.2、标准输出追加重定向

9.3、将多个文件的内容合并到一个文件里(cat和重定向的组合使用)

9.4、标准的输入重定向(<)

9.5、标准错误输出重定向(2>)和标准错误追加输出重定向(2>>)

9.5.1、如果输出的是正确的,但是使用了错误输出重定向会怎么样?9

9.5.2、如何判断自己的命令是否输入正确呢?

9.5.3、清空文件,但是不删除这个文件

9.5.4、重定向标准输出和标准错误到一个文件(&> 和 &>>)

9.5.5、2>&1 和 &>

9.6、两个特殊的文件

9.6.1、/dev/null

9.6.2、/dev/zero和dd的配合使用

10、here docunment (<<)

10.1、利用here docunment编写一个小脚本(可实现隐藏密码输入)

11、tee

12、echo

12.1、echo -n 

12.2、echo -e

12.3、利用echo写一个菜单

13、在vim编辑器中实现自动缩进以及其他功能

14、小练习

14.1、练习总结(case)

14.1.1、break、;;、exit之间的关系

14.1.2、case不同取值对应的命令序列

14.2、为什么要申明脚本执行的解释器?

14.3、表示小写字母、大写字母和数字


1、编译型和解释型的区别

编译型:一次性编译成二进制文件,然后去执行二进制文件,跟源代码文件没有关系了。源代码文件进行了修改,必须要重新编译,生成新的二进制文件,然后执行新的二进制文件。

解释型:一行一行代码的去解释执行,只要源代码有更新就会重新根据源代码一行一行解释

2、scp

是远程复制到别的机器

3、pypy和python3的运行速度比较 

3.1、为什么第一次执行pypy的时候比较慢

因为python其实也有一个中间状态,叫做字节码文件

3.2、查看这个字节码文件

3.3、利用网页安装包安装高版本pypy

 Download and Install | PyPy  《--- 这个是下载地址

3.4、修改PATH变量,将pypy3二进制添加到PATH变量中

4、查看编程语言的详细信息

rpm -qi + 语言 

[root@fttsaxf ~]# rpm -qi python3
Name        : python3
Version     : 3.6.8
Release     : 18.el7
Architecture: x86_64
Install Date: 2021年12月05日 星期日 11时17分27秒
Group       : Unspecified
Size        : 39896
License     : Python
Signature   : RSA/SHA256, 2020年11月18日 星期三 22时19分51秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : python3-3.6.8-18.el7.src.rpm
Build Date  : 2020年11月17日 星期二 01时41分58秒
Build Host  : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : https://www.python.org/
Summary     : Interpreter of the Python programming language
Description :
Python is an accessible, high-level, dynamically typed, interpreted programming
language, designed with an emphasis on code readability.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.

The python3 package provides the "python3" executable: the reference
interpreter for the Python language, version 3.
The majority of its standard library is provided in the python3-libs package,
which should be installed automatically along with python3.
The remaining parts of the Python standard library are broken out into the
python3-tkinter and python3-test packages, which may need to be installed
separately.

5、标准输入(stdin)和标准输出(stdout)

标准输入(standard input):接受从键盘输入。
给计算机里输入内容的方式有:键盘输入(最标准的)、语音、图形图像(生物信息识别)、文件

标注输出(standard output):1、正确的标准输出;2、错误的标准输出,都是输出到屏幕上

标准输入和标准输出可以理解为是人和计算机在沟通交流的方式上的确定

5.1、新建用户和设置密码


图片解释:

echo 123456是在屏幕上输出123456
| 管道符号:作用是将前边一个命令的标准输出作为后面一个命令的标准输入
passwd shijunhao  给shijunhao设置密码
--stdin  是passwd命令的选项: 作用是告诉passwd命令,管道符号传过来的内容可以作为标准输入使用,这个选项是必须的。

5.2、写一个设置用户名和密码的脚本

# create_user_pwd.sh
#!/bin/bash

#接受用户输入

read -p "请输入用户名:" u_name

# 新建用户和设置密码
# if是判断用户是否存在,存在给与提醒,不存在就新建并且设置密码
if id $u_name &>/dev/null
then
	echo "用户 $u_name 存在"
else
	useradd $u_name
	read -p "请输入需要给用户设置的密码:" u_pwd
	echo $u_pwd | passwd $u_name --stdin
fi
[root@fttsaxf linux]# bash create_user_pwd.sh 
请输入用户名:hutianying
请输入需要给用户设置的密码:123456
更改用户 hutianying 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@fttsaxf linux]# id hutianying     #查看用户信息
uid=1010(hutianying) gid=1010(hutianying) 组=1010(hutianying)
[root@fttsaxf linux]# id hutianying9
id: hutianying9: no such user
[root@fttsaxf linux]# bash create_user_pwd.sh   #再一次设置hutianying这个用户的密码
请输入用户名:hutianying
请输入需要给用户设置的密码:123456
useradd:用户“hutianying”已存在   #这里虽然报错,但是后边的命令仍然会执行
更改用户 hutianying 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#⭐⭐⭐ shell脚本在执行的时候是从上而下,是一条一条的执行,中间那条命令执行失败,后面的命令也会执行,除了需要用到前边的命令产生的参数的命令才会受到影响。

id可以用来判断用户是否存在

5.3、如何知道整个linux系统里边有哪些用户

[root@fttsaxf linux]# cat /etc/passwd
lz:x:1000:1000::/home/lz:/bin/bash
bagnyou:x:1001:1001::/home/bagnyou:/bin/bash
# 这里一行就代表一个用户 

虽然我们可以在/home 里边看是否有用户存在,但是/home里的用户数并不全面,有些用户并不在/home里边。

 图片关键字:useradd -r + 用户名(新建系统用户)、useradd -d +路径+用户名(指定路径新建用户)、su - +用户名(⭐⭐⭐)

5.4、指定路径新建用户和删除这个用户的家目录

# 新建用户linghuchong 指定家目录为/huashan
[root@fttsaxf linux]# useradd -d /huashan linghuchong 
# 删除用户linghuchong,并且删除这个用户的家目录
[root@fttsaxf linux]# userdel -r linghuchong

6、重定向

改变命令的输出方向,本来标准输出往屏幕输出,重定向后命令不再往屏幕输出,而是输出到文件里,重新定义了它的输出方向

&> 不管正确输出还是错误的输出可以以输出到你指定的文件
/dev/null 是一个特殊的文件,任何内容重定向到这个文件,都不会保存,会自动消失。

6.1、交互式硬件设备 

[root@fttsaxf linux]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 1月  31 11:09 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 1月  31 11:09 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 1月  31 11:09 /dev/stdout -> /proc/self/fd/1

"""
linux系统的理论知识:
/proc  是存放linux内核信息的地方
    外面的用户可以通过访问/proc文件夹去了解内核里的信息
    /proc 里的信息是存放在内存李的,停电会丢失。里边的数字的文件夹是每个进程的信息
    cpuinfo --> cpu的基本信息;meminfo -->内存的基本信息
内核  kernel:linux系统内部最核心的软件
    1、对cpu进行调度管理
    2、对内存进行分配
    3、对磁盘进行管理
    4、对进程进行管理里
    5、对其他的硬件进行管理
"""

任何的硬件都会有一个文件和它对应

经典的文件描述符:

对应的路径:/dev/stdin  --》/proc/self/fd/0 --》/dev/pts/3(终端设备的文件名)
0--》标准输入 --》/dev/pts/3
1--》标准正确输出 --》/dev/pts/3
2--》标准错误输出 --》/dev/pts/3 

Linux操作系统默认允许一个进程只能打开1024个文件,所有默认的文件描述符的范围:0~1023

:只要有输入和输出的程序,它都有0、1、2 这三个文件描述符

常见的进程都会涉及到标准输入和标准输出,也有特例没有标准输入和标准输出:如,linux系统里属于后台的进程,操作系统内部的进程。

这些就是没有标准输入和标准输出的

6.1.1、查看linux内核的限制参数(ulimit -a)

[root@fttsaxf ~]# ulimit -a   #查看linux内核的限制参数
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7183
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024  # 这个是对一个进程可以打开多少个文件的限制
...
...
...

修改这个打开文件的个数限制⭐⭐⭐
图片解释:上边这个命令只是临时有效

永久修改:修改"/etc/security/limits.conf"文件

这些都是对整体资源的控制。

6.1.2、查看当前linux登录的用户的情况

 图片解释:

16:37:26:是当前时间
up 8 days,4:43  :开机启动多长时间
3 user :有三个用户登录 
TTY  :终端类型  terminal type
        定义:面向最终用户的端口
        有两种类型:tty(真正的终端,如:VMware)、pts(模拟的终端,如:Xshell)
        tty1(直接登录操纵的第一个终端)、pts/3 --》/dev/pts 文件夹下的第三个终端文件、pts/4
        linux里允许最多6个直接登录的终端 tty1~tty6
        pts文件夹是远程登录过来的终端类型,数量是不受限制的
WHAT:用户登录进入linux系统,正在使用的命令
FROM:用户从哪里登录过来的
        192.168.111.1  从这个ip地址远程登录过来的
        -  表示本地直接登录

6.1.3、在VMware里切换终端

ctrl + alt + F1~F6   或者  alt + F1~F6

6.1.4、往别的终端里输入东西  

注意:普通用户没有这个权限

6.2、查看当前shell的进程号

6.3、文件描述符(fd)  file descriptor ⭐

定义:linux内核给每个进程创建了一个文件描述表,这个表里记载这个进程所打开的所有的文件,为了方便进程知道自己打开了哪些文件,就给每一个文件进行了编号,这个编号就是文件描述符。内核(kernel)利用文件描述符(file descriptor)来访问文件, 文件描述符是非负整数

系统会为每个进程创建一个pcb,pcb里边有文件描述符表

文件描述符就是这个文件描述符表的下标。通过这个下标就可以具体的打开文件的文件指针,通过个这个指针可以找到具体的文件。文件描述符表是每个进程都有的。所以每个进程都打开同一个文件的话,可以分配不同的文件描述符;相同的文件描述符,不一定指向同一个文件。0,1,2这个描述符已经被系统预定好了的。

若是两个进程打开同一个文件,他们的文件描述符可能一样,也可能不一样。这跟这两个进程打开同一个文件时,这个文件在文件描述符的位置。

7、发广播消息(wall)

 

注意:普通用户能使用wall,但是不能传达消息给其他用户,因为那些设备文件只有root有写的权限。

8、杀死某个进程的命令(kill)

之前有写过利用终端编码杀死进程的,如这篇文章的2.1节:9.linux——历史命令、.bash_history文件、which、PATH变量、C语言、python_m0_48638643的博客-CSDN博客

在这篇文章里说明了如何利用的终端编码来杀死进程,用的是 pkill  -t pts/n   -9 这个命令,且这个命令只能在VMware里使用。现在来介绍一个新的命令——kill,能直接在xshell里使用


图片解释:ps aux 查看整个linux的进程

图片解释:如何所示,第二个进程的颜色变成了红色。kill 是linux杀死进程的命令;-9 是发送强制杀死进程的信号,告诉linux内核强制杀死进程

8.1、查看kill有哪些信号类型

信号是进程和进程之间通信的方式

[root@fttsaxf linux]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

 8.1.1、SIGKILL和SIGTERM的区别

"-9"内核调用kill()函数去强制杀死进程

8.2、为什么只开启了一个进程,却显示还有别的进程存在

 当我们非正常关闭xshell时会出现这种情况,如:我们挂起VMware,那么自然而然地xshell会断开连接。但我们重新启动VMware并打开新的进程,就会发现哪些本该断开不显示的进程,却还在显示。

8.3、如何远程登录其他的机器(ssh)

ssh + ip地址,linux里使用ssh命令远程登录其他的机器

 9、重定向

任何有输出的命令,都可以使用重定向

9.1、标准正确输出重定向

 定义

标准正确输出重定向(> 或者 1>),将标准输出到屏幕上的内容重定向到文件里,如果文件不存在会自动新建,如果文件存在就覆盖里边的内容。

[root@fttsaxf rough_book]# ls
[root@fttsaxf rough_book]# echo 123456 >1.txt
[root@fttsaxf rough_book]# cat 1.txt 
123456
[root@fttsaxf rough_book]# echo 123456789 1>1.txt
[root@fttsaxf rough_book]# cat 1.txt 
123456789
[root@fttsaxf rough_book]# ls
1.txt

9.2、标准输出追加重定向

定义:

标准输出追加重定向(>>),将标准输出到屏幕上的内容重定向到文件里,如果文件不存在会自动新建,如果文件存在就在原基础上末尾添加内容。

[root@fttsaxf rough_book]# cat 1.txt 
123456789
[root@fttsaxf rough_book]# echo 520 >>1.txt 
[root@fttsaxf rough_book]# cat 1.txt 
123456789
520

9.3、将多个文件的内容合并到一个文件里(cat和重定向的组合使用)

[root@fttsaxf rough_book]# cat 1.txt 
123456789
520
[root@fttsaxf rough_book]# cat 2.txt 
2022-2-5
[root@fttsaxf rough_book]# cat 1.txt 2.txt >nice_day
[root@fttsaxf rough_book]# cat nice_day 
123456789
520
2022-2-5

9.4、标准的输入重定向(<)

从文件里导入内容给程序

[root@fttsaxf rough_book]# wc /etc/passwd
  32   52 1468 /etc/passwd
[root@fttsaxf rough_book]# wc </etc/passwd  # 把这个文件作为标准输入给wc统计
  32   52 1468

9.5、标准错误输出重定向(2>)和标准错误追加输出重定向(2>>)

标准错误输出重定向(2>),将标准错误输出到屏幕上的内容重定向到文件里,如果文件不存在会自动新建,如果文件存在就覆盖原来的内容。

标准错误追加输出重定向(2>>),将标准错误输出到屏幕上的内容重定向到文件里,如果文件不存在会自动新建,如果文件存在就在原基础上末尾添加内容。

[root@fttsaxf rough_book]# ls
1.txt  2.txt  nice_day
[root@fttsaxf rough_book]# dsalki 2>3.txt
[root@fttsaxf rough_book]# ls
1.txt  2.txt  3.txt  nice_day
[root@fttsaxf rough_book]# cat 3.txt 
-bash: dsalki: 未找到命令
[root@fttsaxf rough_book]# kkkkkkkkkkkk 2>>3.txt 
[root@fttsaxf rough_book]# cat 3.txt 
-bash: dsalki: 未找到命令
-bash: kkkkkkkkkkkk: 未找到命令

9.5.1、如果输出的是正确的,但是使用了错误输出重定向会怎么样?9

[root@fttsaxf rough_book]# cat 3.txt 
-bash: dsalki: 未找到命令
-bash: kkkkkkkkkkkk: 未找到命令
[root@fttsaxf rough_book]# echo 123 2>3.txt 
123
[root@fttsaxf rough_book]# cat 3.txt 
'''
1、若使用了"2>",会把正确的输出,输出到屏幕上。并且那个要重定向的文件会被清空,相当于输了一个空值进去。
2、若使用了"2>>",会把正确的输出,输出到屏幕上。但是那个要重定向的文件会没什么变化,相当于输了一个空值进去。
'''

9.5.2、如何判断自己的命令是否输入正确呢?

利用正确的输出到一个文件,错误的输出到另外一个文件的方法。

[root@fttsaxf rough_book]# echo 123 1>2.txt 2>3.txt 
[root@fttsaxf rough_book]# cat 2.txt 
123
[root@fttsaxf rough_book]# cat 3.txt 
[root@fttsaxf rough_book]# echo123 1>2.txt 2>3.txt 
[root@fttsaxf rough_book]# cat 2.txt 
[root@fttsaxf rough_book]# cat 3.txt 
-bash: echo123: 未找到命令

9.5.3、清空文件,但是不删除这个文件

[root@fttsaxf rough_book]# cat 3.txt 
-bash: echo123: 未找到命令
[root@fttsaxf rough_book]# >3.txt # 这个命令用于清空这个文件的内容,但是不删除这个文件
[root@fttsaxf rough_book]# cat 3.txt 

9.5.4、重定向标准输出和标准错误到一个文件(&> 和 &>>)

正确和错误输出重定向(&>):正确的和错误的都重定向到一个文件里,如果文件不存在就新建,如果存在就覆盖里边的内容
正确和错误追加输出重定向(&>>):正确的和错误的都追加重定向到一个文件里,如果文件不存在就新建,如果存在就在原基础的末尾上追加内容

[root@fttsaxf rough_book]# cat nice_day 
[root@fttsaxf rough_book]# echo dshgjasl &>nice_day 
[root@fttsaxf rough_book]# cat nice_day 
dshgjasl
[root@fttsaxf rough_book]# ehodg &>nice_day 
[root@fttsaxf rough_book]# cat nice_day 
-bash: ehodg: 未找到命令
[root@fttsaxf rough_book]# echo  ehodg &>>nice_day 
[root@fttsaxf rough_book]# cat nice_day 
-bash: ehodg: 未找到命令
ehodg

9.5.5、2>&1 和 &>

# 下面两个命令等价
[root@fttsaxf rough_book]# echo feng >feng.txt 2>&1
[root@fttsaxf rough_book]# echo feng &>feng.txt  # 现在普遍使用这个命令 

9.6、两个特殊的文件

/dev/null:过滤标准错误信息
/dev/zero:用来创建指定长度文件

9.6.1、/dev/null

可以理解为一个黑洞文件:任何内容重定向到这个文件,都会消失,不会保存。

[root@fttsaxf dev]# du -sh /
du: 无法访问"/proc/2627/task/2627/fd/4": 没有那个文件或目录
du: 无法访问"/proc/2627/task/2627/fdinfo/4": 没有那个文件或目录
du: 无法访问"/proc/2627/fd/3": 没有那个文件或目录
du: 无法访问"/proc/2627/fdinfo/3": 没有那个文件或目录
2.7G	/
[root@fttsaxf dev]# du -sh / 2>/dev/null
2.7G	/

9.6.2、/dev/zero和dd的配合使用

零产生器:能产生一堆0的文件

[root@fttsaxf rough_book]# dd if=/dev/zero of=./test.dd bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0500078 秒,210 MB/秒
[root@fttsaxf rough_book]# du -h test.dd 
10M	test.dd
"""
dd是一个备份命令,也可以产生一个指定大小的文件,也可以用来测试磁盘的读取速度
机械盘:100M~150M/s
SSD固态:机械盘的五倍左右,150M~500M/s
if 输入设备文件 input file
of 输出设备文件 output file
bs 输出的数据的单位大小,单位时间读写的数据的字节数
count 输出的数据的数量
"""

10、here docunment (<<)

作用:生成一个指定内容的文档,将键盘输入的内容重定向到一个文件里。

# 将接受键盘的输入,输入的内容然后重定向到abc.txt文件里,遇到EOF停止输入
[root@fttsaxf rough_book]# cat >abc.txt <<EOF
> nihao    # 这里的">"是第二提示符
> wohenshuai
> EOF
[root@fttsaxf rough_book]# cat abc.txt 
nihao 
wohenshuai
# EOF --》end of file  这个是个结束标志

这个结束标志可以是其他的任意字符串,建议使用EOF或者end、END

利用这个进行编程,上边所说的">",第二提示符,不需要在脚本中输入。在交互式环境中,第二提示符是自动生成的。

[root@fttsaxf rough_book]# ls
abc.txt  hh1  hhh  zhang_yi_liu.sh
[root@fttsaxf rough_book]# bash zhang_yi_liu.sh 
#########################
liuxiang changsha
zhangchangzhen zhuhai
yiqiang zhuzhou 
feng de yong xingsha
#########################
[root@fttsaxf rough_book]# ls
abc.txt  hh1  hhh  liu_zhang_yi.txt  zhang_yi_liu.sh
[root@fttsaxf rough_book]# cat zhang_yi_liu.sh 
#!/bin/bash

#liuxiang ZHANG YI
cat >/root/linux/rough_book/liu_zhang_yi.txt <<EOF
liuxiang changsha
zhangchangzhen zhuhai
yiqiang zhuzhou 
feng de yong xingsha
EOF
echo "#########################"
cat /root/linux/rough_book/liu_zhang_yi.txt
echo "#########################"

10.1、利用here docunment编写一个小脚本(可实现隐藏密码输入)

#!/bin/bash

# 接受用户名和密码
read -p "请输入你的用户名:" u_name
#read -p "请输入你的密码:" u_pwd

# 密码如何不显示
#   -s     Silent mode.  If input is coming from a terminal, characters are not echoed.

#密码隐藏输入
read -s -p "请输入你的密码:" u_pwd
# 这个"echo"相当于一个回车功能
echo 
# 新建用户
useradd $u_name &>/dev/null

# 设置密码
echo $u_pwd |passwd $u_name --stdin &>/dev/null

# 注册成功后,输出你的账号用户名和密码
echo "create user ok,your name is $u_name,your password is $u_pwd"

11、tee

作用:将内容重定向到一个文件,并且在屏幕上还输出

[root@fttsaxf rough_book]# ls
abc.txt  hh1  hhh  liu_zhang_yi.txt  zhang_yi_liu.sh
[root@fttsaxf rough_book]# rm -rf *
[root@fttsaxf rough_book]# ls
[root@fttsaxf rough_book]# echo 12345 |tee happy.txt
12345
[root@fttsaxf rough_book]# cat happy.txt 
12345
[root@fttsaxf rough_book]# ls
happy.txt

12、echo

作用:在屏幕上显示一段文字或者指定内容

echo在shell编程的时候主要的作用:

1、输出变量和字符串;2、写菜单

12.1、echo -n 

不换行显示

[root@fttsaxf rough_book]# echo 123
123
[root@fttsaxf rough_book]# echo -n 123
123[root@fttsaxf rough_book]# 

12.2、echo -e

-e     enable interpretation of backslash escapes
作用:让 "\" 后面接得字符有特殊的作用

[root@fttsaxf rough_book]# echo -e "hello\nworld"
hello
world
[root@fttsaxf rough_book]# echo -e "hello\tworld"
hello	world

12.3、利用echo写一个菜单

#!/bin/bash

# 编写菜单
echo "========================================"
echo -e "1.add\t加法"
echo -e "2.sun\t减法"
echo -e "3.mul\t乘法"
echo -e "4.exit\t退出"
echo "========================================"

# 接受用户输入的函数
receive(){
	read -p "请输入第一个数字:" num1 
	read -p "请输入第二个数字:" num2
}
# 加法函数
add(){
	receive
	# 在双圆括号里引用变量可以不用$
	result=$((num1 + num2))
	echo "$num1 + $num2 = $result"
}

# 减法函数
sub(){
	receive
	result=$((num1 - num2))
	echo "$num1 - $num2 = $result"
}

# 乘法函数
mul(){
        receive
	result=$((num1 * num2))
	echo "$num1 * $num2 = $result"

}

# 接受用户输入
read -p "请输入你的选择:" option

# 根据用户输入的输入选择执行对应的函数
case $option in
	1)
		add
		;;  # 这个表示语句结束
	2)
		sub
		;;
	3)
		mul
		;;
	4)
		echo "成功退出"
		exit
		;;
	*)  # 这个是通配符号,表示任意字符
		echo "请输入1-4之间的数字,不要输入其他的字符"
		exit
		;;
esac  # esac 是case的配套结束符号

13、在vim编辑器中实现自动缩进以及其他功能

在centos7中是这样来的,其他的版本也可以借鉴。当然,我们vim编辑器中不缩进也是也可以。

第一步:

首先我们先找到我们vim编辑器的位置

[root@fttsaxf etc]# which vim
/usr/bin/vim

第二步:

找到里边是否存在 "vimrc"这个文件,然后进行编辑

[root@fttsaxf etc]# ls | grep vimrc
vimrc
[root@fttsaxf etc]# vim vimrc 

第三步:

在这个文件的底部输入这些代码,你可以选择你想要的进行添加,各取所需

set tabstop=4		//设置制表符宽度为4
set softtabstop 	//设置软制表符宽度为4
set shiftwidth		//设置缩进的空格数为4
set autoindent		//设置自动缩进
set cindent			//设置使用c/c++语言的自动缩进方式
set nu				//设置在左侧显示行号
set paste           //自动对齐,保证粘贴到vim编辑里的内容不会乱

14、小练习

[root@fttsaxf menu]# cat while_username 
#!/bin/bash

menu(){
	echo "========================================"
	echo -e "1.增加用户并且设置密码"
	echo -e "2.删除用户"
	echo -e "3.查看用户"
	echo -e "4.退出"
	echo "========================================"
	
	read -p "请输入你的选择:" option
}

while :
do
	menu
	case $option in
		1)
			echo "增加用户"
			;;
		2)
			echo "删除用户"
			;;
		3)
			echo "查询用户"
			;;
		4)
			echo "成功退出"
			exit
			;;
		*)
			echo "请输入1-4的数字"
			;;
	esac
	read -p "请敲任意键继续" # "read"实现让程序停顿在某个地方
	clear # "clear" 清屏
done

14.1、练习总结(case)

14.1.1、break、;;、exit之间的关系

两个分号相当于break,退出case;exit是退出整个程序

[root@fttsaxf script]# cat if.sh 
read -p "请输入你的名字:" name
while :
do
	if [[ $name == "root" ]]
	then
		echo "welcome to login"
		break  # 这个是退出当前循环
		#exit   # 这个是退出整个程序
	else
		echo "请输入正确的用户名"
	fi
done
echo "欢迎使用"

# 使用break的时候
[root@fttsaxf script]# bash if.sh 
请输入你的名字:root
welcome to login
欢迎使用

# 使用eixt的时候
[root@fttsaxf script]# bash if.sh 
请输入你的名字:root
welcome to login

14.1.2、case不同取值对应的命令序列

    case "$command" in
    start)
        s=$"Starting $prog (via systemctl): "
        ;;
    stop)
        s=$"Stopping $prog (via systemctl): "
        ;;
    reload|try-reload)  # "|",是或的意思
        s=$"Reloading $prog configuration (via systemctl): "
        ;;
    restart|try-restart|condrestart)
        s=$"Restarting $prog (via systemctl): "
        ;;
    esac

case语句适合固定字符串的情况的匹配,例如,1、2、3或者stop、start、restart。如果是一段范围的数字情况,不是特别方便,但是也能写。比如:

0~59 --》[0-9]|[1-5][0-9];70~89 --》[78][0-9],显而易见,这种方法对于范围的数字情况并不友好。

14.2、为什么要申明脚本执行的解释器?

例如:#!/bin/bash

主要是今后这个脚本可以在其他的系统里运行,例如:unix、Ubuntu、debian、suse、oracle linux等。我使用的是centos的linux,其他的系统默认的shell不一定就是bash,所以要申明出来告诉其他疼,方便出错后,找问题。

14.3、表示小写字母、大写字母和数字

[a-z],表示小写字母;[A-Z],表示大写字母;[0-9]。表示数字

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FanMY_71

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值