Linux期末总结

填空

  • ls、cp等命令文件一般位于哪个目录?
    • 👉 /bin
  • 在Linux系统中,第一个启动的进程是:____ 、其编号为:____ 。
    • 👉 init,编号为 1
  • 给出文件的三种类型的名称
    • 👉 普通文件、目录文件、设备文件
  • 当前用户是stu,当前目录在/home/stu/mydir/,则执行cd ../..命令后当前目录是 ____,再执行cd命令后当前目录是 ____。
    • 👉 执行 cd ../.. 后目录是 /home/ 👉 再执行 cd 后目录是 /home/stu/
  • ________命令可以显示环境变量?
    • 👉 env
  • ________用户具有系统的最大权限。
    • 👉 root
  • Linux原作者是 :________。
    • 👉 Linus Torvalds

选择

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
32
33
34
1、我们实验使用的shell是哪个?
A. bsh → 早期的 Bourne Shell,现代系统很少使用
B. ksh → Korn Shell,功能强大但不是默认
C. csh → C Shell,语法类似C语言,但也不是默认
D. bash → Bourne Again Shell,是 Linux 默认和最常用的 shell
答案:D、bash

2、可以分页显示文件内容的命令是?
A. pwd → 显示当前工作目录,不显示文件内容
B. cat → 显示文件内容,但不能分页
C. more → 分页显示文件内容,适合查看长文件
D. page → 不是标准命令
答案:C、more

3、bash中默认已有的变量一般不包括?
A. find → 这是一个命令,不是环境变量
B. PWD → 当前工作目录的环境变量
C. HOME → 用户主目录的环境变量
D. USER → 当前用户名的环境变量
答案:A、find

4、从标准输入读入值并赋予一个变量的命令是?
A. out → 不存在的命令
B. scan → 不是标准 shell 命令
C. read → 从标准输入读取数据并赋值给变量
D. in → 不存在的命令
答案:C、read

5、下列哪个命令可将文本文件 f.txt 拷贝为 f.bak?
A. cp f.txt | f.bak → 错误,管道符不能这样用
B. cat f.txt > f.bak → 正确,将 f.txt 内容重定向到 f.bak
C. cp f.txt > f.bak → 错误,cp 不与重定向符结合
D. ls f.txt f.bak → 只是列出文件,不会拷贝
答案:B、cat f.txt > f.bak

简答题

1、解释 read 命令的功能,举例说明其用法

  • 功能:read 命令用于从标准输入(键盘或管道)读取一行数据,并赋值给变量。
  • 基本语法:read 变量名
  • 示例:
    1
    2
    3
    echo "请输入你的名字:"
    read name
    echo "你好,$name"
    执行后,用户输入的内容会赋值给变量 name,再通过 echo 输出。

2、如果当前目录下只有一个文件 abc123,解释 echo abc* 和 echo xyz=abc* 命令的输出

  • echo abc*

    • Shell 会进行通配符展开(* 表示匹配任意字符)。
    • 当前目录只有文件 abc123,所以 abc* 展开为 abc123
    • 输出结果:abc123
  • echo xyz=abc*

    • 同样,abc* 会展开为 abc123
    • 所以命令输出:xyz=abc123

假设当前目录下有三个文件:abc1、abc2、abc3

  1. echo abc*
  • Shell 会对通配符 * 进行展开。
  • abc* 会匹配所有以 “abc” 开头的文件。
  • 因此展开结果是:abc1 abc2 abc3
  • 输出结果:abc1 abc2 abc3
  1. echo xyz=abc*
  • 同样,abc* 会展开为 abc1 abc2 abc3。
  • 所以命令输出:xyz=abc1 abc2 abc3

3、画图示意操作系统、硬件和应用软件关系
OS与软硬件关系

按要求写命令

1、显示当前目录下文件名以abc开头同时以123结尾的文件

1
ls abc*123

2、把文本文件file1复制为file2,然后在file2尾部增加一行内容为“END”

1
2
cp file1 file2
echo "END" >> file2

3、设置权限,自己的文件file1,只允许自己完全访问和使用,自己之外的人仅有读权限

1
chmod 744 file1

解释:7 = rwx(自己可读写执行),4 = r(其他用户只读)

4、假设myprog.sh是你所写的一个脚本程序,写出命令在后台执行它

1
./myprog.sh &

5、用命令或命令组合列出当前目录下的所有目录文件(不列出其他文件)

1
ls -d */

6、在上一级目录的子目录src中建立一个空文件,文件名叫my_logfile

