第一节

自己写的

第二节

Shell编程

对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

Bash有以下的优点:

(1) 补全命令。当你在Bash命令提示符下输入命令或程序名时,你不必输全命令或程序名,按【Tab】键,Bash将自动补全命令或程序名。

(2) 通配符。在Bash下可以使用通配符“”和“?”。“”可以替代多个字符,而“?”则替代一个字符。

(5) 输入/输出重定向

输出重定向

把ll命令本来该显示在终端的信息,输入到指定txt文本中。

“>>”表示要将一条命令的输出结果追加到文件dir1.out的后面,该文件的原有内容不被破坏,如果使用“>”,则文件原有内容被覆盖。

输入重定向

假设有一个包含一些文本的文件,叫做 example.txt。你可以使用输入重定向将文件中的内容传递给某个命令,而不是手动键入。

例如,如果你想要查看文件 example.txt 的内容,可以使用以下命令:

cat < example.txt

这里,cat 是一个用于显示文件内容的命令,而 < example.txt 部分表示将文件 example.txt 的内容作为输入传递给 cat 命令,而不是手动输入。

(8) 作业控制

作业控制是指在一个作业执行过程中,控制执行的状态。可以挂起一个正在执行的进程,并在以后恢复执行该进程。

按下【Ctrl-z】组合键,挂起正在执行的进程,用bg命令使进程恢复在后台执行,用fg命令使进程恢复在前台执行。

【Ctrl-c】 结束程序

变量命名

声明环境变量

export 变量名=变量值

env查询所有环境变量

测试chmod

vim test2.sh

输入下面程序

#!/bin/bash
#This script is a test!
echo –n "Date and time is: "
date
echo –n "The Executable path is : "$PATH
echo "Your name is : `whoami` "
echo –n "Your Current directory is : "
pwd
#end

退出

:wq

添加权限

chmod +x tets2.sh

运行

./test2.sh

结果

命令替换

test3.sh内容如下:

Shell 语 法

test命令

1. test 命令的用法

test 是 Shell 内置命令,用于检测某个条件是否成立。通常与 if 语句一起使用,大部分 if 语句都依赖于 testtest 命令涵盖了数值、字符串和文件三个方面的检测。

Shell test 命令的基本用法为:

test expression

test 判断 expression 成立时,退出状态为 0,否则为非 0 值。

test 命令也可以简写为 [],其用法为:

[ expression ]

注意 [ ]expression 之间的空格,这两个空格是必须的,否则会导致语法错误。[ ] 的写法更加简洁,且使用频率较高。

#!/bin/bash
read age
if test $age -le 2; then
echo "婴儿"
elif test $age -ge 3 && test $age -le 8; then
echo "幼儿"
elif [ $age -ge 9 ] && [ $age -le 17 ]; then
echo "少年"
elif [ $age -ge 18 ] && [ $age -le 25 ]; then
echo "成年"
elif test $age -ge 26 && test $age -le 40; then
echo "青年"
elif test $age -ge 41 && [ $age -le 60 ]; then
echo "中年"
else
echo "老年"
fi

其中,-le 选项表示小于等于,-ge 选项表示大于等于,&& 是逻辑与运算符。

2. 与文件检测相关的 test 选项

(1) 文件类型判断

  • -b filename: 判断文件是否存在,并且是否为块设备文件。
  • -c filename: 判断文件是否存在,并且是否为字符设备文件。
  • -d filename: 判断文件是否存在,并且是否为目录文件。
  • -e filename: 判断文件是否存在。
  • -f filename: 判断文件是否存在,且是否为普通文件。
  • -L filename: 判断文件是否存在,并且是否为符号链接文件。
  • -p filename: 判断文件是否存在,并且是否为管道文件。
  • -s filename: 判断文件是否存在,并且是否为非空。
  • -S filename: 判断文件是否存在,并且是否为套接字文件。

