前言

今天ICT考得依托答辩,想到明天还要考试,只能继续复习操作系统实验的内容🙃


UNIX简单命令

操作系统中常常使用一些简单的UNIX命令,下面是比较常见的:

  • cat:连接文件并将内容显示到标准输出,也可以用来查看文件内容或创建新文件。
  • man查看 UNIX 命令的手册页,提供命令的用法和选项等信息。
  • who:找出谁登录到系统,显示用户的登录名、终端、登录时间等。
  • ls列出文件和目录,可以使用不同的选项来显示更多的信息,如 -a 显示隐藏文件,-l 显示长格式,-R 显示子目录等。
  • cp复制文件或目录,可以使用 -i 选项来在覆盖前询问,-r 选项来递归复制子目录等。
  • mv重命名或移动文件或目录,可以使用 -i 选项来在覆盖前询问,-f 选项来强制执行等。
  • rm删除文件或目录,可以使用 -i 选项来在删除前询问,-r 选项来递归删除子目录等。
  • touch:更新文件的访问和修改时间,如果文件不存在则创建空文件
  • mkdir创建新目录,可以使用 -p 选项来创建多级目录。
  • cd改变当前目录,可以使用 . 表示当前目录,.. 表示上级目录,~ 表示用户的主目录等。
  • rmdir删除空目录,如果目录不为空则无法删除。
  • pwd打印当前目录的绝对路径。
  • chmod更改文件或目录的访问权限,可以使用数字或符号来表示不同的权限,如 r 表示读,w 表示写,x 表示执行等。

Linux 中的权限是用来限制对文件或目录的访问和操作的机制,权限分为三种类型:读 (r)、写 (w)、执行 (x)。每种类型的权限可以用一个数字来表示,如下:

  • r: 表示可读取,用数字 4 表示
  • w: 表示可写入,用数字 2 表示
  • x: 表示可执行,用数字 1 表示
  • -: 表示没有权限,用数字 0 表示

Linux 中的权限还分为三种属组:用户 (u)、组 (g)、其他 (o)。每个文件或目录都有一个拥有者 (user) 和一个所属组 (group),还有其他以外的用户 (other)。每个属组都可以设置不同的权限,用三个数字来表示,如下:

  • u: 表示文件或目录的拥有者,用第一个数字表示
  • g: 表示与文件或目录的拥有者属于同一个群组的用户,用第二个数字表示
  • o: 表示其他以外的用户,用第三个数字表示

chmod有两种模式:Symbolic Mode 和 Absolute Mode。

Symbolic Mode 是使用字母和符号来表示权限的变更,例如:

  • chmod u+x file 表示为文件的拥有者增加执行权限
  • chmod g-w file 表示为文件的所属群组取消写入权限
  • chmod o=r file 表示为其他用户设定唯一的读取权限
  • chmod a+rwx file 表示为所有用户增加读、写、执行权限

Absolute Mode 是使用数字来表示权限的设定,每个数字代表一组权限,数字的范围是 0 到 7。例如:

  • chmod 777 file 表示为所有用户设定读、写、执行权限,相当于 chmod a+rwx file
  • chmod 755 file 表示为文件的拥有者设定读、写、执行权限,为文件的所属群组和其他用户设定读、执行权限,相当于 chmod u=rwx,g=rx,o=rx file
  • chmod 644 file 表示为文件的拥有者设定读、写权限,为文件的所属群组和其他用户设定读权限,相当于 chmod u=rw,g=r,o=r file

Linux之外,Unix还有一些重定向符号,例如:

  • >符号是输出重定向符号,表示将一个命令的标准输出重定向到一个文件中,如果文件不存在则创建,如果文件已存在则覆盖。
  • >>符号也是输出重定向符号,表示将一个命令的标准输出追加到一个文件的末尾,如果文件不存在则创建,如果文件已存在则不覆盖。
  • <符号是输入重定向符号,表示将一个文件的内容作为一个命令的标准输入,相当于从文件中读取数据。
  • <<符号也是输入重定向符号,表示将一段文本作为一个命令的标准输入,直到遇到指定的结束符为止,相当于从键盘输入数据。

例如:

  • echo "Hello World" > file.txt 表示将字符串 “Hello World” 输出到 file.txt 文件中,覆盖原有内容。
  • echo "Hello World" >> file.txt 表示将字符串 “Hello World” 追加到 file.txt 文件的末尾,不覆盖原有内容。
  • cat < file.txt 表示将 file.txt 文件的内容作为 cat 命令的输入,相当于 cat file.txt
  • cat << EOF 表示将接下来的文本作为 cat 命令的输入,直到遇到 EOF 为止,相当于从键盘输入文本。

SHELL脚本编写

在Linux中,我们经常bash 命令来执行shell脚本。一般以bash语法编写的脚本文件,应该在第一行声明:#!/bin/bash 

变量

在shell中,使用等号 = 将变量名和值连接起来,如 name="Tom"注意等号两边不能有空格。

还可以使用 unset 命令删除变量,删除后的变量不能再被使用,如 unset name

如果变量包含换行符,可以使用转义符\n表示,或者使用\ (\空格)表示。