1
touch ../src/my_logfile

7、在当前路径下建立 /letters/mail 的符号链接 m-soft

1
ln -s /letters/mail m-soft

8、在屏幕上显示字符串 $abc

1
echo "\$abc"

解释命令含义

1、解释这行命令的含义。如果输入123,会显示什么?如果输入1234显示什么?

read abc ; test $abc -lt 999 && res=’too small’ || res=ok ; echo $res

  • read abc
    • 从标准输入读取一行内容,赋值给变量 abc。
  • test $abc -lt 999
    • 判断变量 abc 的值是否 小于 999。
    • -lt 表示 “less than”。
  • && res=’too small’
    • 如果上一步条件成立(即 $abc < 999),则执行 res=’too small’。
  • || res=ok
    • 如果条件不成立(即 $abc >= 999),则执行 res=ok。
  • echo $res
    • 输出变量 res 的值。

2、grep '789' lppasswd | wc -l

  • grep '789' lppasswd:在文件 lppasswd 中查找包含字符串 789 的行。
  • | wc -l:统计匹配到的行数。
  • 输出结果:文件中包含 789 的行数。

3、ls –l | grep ‘^d’

  • ls -l:列出当前目录下文件的详细信息。
  • grep '^d':筛选以 d 开头的行(在 ls -l 输出中,d 表示目录)。
  • 输出结果:当前目录下的所有目录信息。

4、ls -d ?[!y]*[e-f]

  • ls -d:列出匹配的文件名,而不是展开目录内容。
  • ?:匹配任意单个字符。
  • [!y]:匹配除 y 外的任意字符。
  • *:匹配任意长度的字符串。
  • [e-f]:文件名以 e 到 f 结尾。
  • 输出结果:当前目录下符合该模式的文件或目录名。
    5、echo $HOME
  • $HOME:环境变量,表示用户的主目录路径。
  • echo $HOME:输出主目录路径,例如 /home/stu。
  • 输出结果:显示当前用户的主目录。

6、cat file1 file2 > cat.out 2> cat.err

  • cat file1 file2:将文件 file1 和 file2 的内容连接输出。
  • > cat.out:将标准输出重定向到文件 cat.out。
  • 2> cat.err:将标准错误输出重定向到文件 cat.err。
  • 输出结果:
    • 正常内容写入 cat.out。
    • 错误信息写入 cat.err。

Shell 脚本

定义变量

  • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。不能以数字开头。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 定义输出变量
    your_name="qinjx"
    echo $your_name
    echo ${your_name}
    # 使用变量
    for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
    done
    # 修改变量,不用$
    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name
    # 删除变量
    unset variable_name

字符串变量

单引号

1
str='this is a string'
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

1
2
3
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
  • 输出:Hello, I know you are "runoob"!
  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3

# 输出:
# hello, runoob ! hello, runoob !
# hello, runoob ! hello, ${your_name} !

获取字符串长度