(2) 文件权限判断

  • -r filename: 判断文件是否存在,并且是否拥有读权限。
  • -w filename: 判断文件是否存在,并且是否拥有写权限。
  • -x filename: 判断文件是否存在,并且是否拥有执行权限。
  • -u filename: 判断文件是否存在,并且是否拥有 SUID 权限。
  • -g filename: 判断文件是否存在,并且是否拥有 SGID 权限。
  • -k filename: 判断文件是否存在,并且是否拥有 SBIT 权限。

(3) 文件比较

  • filename1 -nt filename2: 判断 filename1 的修改时间是否比 filename2 新。
  • filename1 -ot filename2: 判断 filename1 的修改时间是否比 filename2 旧。
  • filename1 -ef filename2: 判断 filename1 是否和 filename2 的 inode 号一致,即两个文件是否为同一个文件。

3. 与数值比较相关的 test 选项

  • num1 -eq num2: 判断 num1 是否等于 num2
  • num1 -ne num2: 判断 num1 是否不等于 num2
  • num1 -gt num2: 判断 num1 是否大于 num2
  • num1 -lt num2: 判断 num1 是否小于 num2
  • num1 -ge num2: 判断 num1 是否大于等于 num2
  • num1 -le num2: 判断 num1 是否小于等于 num2

4. 与字符串判断相关的 test 选项

  • -z str: 判断字符串 str 是否为空。
  • -n str: 判断字符串 str 是否为非空。
  • str1 = str2str1 == str2: 判断 str1 是否等于 str2
  • str1 != str2: 判断 str1 是否不等于 str2
  • str1 \> str2: 判断 str1 是否大于 str2
  • str1 \< str2: 判断 str1 是否小于 str2

5. 与逻辑运算相关的 test 选项

  • expression1 -a expression2: 逻辑与,当 expression1expression2 都成立时,结果才成立。
  • expression1 -o expression2: 逻辑或,当 expression1expression2 中有一个成立时,结果就成立。
  • !expression: 逻辑非,对 expression 进行取反

以上是对 test 命令及其相关选项的基本介绍和示例。在实际使用中,根据具体情况选择合适的选项和组合条件,确保脚本逻辑正确且清晰易懂。

判断语句🤣🤣🤣

if

#!/bin/bash
#This is example2 about if.
echo –n "Please input the answer: " //-n不换行
read I //从键盘读入
if [ $I = y ]
then
echo "The answer is right"
elif [ $I = n ]
then
echo "The answer is wrong"
else
echo "Bad Input."
fi
#end

case

#!/bin/bash

echo "请输入一个季节(spring/summer/fall/winter):"
read season

case $season in
spring)
echo "春天,花开满园。"
;;
summer)
echo "夏天,炎热阳光。"
;;
fall)
echo "秋天,果实累累。"
;;
winter)
echo "冬天,白雪皑皑。"
;; # 跳出语句
*) # 这个是通配符,谁都可以匹配
echo "输入有误,无法识别的季节。"
;;
esac

进阶版:

#!/bin/bash
# This is an example script about case.

case $1 in
-i)
count=$(grep ^i "$2" | wc -l) # 查找并计算以i开头的行数
echo "The number of lines in $2 that start with an i is $count."
;;
-e)
count=$(grep ^e "$2" | wc -l)
echo "The number of lines in $2 that start with an e is $count."
;;
*)
echo "That option is not recognized."
;;
esac

在Shell脚本中,$2 表示命令行参数中的第二个参数。在命令行中,参数通过位置标识符($1、$2、$3,依此类推)来获取。

例如,如果你运行一个脚本的命令是:

./myscript.sh -i filename.txt

在这个命令中,$1-i,而 $2filename.txt。所以在你的脚本中,$2 用于表示第二个命令行参数,即文件名。

练习😋

九九乘法表

#!/bin/bash

for i in {1..9}; do
for j in {1..9}; do
echo -n "$j*$i=$((j*i)) "
if [ "$j" == "$i" ]; then
echo # 换行
break
fi
done
done

结果如下:

显示1~100偶数

#!/bin/bash
# 显示1-100的偶数
for i in {1..100}; do
[ $(($i % 2)) -eq 0 ] && echo $i
done

