Skip to main content

Ubuntu-learn 01

· 19 min read
kart jim

设置windows子系统的语言

在windows安装linux子系统的时候,可以选择语言,如果选的不是中文或不是自己想要的,后期可以通过命令行的方式进行修改:

首先,安装对应语言包:

sudo apt-get install language-pack-zh-hans

然后设置语言;注意,这里一定要加上sudo,否则该文件是只读状态无法更改:

sudo vi /etc/default/locale 

保存退出便完成设置。

测试:

ncal -b
# 输出
七月 2022
一 二 三 四 五 六 日
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

linux tips

  • 清除控制台命令: clear
  • 使用Ctrl+C组合键终止执行的脚本文件
  • who可以帮助我们查看有哪些账户在什么时间登录了计算机。
  • wc命令可以统计行数
    • who | wc -l 使用管道将who和wc命令结合在一起使用。
  • ss命令可以查看Linux系统中所有服务监听的端口列表。但是ss命令自身没有灵活的过滤功能,而grep命令有比较强大灵活的过滤功能,这样的话也可以通过管道将这两个命令结合在一起使用。
    • ss -nutlp | grep sshd

本文部分内容是《Linux Shell核心编程指南》的学习笔记!

脚本文件的几种执行方式

脚本文件的书写格式

Shell脚本文件

简单来说就是将Linux或类UNIX系统的命令写入一个文件中,这个文件就是一个Shell脚本文件。

所以我们编写的Shell脚本文件必须在Linux或类UNIX操作系统中运行.给予脚本文件执行权限并运行脚本文件后,计算机就会从上往下顺序执行脚本文件内容中的命令。相对于在命令行手动执行系统命令而言,脚本文件的优势是一旦编写完成,以后就可以自动完成脚本文件中的所有命令(效率更高)。而且,相同的脚本文件可以被反复调用并执行,避免了不必要的手动重复输入命令的工作。

其实,脚本文件就是一个普通的文本文件,所以使用任何一款文本编辑器软件都可以创建脚本文件。 新建文件时推荐使用.sh作为文件的扩展名,让人一看便知该文件是一个Shell脚本文件。

脚本文件书写格式要求:

  • 首先,脚本文件第一行要求使用#!符号指定一个脚本的解释器,如#! /bin/bash#! /bin/sh#!/usr/bin/env python等,该行被#注释,所以不会被当作命令来执行,但计算机通过该注释信息得知应该使用什么解释器来解释整个脚本文件中的所有有效代码
  • 其次,脚本文件使用#<<符号实现单行或多行注释,被注释的关键词或代码将不被执行,注释主要是给人看的!通过阅读注释我们可以快速了解脚本文件的功能、版本、作者联系方式等,核心作用还是对脚本文件或代码块的功能进行说明。
    • <<符号后面的关键词可以是任意字符串,但前面使用什么关键词,结束注释时必须使用相同的关键词(字母区分大小写)。
  • 最后,最重要的内容就是代码部分,一般一行代码是一条命令,按从上往下的顺序执行脚本文件中所有有效的代码命令。

shell1.png

编写好脚本文件后,接下来就是执行了。执行脚本文件的方式有很多种,有需要执行权限的方式有不需要执行权限的方式有开启子进程的方式有不开启子进程的方式

脚本文件自身没有可执行权限

如果暂时还没有给脚本文件可执行的权限,那么默认脚本是无法直接执行的,但bash或sh这样的解释器,可以将脚本文件作为参数(读取脚本文件中的内容)来执行脚本文件。

shell2.png

脚本文件具有可执行权限

通过chmod命令可以给脚本文件分配执行权限,脚本文件一旦有了执行权限,就可以使用绝对路径或相对路径执行了。

shell3.png

开启子进程执行的方式

关于是否开启子进程,我们首先要了解什么是子进程,一般可以通过pstree命令来查看进程树,了解进程之间的关系。

shell4.png

对于刚才我们说的不管是直接执行脚本,还是使用bash或sh这样的解释器执行脚本,都是会开启子进程的。

不开启子进程的执行方式

使用source.命令来执行脚本文件可以不开启子进程,而是直接在bash终端下执行的。

开与不开子进程的区别 %}