1
2
3
4
5
string="abcd"
echo ${#string} # 输出 4

string="abcd"
echo ${#string[0]} # 输出 4

提取子字符串

1
2
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

1
2
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4

数组

1
2
3
4
5
6
7
8
9
# 定义数组
数组名=(值1 值2 ... 值n)
# 读取数组
valuen=${array_name[n]}
# 使用@获取全部元素
echo ${array_name[@]}
# 获取数组的长度
length=${#array_name[@]}
length=${#array_name[*]}

Shell 传递参数

  • $0:文件名
  • $n:第n个参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    echo "Shell 传递参数实例!";
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    echo "第二个参数为:$2";
    echo "第三个参数为:$3";
    # 输出
    $ chmod +x test.sh
    $ ./test.sh 1 2 3
    Shell 传递参数实例!
    执行的文件名:./test.sh
    第一个参数为:1
    第二个参数为:2
    第三个参数为:3
    参数处理 说明
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数。如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo "Shell 传递参数实例!";
    echo "第一个参数为:$1";

    echo "参数个数为:$#";
    echo "传递的参数作为一个字符串显示:$*";
    # 结果
    $ chmod +x test.sh
    $ ./test.sh 1 2 3
    Shell 传递参数实例!
    第一个参数为:1
    参数个数为:3
    传递的参数作为一个字符串显示:1 2 3
  • $* 与 $@ 区别:
    • 相同点:都是引用所有参数。
    • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

Shell 基本运算符

算数运算符

运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
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
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \\* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
# 输出
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;

关系运算符

  • 假定变量 a 为 10,变量 b 为 20:
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
# 结果
10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布尔运算符

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
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
32
a=10
b=20

if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
#执行脚本,输出结果如下所示:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

文件测试运算符

操作符 说明 举例
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
  • 变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/bin/bash
    file="/var/www/runoob/test.sh"
    if [ -r $file ]
    then
    echo "文件可读"
    else
    echo "文件不可读"
    fi
    if [ -w $file ]
    then
    echo "文件可写"
    else
    echo "文件不可写"
    fi
    if [ -x $file ]
    then
    echo "文件可执行"
    else
    echo "文件不可执行"
    fi
    if [ -f $file ]
    then
    echo "文件为普通文件"
    else
    echo "文件为特殊文件"
    fi
    if [ -d $file ]
    then
    echo "文件是个目录"
    else
    echo "文件不是个目录"
    fi
    if [ -s $file ]
    then
    echo "文件不为空"
    else
    echo "文件为空"
    fi
    if [ -e $file ]
    then
    echo "文件存在"
    else
    echo "文件不存在"
    fi
    # 输出
    文件可读
    文件可写
    文件可执行
    文件为普通文件
    文件不是个目录
    文件不为空
    文件存在

自增和自减操作符

  • 使用let:
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    # 初始化变量
    num=5
    # 自增
    let num++
    # 自减
    let num--
    echo $num
  • 使用expr:
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    # 初始化变量
    num=5
    # 自增
    num=$(expr $num + 1)
    # 自减
    num=$(expr $num - 1)
    echo $num

if

1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

for循环

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

while循环

1
2
3
4
while condition
do
command
done

函数

无参函数

1
2
3
4
5
6
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

含参函数

1
2
3
4
5
6
7
8
9
10
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

返回值函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" # 返回值使用$?获取

Shell脚本例子

输出文件行数

1
2
3
4
5
6
7
8
9
10
11
12
13
if [ $# -ne 1 ] ; then # $#指当前参数数目
echo "[Usage: $0 <file name>]" # $0指当前文件名
exit 1 # 1表示出现错误
fi

lineCount=0
while read line
do
lineCount=$((lineCount+1))
done < $1 # <表示输出重定向,将参数的内容传给while循环

echo "file $1 $lineCount lines"
exit 0 # 0表示正常退出

查看对应目录文件个数

1
2
3
4
5
6
7
8
9
10
11
cd /var/log
sum=0
for i in `ls -r *`
do
if [ -f $i ]; then
sum=$((sum+1))
echo "文件名: $i"
fi
done
echo "总文件数量为:$sum"
exit 0

删除当前目录大小为0的普通文件

1
2
3
4
5
6
7
8
9
10
11
rmFileCount=0
for filename in `ls -r *`
do
if [ ! -s $filename -a -f $filename ] # -s $filename:判断文件是否非空。! -s $filename:表示文件为空(大小为 0)。-f $filename:判断是否为普通文件。-a:逻辑与。
then
rm -f $filename 2>/dev/null # 强制删除不提示,错误信息重定向到/dev/null,表示不保存错误信息
rmFileCount=$((rmFileCount+1))
fi
done
echo "$rmFileCount file deleted"
exit 0

判断是否是闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
read -p "请输入一个年份:" year

if [ "$year" = "" ]; then
echo "没有输入年份"
exit -1
fi

if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ]; then
echo "$year年是闰年"
elif [ $[year % 400] -eq 0 ]; then
echo "$year年是闰年"
else
echo "$year年不是闰年"
fi

判断是否是素数

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
32
33
34
35
#!/bin/bash

# 提示用户输入一个数
read -p "请输入一个整数: " num

# 如果输入为空或不是正整数,退出
if [ -z "$num" ] || ! [[ "$num" =~ ^[0-9]+$ ]]; then
echo "请输入一个正整数"
exit 1
fi

# 特殊情况:1 不是素数
if [ "$num" -le 1 ]; then
echo "$num 不是素数"
exit 0
fi

# 判断是否为素数
is_prime=1 # 假设是素数
for ((i=2; i*i<=num; i++))
do
if [ $((num % i)) -eq 0 ]; then
is_prime=0
break
fi
done

# 输出结果
if [ $is_prime -eq 1 ]; then
echo "$num 是素数"
else
echo "$num 不是素数"
fi

exit 0

Linux期末总结
https://sdueryrg.github.io/2025/12/21/Linux期末总结/
作者
yrg
发布于
2025年12月21日
许可协议