循环语句

其它语句

变量 功能 解释
$# 存储Shell程序中命令行参数的个数 例如,如果你运行脚本时使用了 ./myscript.sh arg1 arg2,那么$#将是2。
$? 存储上一个执行命令的返回值 如果上一个命令执行成功,$?将是0,否则是非零值。
$0 存储Shell程序的程序名 即脚本本身的名称。
$* 存储Shell程序的所有参数 例如,如果你运行脚本时使用了 ./myscript.sh arg1 arg2,那么$*将是一个包含所有参数的单个字符串,即arg1 arg2
$@ 存储所有命令行输入的参数 例如,如果你运行脚本时使用了 ./myscript.sh arg1 arg2,那么$@将是一个包含两个元素的数组,分别是arg1arg2
$$ 存储Shell程序的PID 这个变量是唯一标识正在运行的Shell脚本的数字。
$! 存储上一个后台执行命令的PID 如果你将一个命令放到后台运行(例如使用command &),那么$!将包含这个命令的进程ID。

while

#!/bin/bash
# 输出命令行传入的参数

int=1 # 初始化变量 int 为 1
while [ $int -le 5 ] # 当 int 小于等于 5 时,执行循环
do
sq=$((int * int)) # 计算 int 的平方,使用 $((...)) 进行算术运算
echo $sq
int=$((int + 1)) # 将 int 加 1
done
echo "Finished"
# end

until

until 是 Bash shell 中用于创建循环的关键字,它与 while 有点相反。

#!/bin/bash

count=0

until [ $count -ge 5 ]; do
echo "Count is $count"
((count++))
done

在这个例子中,until [ $count -ge 5 ] 意味着只有当 count 不再小于 5 时,循环才会结束。所以,count 从 0 递增到 4,循环体中的语句会一直执行。

shift

#!/bin/bash
# 这就是一个简单的读命令
# 这个循环目的是把用户输入的命令全部读完
while [ "$1" ]; do
if [ "$1" = "-i" ]; then
infile="$2" # 复制上 a.txt的信息
shift 2 # 参数往右移动2位
elif [ "$1" = "-o" ]; then
outfile="$2" # 参数往右移动2位
shift 2
else
echo "Program $0 does not recognize option $1"
exit 1
fi
done

tr a-z A-Z < "$infile" > "$outfile"

它可以处理 -i-o 选项,并分别指定输入和输出文件。如果有未识别的选项,脚本会输出错误信息并退出。最后,它使用 tr 命令将输入文件中的小写字母转换为大写字母,并将结果输出到指定的输出文件。运行命令是:./Shift.sh -i a.txt -o b.out

break与continue

用法与其他语言一样

函数使用

#!/bin/bash

max() {
maxvalue=$1

while [ "$1" ]; do
if [ "$maxvalue" ]; then # 检查是不是非空
if [ "$1" -gt "$maxvalue" ]; then # 检查$1是否大于 $maxvalue
maxvalue=$1
fi
else
maxvalue=$1
fi
shift
done

echo "Max Value is: $maxvalue"
}

max "$@" # 读取所有输入的参数

运行命令如下:

./max_script.sh 1 5 3 8 2