当有个文件exit.sh里的命令是exit,分别使用不同的方式执行:

bash exit.sh
# or
sh exit.sh

source exit.sh
# or
. exit.sh

可以发现:source命令不开启子进程执行脚本文件会导致整个终端被关闭,而bash命令开启子进程的方式执行脚本文件却不受任何影响。

脚本文件的输入与输出

在Linux系统中使用echo命令和printf命令都可以实现信息的输出功能

使用echo命令创建一个脚本文件菜单

echo命令主要用来显示字符串信息

echo命令可以实现任意字符串消息的输出,可以使用多个echo命令输出多条信息,也可以使用一个echo命令,利用引号将多条信息一起输出。 但这些输出信息都使用默认的黑色字体,也无法居中显示,而当我们需要醒目地显示信息以提示用户注意时,这种输出可能略显单调。 echo命令支持-e选项,使用该选项可以让echo命令识别\后面的转义符号含义。

常见转义符号如表所示。其中\033\e后面可以跟终端编码,终端编码可以用于定义终端的字体颜色、背景颜色、定位光标等。

符号功能描述
\b退格键(Backspace)
\f换行但光标仍停留在原来的位置
\n换行且光标移至行首
\r光标移至行首,但不换行
\t插入Tab键
\\打印 \
\033 or \e设置终端属性,如字体颜色、背景颜色、定位光标等

应用实例:

Ubuntu22.04 echo 默认有 -e 参数!?

  1. echo -e "hello\tworld" | echo "hello\tworld" 输出hello后,再输出Tab缩进,最后输出world,最终结果是hello world。

  2. echo -e "hello\bo world" 输出helle,然后将光标左移1位,接着输出o world,原有的字母e被新的字母o替代,所以最终输出结果是hello world。 注意:-e选项和后面需要输出的内容之间至少有一个空格

  3. echo -e "hello\fworld" 输出hello,换行但光标仍旧停留在原来的位置,也就是字母o后面的这个位置,然后输出world。

  4. more: echo -e "hello\nworld" | echo -e "hello\rworld" | echo -e "\\"