在引用变量时,可以使用

  • 美元符号 $ 加上变量名,如 echo $name
  • 花括号 {} 包围变量名,如 echo ${name}
  • 使用反引号 ` 或者 $() 包围命令,表示命令替换,即先执行命令,然后将结果赋值给变量,如 date=`date +%Y-%m-%d`date=$(date +%Y-%m-%d)

当然,其中最后的命令替换,还有如下功能:

  • echo ($data) 是将括号中的变量 $data 的值输出到标准输出,如果 $data 没有定义或为空,那么就什么也不输出。例如,如果 $data=hello,那么 echo ($data) 就会输出 hello,如果 $data 没有赋值,那么 echo ($data) 就不会输出任何内容。
  • echo `data` 是将反引号中的 data 作为一个命令执行,然后将执行结果输出到标准输出,如果 data 不是一个有效的命令,那么就会报错。例如,如果 data=date,那么 echo data 就会输出当前的日期和时间,如果 data=abc,那么 echo `data` 就会提示 abc: command not found。

使用花括号引用变量时,可以对变量进行一些操作,如截取、替换、赋值等。

  • ${var:n} 表示从变量 var 的第 n 个字符开始截取,直到末尾。例如,如果 var=hello,那么 ${var:1} 就是 ello
  • ${var:n:m} 表示从变量 var 的第 n 个字符开始截取,长度为 m。例如,如果 var=hello,那么 ${var:1:2} 就是 el
  • ${var/pattern/replacement} 表示将变量 var 中第一个匹配 pattern 的部分替换为 replacement。例如,如果 var=hello,那么 ${var/l/x} 就是 hexlo
  • ${var//pattern/replacement} 表示将变量 var 中所有匹配 pattern 的部分替换为 replacement。例如,如果 var=hello,那么 ${var//l/x} 就是 hexxo
  • ${var:-string} 表示如果变量 var 为空或未定义,那么用 string 替换,否则保持不变。例如,如果 var=hello,那么 ${var:-world} 就是 hello,如果 var 为空,那么 ${var:-world} 就是 world
  • ${var:=string} 表示如果变量 var 为空或未定义,那么用 string 替换,并且将 string 赋值给 var,否则保持不变。例如,如果 var=hello,那么 ${var:=world} 就是 hello,如果 var 为空,那么 ${var:=world} 就是 world,并且 var 的值也变为 world

单双引号引用变量时,有以下区别:

  • 单引号 ' 表示引用的内容是固定的,不会进行变量替换、命令替换、转义等操作。例如,如果 var=hello,那么 echo '$var' 就是 $var,而不是 hello
  • 双引号 " 表示引用的内容是可变的,会进行变量替换、命令替换、转义等操作。例如,如果 var=hello,那么 echo "$var" 就是 hello,而不是 $var

输入

read 命令是用来从标准输入或其他文件描述符中读取一行数据,并赋值给一个或多个变量。read 命令有一些选项,可以控制读取的方式,如-p 可以显示提示信息,-s 可以隐藏输入的内容, -t可以设置输入的时间限制等。


运算

  • expr 运算是用来执行整数或字符串的运算,它需要用空格分隔每个参数,用反斜杠转义特殊字符,用双引号括起字符串。例如,expr 2 + 3 表示整数加法,expr length "hello" 表示计算字符串长度,expr substr "hello" 2 3 表示截取字符串。
  • $(( ))运算是用来执行数学运算和逻辑运算它可以使用 C 语言的语法,不需要空格或转义,可以直接引用变量。例如,((a=2+3)) 表示赋值运算,((a++)) 表示自增运算,((a>5 && b<10)) 表示逻辑运算。
  • $[ ]运算也是用来进行数学运算和逻辑运算

函数

函数的定义如下:

[ function ] funname [()]
{
    action;
    [return int;]
}

同删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,unset .f function_name


控制语句

if

if…then 语句是用来进行条件判断和控制流程的,它的基本语法如下:

if [ 条件判断式 ]; then
    # 在条件为真时执行的命令
fi

常见的条件有:

  1. -eq:等于。例如:if [ "$a" -eq "$b" ]; then
  2. -ne:不等于。例如:if [ "$a" -ne "$b" ]; then
  3. -gt:大于。例如:if [ "$a" -gt "$b" ]; then
  4. -lt:小于。例如:if [ "$a" -lt "$b" ]; then
  5. -ge:大于等于。例如:if [ "$a" -ge "$b" ]; then
  6. -le:小于等于。例如:if [ "$a" -le "$b" ]; then

与文件有关是可以有:

  • -e:文件存在。例如:if [ -e "$file" ]; then
  • -f:文件是普通文件。例如:if [ -f "$file" ]; then
  • -d:文件是目录。例如:if [ -d "$dir" ]; then
  • -r:文件可读。例如:if [ -r "$file" ]; then
  • -w:文件可写。例如:if [ -w "$file" ]; then
  • -x:文件可执行。例如:if [ -x "$file" ]; then

case

case 语句是用来根据变量的不同取值,执行不同的命令序列的。它的语法如下:

case 变量值 in
模式1)
    命令序列1
    ;;
模式2)
    命令序列2
    ;;
...
*)
    默认命令序列
    ;;
esac

while

while 语句是用来重复执行一组命令,直到条件为假时停止的。它的语法如下:

while [ 条件判断式 ]
do
    命令序列
done

for

for 语句是用来遍历一个列表中的每个元素,并执行相应的命令的。它的语法如下:

for 变量名 in 列表
do
    命令序列
done

在列表中可以使用seqseq命令是用来生成一个数字序列的,可以用在 for 语句中,指定循环的范围和步长。它的语法如下:

seq [选项]... [首数] [步长] [尾数]

例如:

  • seq 5 表示输出从 1 到 5 的连续整数,每个数占一行。
  • seq 2 5 表示输出从 2 到 5 的连续整数,每个数占一行。
  • seq 2 2 10 表示输出从 2 到 10 的整数,每次增加 2,每个数占一行。

它的表达式也可以使用C格式:

for ((i=1;i<=3;i++))
do
    命令序列
done

break & continue

  • break 命令是用来跳出当前的循环,继续执行循环外的命令的。
  • continue 命令是用来跳过当前的循环,继续执行下一次的循环的。
这里的一切都有始有终,却能容纳所有的不期而遇和久别重逢。
最后更新于 2023-12-17