课后测试

  1. LINUX 系统的连接文件都有哪些,什么特点。

    在Linux系统中,连接文件主要分为硬链接和符号链接(软链接)两种。

    • 硬链接:

      • 特点:硬链接是文件系统中同一个文件的不同文件名,它们共享相同的inode和数据块。硬链接只能在同一个文件系统中创建,不能跨越文件系统。
      • 创建命令:ln source_file target_link
    • 符号链接(软链接):

      • 特点:符号链接是一个特殊的文件,它包含了另一文件的路径。可以跨越文件系统,并且可以链接目录。
      • 创建命令:ln -s source_file target_link
  2. vi 有几种工作模式,他们之间怎么切换。

    vi编辑器有三种主要的工作模式:

    • 命令模式(Command Mode): 这是默认的模式,用于执行编辑器命令。在命令模式下,你可以移动光标、删除字符等。
    • 插入模式(Insert Mode): 在插入模式下,你可以输入或编辑文本。切换到插入模式的方式是按下i键。
    • 底行模式(Ex Mode): 在底行模式下,你可以保存文件、退出编辑器等。切换到底行模式的方式是按下:键。

    在命令模式下,按下i键可以进入插入模式,按下:键可以进入底行模式。

  3. 什么是脚本程序(SHELL),什么是系统变量、举出至少5个系统变量。

    • 脚本程序(SHELL): 脚本是一种包含一系列命令的文本文件,通过解释器执行。在Linux中,常用的脚本语言是Bash Shell,它可以用于编写Shell脚本。

    • 系统变量: 系统变量是在Shell中预先定义的一些变量,用于存储系统信息、用户信息等。一些常见的系统变量包括:

      • $HOME:当前用户的主目录。
      • $USER:当前用户名。
      • $PATH:用于指定可执行文件的搜索路径。
      • $PWD:当前工作目录。
      • $SHELL:当前使用的Shell解释器。
  4. 一个文件都有哪些用户,每个用户都对这个文件有哪些权限。

    在Linux中,每个文件都有三类用户及其对应的权限:

    • 所有者(Owner): 文件的创建者,拥有最高权限。
    • 组用户(Group): 文件所属的用户组的成员。
    • 其他用户(Others): 不是文件所有者也不是文件所属用户组的其他用户。

    对每个用户,有三种基本权限:

    • 读权限(r): 允许查看文件内容和属性。
    • 写权限(w): 允许修改文件内容。
    • 执行权限(x): 对于可执行文件,允许运行;对于目录,允许进入。
  5. 脚本程序中,哪些语句能够控制分支循环,哪些语句控制循环流程。

    • 控制分支:

      • if语句:用于条件判断,根据条件执行不同的语句块。
      • case语句:用于多条件分支判断。
    • 控制循环:

      • for循环:用于按照指定次数循环执行一段代码。
      • while循环:在条件为真时,重复执行一段代码。
      • until循环:在条件为假时,重复执行一段代码。
  6. 压缩与解压缩指令都有哪些?

    • 压缩指令:

      • gzip:使用gzip进行压缩,例如:gzip filename
      • bzip2:使用bzip2进行压缩,例如:bzip2 filename
      • tar:打包文件并结合其他压缩算法,例如:tar czvf archive.tar.gz file1 file2
    • 解压缩指令:

      • gunzip:解压缩gzip压缩的文件,例如:gunzip filename.gz
      • bunzip2:解压缩bzip2压缩的文件,例如:bunzip2 filename.bz2
      • tar:解压缩tar打包的文件,例如:tar xzvf archive.tar.gz
  7. find指令、grep指令有什么区别。

    • find指令: 用于在文件系统中搜索文件和目录。它支持复杂的条件和操作,可以搜索文件名、大小、权限等。

      • 例子:find /path/to/search -name "pattern"
    • grep指令: 用于在文本文件中搜索指定的文本模式。它基

于行进行搜索,可以用于查找文件中包含特定字符串的行。
- 例子:grep "pattern" filename

区别:find主要用于搜索文件和目录,而grep用于搜索文本内容。

  1. 对于一个目录文件,读写执行三个权限,代表了用户能对该目录做什么操作。

    • 读权限(r): 允许用户列出目录下的文件和子目录。
    • 写权限(w): 允许用户在目录中创建、删除文件和子目录。
    • 执行权限(x): 允许用户进入(cd)目录。

    组合权限可以进行更多操作,例如,有读权限和执行权限但没有写权限的用户可以列出目录内容和进入目录,但不能在目录中创建或删除文件。

第三节

其它

如何连接自己的虚拟机

前言提示:使用Linux有2种方式,第一种方式:打开虚拟机,像windows一样玩,第二种方式:使用终端连接软件连接虚拟机终端进行操作。