shell5.png

  1. echo -e "\033[1mOK\033[0m" 加粗显示OK, \033\e后面跟不同的代码可以设置不同的终端属性,1m是让终端粗体显示字符串,后面的OK就是需要显示的字符串内容,最后\033[0m是在加粗输出OK后,关闭终端的属性设置

如果最后没有使用0m关闭属性设置,则之后终端中所有的字符串都使用粗体显示。

  1. echo -e "\e[5mOK\e[0m" 闪烁显示

  2. echo -e "\e[31mOK\e[0m" 红色显示

更多颜色:

note
  • 30 黑色
  • 31 红色
  • 32 绿色
  • 33 棕色
  • 34 蓝色
  • 35 紫色
  • 36 蓝绿色
  • 37 亮灰色
  • 1;33 亮黄色

  • 42 绿色背景
  • 44 蓝色背景
  • 32;44 绿色字体,蓝色背景

image.png

  1. 除了可以定义终端的字体颜色、样式、背景,还可以使用H定义位置属性。

echo -e "\e[82mOK\e[0m" 在屏幕的第3行、第10列显示OK

例子:echo_menu.sh

#!/bin/bash
clear #清除屏幕
echo -e "\033[42m------------------------------------------\033[0m"
echo -e "\e[2;10H这里是菜单\t\t\t#"
echo -e "#\e[32m 1.查看网卡信息\e[0m #"
echo -e "#\e[33m 2.查看内存信息\e[0m #"
echo -e "#\e[34m 3.查看CPU信息 \e[0m #"
echo -e "#\e[35m 4.查看磁盘信息\e[0m #"
echo -e "#\e[36m 5.查看账户信息\e[0m #"
echo -e "\033[42m------------------------------------------\033[0m"
echo

shell7.png

使用printf命令创建一个脚本菜单

Linux系统中除了echo命令可以输出信息,还可以使用printf命令实现相同的效果。
printf命令可以格式化输出数据。

printf [格式] 要输出的内容

常用的格式字符串及功能描述:

格式字符功能
%d or %i十进制整数
%o八进制整数
%x十六进制整数
%u无符号十进制整数
%f浮点数
%s字符串
\b退格键(Backspace)
\f换行但光标仍停留在原来的位置
\n换行且光标移至行首
\r光标移至行首,但不换行
\t插入Tab键
\033 or \e设置终端属性,如字体颜色、背景颜色、定位光标等

shell8.png

使用read命令读取用户的输入信息

在Shell脚本中允许使用read命令实现数据的输入功能。 read命令可以从标准输入读取一行数据。

read [选项] [变量名]

如果未指定变量名,则默认变量名称为REPLY

read命令常用的选项: 选项 | 功能 :---: | :---: -p | 显示提示信息 -t | 设置读入数据的超时时间 -n | 设置读取n个字符后结束,而默认会读取标准输入的一整行内容 -r | 支持读入\,而默认为转义字符 -s | 静默模式,不显示标准输入的内容(Silent mode),适合用来输入密码

例子:

read key1 # 等待输入,输入的内容将赋值给 key1
echo $key1 # 打印变量 key1

read -p "输入用户名:" user
echo $user

注意:在zsh里,使用-p参数会报错 read: -p: no coprocess

输入与输出的重定向

在大多数系统中,一般会默认把输出信息显示在屏幕上,而标准的输入信息则通过键盘获取。但在编写脚本时,当有些命令的输出信息我们不能或不希望显示在屏幕上(脚本执行时,大量的输出信息反而会让用户感到迷茫)。此时,不如先把输出的信息暂时写入文件中,后期需要时,再读取文件,提取需要的信息。

在Linux系统中

  • 标准输出的文件描述符为1
  • 标准错误输出的文件描述符为2
  • 标准输入的文件描述符则为0

如果希望改变输出信息的方向,可以使用>>>符号将输出信息重定向到文件中。使用1>1>>可以将标准输出信息重定向到文件(1可以忽略不写,默认值就是1),也可以使用2>2>>将错误的输出信息重定向到文件。

这里使用>符号将输出信息重定向到文件,如果文件不存在,则系统会自动创建该文件,如果文件已经存在,则系统会将该文件的所有内容覆盖(原有数据会丢失!)。而使用>>符号将输出信息重定向到文件,如果文件不存在,则系统会自动创建该文件,如果文件已经存在,则系统会将输出的信息追加到该文件原有信息的末尾。

shell9.png echo命令本来会将数据输出显示在屏幕上,但如果使用重定向后就可以将输出的信息导出到文件中。

echo命令不会出现报错信息。但使用ls命令时,根据文件是否存在,最后的输出信息又分为标准输出和错误输出。

shell10.png

ls -l /etc/hosts /nofile > test.txt 2> text.txt # 将标准和错误输出分别保存

  • 使用&>符号可以同时将标准输出和错误输出都重定向到一个文件(覆盖),也可以使用&>>符号实现追加重定向。
  • 最后,我们还可以使用2>&1将错误输出重定向到标准正确输出,也可以使用1>&2将标准正确输出重定向到错误输出。
    • 结合这种特殊的重定向方式,我们还可以将标准输出重定向到文件,然后将错误输出重定向到标准正确输出。最终把正确的和错误的信息都导入文件中,
  • Linux系统中有一个特殊的设备/dev/null,这是一个黑洞。无论往该文件中写入多少数据,都会被系统吞噬、丢弃。如果有些输出信息是我们不再需要的,则可以使用重定向将输出信息导入该设备文件中。注意:数据一旦导入黑洞将无法找回。

除了可以对输出进行重定向,还可以对输入进行重定向。默认标准输入为键盘鼠标。但键盘需要人为的交互才可以完成输入。 我们可以使用<符号进行输入重定向。<符号后面需要跟一个文件名,这样可以让程序不再从键盘读取输入数据,而从文件中读取数据。 <<符号(也被称为Here Document)代表你需要的内容在这里

例子test2.txt:

#!/bin/bash

cat > ./test2.txt << HERE
测试文件
HERE
  • bash here.sh
  • cat test2.txt 输出:测试文件

如果需要,可以使用<<-符号重定向输入的方式实现,这样系统会忽略掉所有数据内容及分隔符(EOF)前面的Tab键。