终端连接软件-XShell

  1. 在虚拟机终端输入 ip addr show
  2. 拿到ip地址 ens33 下面ip地址

新建文件->配置文件

在xshell中需要输入用户名和密码

Linux基础命令🤣

vim修改配置

  • 退出vim
    • 电脑左上角按钮Esc
  • 保存退出
    • :wq
  • 强制退出
    • :q!

输入I,进入插入模式,然后你就可以愉快的输入文本了。

退出时,按下Esc按钮,输入:wq进行保存退出

Linux常用命令

  • ls list 查看当前目录下的内容
  • pwd print work directory,查看当期那所在目录
  • touch [文件名] 如果文件不存在,新建文件
  • rm [文件名] 删除指定文件
  • rmdir -rf [文件名] 删除文件夹

在执行Linux时,显示乱码,修改其编码模式。

默认语言为英语(美国)并使用UTF-8编码。

echo ‘LANG =”en_US.UTF-8”‘ >> /etc/profile

重新加载配置文件

source /etc/profile

命令使用技巧

Tab键 自动补全
使用上下键调出曾经使用过的命令
ctrl+l 实现清屏的效果

ls

  • -a 显示所有文件及其目录
  • -l 显示文件详细信息
  • -al 上面两个的综合

简化:ll

cat

cat [文件] 显示文件内容
cat -n [文件] 显示文件内容,并且显示行号

more

如果文件太多,分页看

more [文件]

回车键 向下滚动一行
空格键 向下滚动一屏
b 返回上一屏
q 退出

tail

查看文件末尾内容

tail [-n] filename

显示文件最后n行内容,通常用于 log 查询

mkdir

创建双层目录

mkdir -p it/test

-p选项表示递归创建目录,即如果父级目录不存在,则同时创建父级目录和子级目录。

rmdir

rmdir是一个用于删除空目录的命令。它只能删除空目录,如果目录中包含文件或其他子目录,则无法删除。

rm

删除文件或者目录

-r 把目录中的所有文件逐一删除
-f 强制删除
-rf 随便删除 使用频率最多

rm -rf directory

cp

复制文件或者目录

cp [-r] src tar

  • -r 代表着复制的是文件夹
  • cp -r it/ ./it1 把it目录下的所有文件复制到it1下面
  • cp -r it/ ./it1 把it目录和其目录下的内容复制到it1下面

mv

重命名或者移动位置

mv src tar

  • mv 1.txt 2.txt
    把1.txt 该名成 2.txt
  • mv 1.txt it/
    把1.txt 移动到 it目录下面
  • mv it/ it1/
    把it目录移动到it1目录中
  • mv 1.txt it/2.txt
    把1.txt移动到it目录中,并且改名为2.txt
  • mv 1.txt it/
    把1.txt 移动到it目录下面

tar

tar [-zcxvf] filename [files]

打包命令,十分重要

包文件后缀是.tar 只是对文件进行了打包,并没有压缩

后缀是 .tar.gz 表示打包的时候还进行了压缩

  • z 对文件进行压缩或者解压
  • c 打包
  • x 解包
  • v 显示命令的执行过程
  • f 指定包文件名称

常用组合 :

  • cvf 打包
  • zcvf 打包且压缩
  • xvf 解包
  • zxvf 解压缩包

vi 和 vim

vim 是从vi 进化的

yum install vim

命令模式

插入模式

按下a i o 任意一个键即可

底行模式

可以对文件内容进行查找,显示行号,退出等操作
在命令模式下按下[:,/]就可以进入底行模式
按下/ ,可以对文件内容进行查找
按下: wq 保存退出 q! 不保存退出 set nu 显示行号

find

查找命令

  1. find . -name ".java" 在当前文件夹下面找java文件
  2. find /it -name ".java" 在 it 文件夹下面找java文件

grep

从指定文件中查找指定的文本内容

  1. grep hello 1.txt 查找1.txt文件中出现hello 字符串的位置
  2. grep hello .java 查找当前目录中所有.java结尾的文件中包含 hello 的位置