shell_programming

  1. Shell命令
    1. man
      1. 使用方法
      2. 常见选项
      3. 手册页结构
      4. 退出手册页
      5. 总结
    2. 目录操作类
      1. 1. cd (Change Directory)
      2. 2. pwd (Print Working Directory)
      3. 3. mkdir (Make Directory)
      4. 4. rmdir (Remove Directory)
      5. 5. mv (Move)
      6. 总结
    3. 文本操作类
      1. 1. touch
      2. 2. cat (Concatenate)
      3. 3. echo
      4. 4. wc (Word Count)
      5. 5. rm (Remove)
      6. 6. ln
      7. 7. cp (Copy)
      8. 8. tar
      9. 9. find
      10. 10. grep
    4. 用户管理类
      1. 1. useradd / adduser
      2. 2. usermod
      3. 3. userdel / deluser
      4. 4. passwd
      5. 5. groupadd / addgroup
      6. 6. groupdel / delgroup
      7. 7. su
      8. 总结
    5. 操作权限类
      1. 1. sudo
      2. 2. chmod
      3. 3. chown
      4. 4. chgrp
      5. 总结
    6. 网络操作类
      1. 1. ifconfig
      2. 2. ping
      3. 总结
    7. 控制终端类
      1. clear 命令
      2. 总结
    8. 开关机命令
      1. 开关机命令
      2. 1. reboot
      3. 2. poweroff
      4. 总结
  2. Shell脚本简介
    1. 作用
    2. Shell命令的本质
    3. Shell脚本语言和C语言一样吗?
    4. 常用的Shell解释器有哪些?
    5. Shell启动方式
    6. Shell脚本语法
      1. 定义变量
      2. 使用变量
      3. 将命令的结果赋值给变量
      4. 删除变量
      5. 特殊变量
      6. 读取从键盘输入的数据
      7. 退出当前进程
      8. 对整数进行数学运算
      9. 逻辑与/或
      10. 检测某个条件是否成立
      11. 管道
      12. if语句
      13. if else 语句
      14. if elif else 语句
      15. case in 语句
      16. for in 循环
      17. while 循环
      18. 函数
        1. 函数的基本语法
        2. 示例 1:基本函数
        3. 示例 2:返回值
        4. 示例 3:使用 echo 来返回值
        5. 示例 4:函数参数
  3. Linux环境变量
    1. 为什么需要环境变量?
    2. 全局变量 VS 环境变量
    3. Shell 配置文件
    4. Shell 执行顺序
    5. 修改配置文件
    6. Shell 启动方式对变量的影响
    7. 总结
  4. 如何构建一个deb软件安装包
    1. Linux软件包的组成
    2. deb包
    3. rpm包
    4. dpkg工具
      1. 常用命令
      2. 文件结构分析
      3. 0. 环境准备
      4. 1. 进入工作目录
      5. 2. 上传脚本文件
      6. 3. 修改脚本权限
      7. 4. 创建目标目录
      8. 5. 创建文件结构
      9. 6. 创建可执行脚本
      10. 7. 检查文件结构
      11. 8. 运行打包脚本
      12. 9. 安装软件包
      13. 10. 运行安装的程序
    5. apt命令和apt-get命令
      1. 1. apt命令
      2. 2. apt-get命令
      3. 3. 主要区别
      4. 4. 总结

Shell命令

man

man 是 Linux 和 Unix 系统中用于查看手册页(manual pages)的命令。手册页提供了有关系统命令、函数、文件格式和其他编程相关信息的详细文档。

使用方法

基本的命令格式如下:

man [选项] [命令名]

例如,要查看 ls 命令的手册页,可以输入:

man ls

--help

man cd 

或者

cd --help

常见选项

  • -k:搜索关键字,列出所有与之相关的命令和手册页。例如:man -k <关键词>
  • -f:显示指定命令的简短描述,例如:man -f <命令名>
  • -a:显示所有匹配的手册页,而不仅仅是第一个。

手册页结构

手册页通常包含以下几个部分:

  1. 名称:命令的名称及其简要描述。
  2. 简介:命令的简要说明及用法。
  3. 选项:可用的选项和参数。
  4. 示例:常见使用示例。
  5. 错误:可能的错误信息或注意事项。
  6. 作者:命令的作者信息。
  7. 许可证:使用条款和条件。

退出手册页

要退出手册页,可以按 q 键。

总结

man 命令是一个非常有用的工具,能够帮助用户获取系统命令的详细信息和用法,是 Linux 使用过程中不可或缺的部分。通过熟练使用 man 命令,用户可以更有效地掌握和利用系统功能。


目录操作类

以下是常用的目录操作命令的简要说明:

1. cd (Change Directory)

  • 用途:用于更改当前工作目录。
  • 用法
    cd [目录路径]
    
    • 例如:cd /home/user 将当前目录更改为 /home/user

2. pwd (Print Working Directory)

  • 用途:显示当前工作目录的完整路径。
  • 用法
    pwd
    
    • 执行该命令将输出当前所在的目录路径。

3. mkdir (Make Directory)

  • 用途:用于创建新目录。
  • 用法
    mkdir [目录名]
    
    • 例如:mkdir myfolder 会在当前目录下创建一个名为 myfolder 的新目录。

4. rmdir (Remove Directory)

  • 用途:用于删除空目录。
  • 用法
    rmdir [目录名]
    
    • 例如:rmdir myfolder 会删除名为 myfolder 的空目录。如果目录不为空,则会失败并提示错误。

5. mv (Move)

  • 用途:用于移动文件或目录,或重命名文件和目录。
  • 用法
    mv [源文件/目录] [目标文件/目录]
    
    • 例如:
      • 移动文件:mv file.txt /home/user/documents/file.txt 移动到指定目录。
      • 重命名文件:mv oldname.txt newname.txtoldname.txt 重命名为 newname.txt

总结

以上命令是进行目录操作时常用的基本命令,掌握这些命令可以有效地管理文件和目录结构。在使用这些命令时,请注意目标路径的正确性,以避免不必要的数据丢失。


文本操作类

以下是常用的文本操作命令的简要说明:

1. touch

  • 用途:用于创建空文件或更新已有文件的时间戳。
  • 用法
    touch [文件名]
    
    • 例如:touch myfile.txt 将创建一个名为 myfile.txt 的空文件。

2. cat (Concatenate)

  • 用途:用于查看文件内容,连接文件,或将内容输出到标准输出。
  • 用法
    cat [文件名]
    
    • 例如:cat myfile.txt 将显示 myfile.txt 的内容。

3. echo

  • 用途:用于输出字符串或变量的值到标准输出。
  • 用法
    echo [字符串]
    
    • 例如:echo "Hello, World!" 将输出 Hello, World!

4. wc (Word Count)

  • 用途:用于统计文件中的行数、字数和字符数。
  • 用法
    wc [选项] [文件名]
    
    • 例如:wc myfile.txt 将输出 myfile.txt 文件中的行数、字数和字符数。
    • 常用选项:
      • -l:仅显示行数。
      • -w:仅显示字数。
      • -c:仅显示字符数。

5. rm (Remove)

  • 用途:用于删除文件或目录。
  • 用法
    rm [文件名]
    
    • 例如:rm myfile.txt 将删除 myfile.txt 文件。
    • 注意:使用 -r 可以递归删除目录及其内容(例如:rm -r myfolder)。

6. ln

  • 用途:用于创建链接文件,可以是硬链接或符号链接。
  • 用法
    ln [源文件] [链接名]   # 创建硬链接
    ln -s [源文件] [链接名]  # 创建符号链接
    
    • 例如:ln -s myfile.txt mylink 将创建指向 myfile.txt 的符号链接 mylink

7. cp (Copy)

  • 用途:用于复制文件或目录。
  • 用法
    cp [源文件] [目标文件]
    
    • 例如:cp myfile.txt copy_of_myfile.txt 将复制 myfile.txtcopy_of_myfile.txt
    • 使用 -r 可以递归复制目录(例如:cp -r myfolder/ copy_of_myfolder/)。

8. tar

  • 用途:用于打包和压缩文件。
  • 用法
    tar [选项] [归档文件] [文件/目录]
    
    • 常用选项:
      • -c:创建一个新的归档文件。
      • -x:从归档文件中提取文件。
      • -v:在处理文件时显示详细信息。
      • -f:指定归档文件名。
    • 例如:tar -cvf archive.tar myfolder 将打包 myfolderarchive.tar

9. find

  • 用途:用于在文件系统中查找文件和目录。
  • 用法
    find [搜索路径] [选项] [搜索条件]
    
    • 例如:find /home/user -name "*.txt" 将在 /home/user 目录下查找所有以 .txt 结尾的文件。

    • 当然可以!find 命令非常强大且灵活,以下是一些常见的用法示例,涵盖了不同的选项和参数,帮助你高效地查找文件和目录。

      • 查找特定目录下的所有文件和子目录

        find /path/to/directory
        
      • 查找特定名称的文件

        find /path/to/directory -name "filename.txt"
        
      • 查找特定模式的文件(使用通配符)

        find /path/to/directory -name "*.txt"  # 查找所有 .txt 文件
        
      • 查找文件名时忽略大小写

        find /path/to/directory -iname "filename.txt"
        
      • 查找所有普通文件

        find /path/to/directory -type f
        
      • 查找所有目录

        find /path/to/directory -type d
        
      • 查找所有符号链接

        find /path/to/directory -type l
        
      • 查找小于10MB的文件

        find /path/to/directory -size -10M
        
      • 查找大于100KB的文件

        find /path/to/directory -size +100k
        
      • 查找在过去7天内修改过的文件

        find /path/to/directory -mtime -7
        
      • 查找在过去30天内访问过的文件

        find /path/to/directory -atime -30
        
      • 查找权限为 755 的文件

        find /path/to/directory -perm 755
        
      • 查找权限为可执行的文件

        find /path/to/directory -type f -executable
        
      • 查找并删除特定类型的文件

        find /path/to/directory -name "*.tmp" -delete
        
      • 查找并执行命令(例如,打印文件路径)

        find /path/to/directory -type f -exec ls -l {} \;
        
      • 查找并移动文件

        find /path/to/directory -name "*.log" -exec mv {} /path/to/backup/ \;
        
      • 查找大于1MB且最近7天内修改的文件

        find /path/to/directory -type f -size +1M -mtime -7
        
      • 查找所有的 .jpg 文件并打印文件大小

        find /path/to/directory -name "*.jpg" -exec du -h {} \;
        
      • 使用 -print 选项以效果更佳的格式显示结果(结合 grep 进行过滤):

        find /path/to/directory -name "*.txt" -print | grep -i "example"
        
      • 将查找到的文件存入文件以备后用

        find /path/to/directory -name "*.txt" > results.txt
        

10. grep

  • 用途:用于在文件中搜索指定模式的文本行。

  • 用法

    grep [选项] [模式] [文件名]
    
    • 例如:grep "search_term" myfile.txt 将在 myfile.txt 中查找包含 search_term 的行。

    • 常用选项:

      • -i:忽略大小写。

      • -r:递归搜索目录。

      • grep 命令用于在文件中搜索匹配模式的文本行。以下是一些常见用法示例,涵盖了不同的选项和参数,帮助你有效地使用 grep

        1. 基本用法
        • 查找包含特定字符串的行
          grep "search_term" filename.txt
          
        1. 忽略大小写
        • 查找时忽略大小写
          grep -i "search_term" filename.txt
          
        1. 显示行号
        • 在输出中显示匹配行的行号
          grep -n "search_term" filename.txt
          
        1. 使用正则表达式
        • 使用正则表达式查找匹配模式

          grep "^Start" filename.txt  # 匹配以 "Start" 开头的行
          
        • 查找包含数字的行

          grep "[0-9]" filename.txt
          
        1. 递归搜索
        • 在目录及其子目录中递归搜索文件
          grep -r "search_term" /path/to/directory
          
        1. 包含文件名
        • 在多个文件中查找时显示文件名
          grep -H "search_term" *.txt
          
        1. 查找整个单词
        • 仅查找完整单词
          grep -w "search_term" filename.txt
          
        1. 显示不匹配的行
        • 显示不包含匹配字符串的行
          grep -v "search_term" filename.txt
          
        1. 限制输出行数
        • 只显示前10个匹配的行
          grep -m 10 "search_term" filename.txt
          
        1. 使用管道
        • 结合其他命令使用管道
          dmesg | grep "error"  # 从内核消息中查找包含 "error" 的行
          
        1. 高亮显示匹配
        • 高亮显示匹配的文本(GNU grep 支持)
          grep --color=auto "search_term" filename.txt
          
        1. 统计匹配行数
        • 统计匹配的行数
          grep -c "search_term" filename.txt
          
        1. 查找含有多个模式的行
        • 使用 -e 查找多个模式
          grep -e "term1" -e "term2" filename.txt
          
        1. 从标准输入查找
        • 从标准输入中查找(例如配合 echo 使用)
          echo -e "line1\nline2\nsearch_term" | grep "search_term"
          
        1. 结合其他工具
        • findxargs 结合使用
          find /path/to/directory -name "*.txt" | xargs grep "search_term"
          
        1. 保存结果到文件
        • 将匹配的结果保存到文件中
          grep "search_term" filename.txt > results.txt
          
        1. 使用 -A-B 选项
        • 显示匹配行及其前后的上下文
          grep -A 2 "search_term" filename.txt  # 显示匹配行及后面2行
          grep -B 2 "search_term" filename.txt  # 显示匹配行及前面2行
          grep -C 2 "search_term" filename.txt  # 显示匹配行及前后各2行
          
        1. 排除特定文件
        • 在查找时排除特定文件
          grep --exclude="exclude.txt" "search_term" *.txt
          

用户管理类

以下是有关用户管理相关命令的详细说明,包括 useraddusermoduserdelpasswdgroupaddgroupdelsu 等常用命令的用法示例。

1. useradd / adduser

  • 用途:用于创建一个新的用户账户。
  • 基本用法
    useradd [选项] 用户名
    
  • 示例
    useradd newuser  # 创建名为 newuser 的新用户
    
  • 常用选项
    • -m:创建用户的主目录。
    • -s:指定用户的登录 Shell(例如:/bin/bash)。
    • -G:将用户添加到附加的组中。

2. usermod

  • 用途:用于修改已有用户的属性。
  • 基本用法
    usermod [选项] 用户名
    
  • 示例
    usermod -aG groupname newuser  # 将 newuser 添加到 groupname 组
    
  • 常用选项
    • -d:更改用户的主目录。
    • -s:更改用户的登录 Shell。
    • -L:锁定用户账户。
    • -U:解锁用户账户。

3. userdel / deluser

  • 用途:用于删除用户账户。
  • 基本用法
    userdel [选项] 用户名
    
  • 示例
    userdel newuser  # 删除名为 newuser 的用户
    
  • 常用选项
    • -r:同时删除用户的主目录及其邮件文件。

4. passwd

  • 用途:用于更改用户的密码。
  • 基本用法
    passwd [用户名]
    
  • 示例
    passwd newuser  # 修改 newuser 用户的密码
    
  • 注意:运行此命令需要管理员权限,且需要输入新密码。

5. groupadd / addgroup

  • 用途:用于创建新组。
  • 基本用法
    groupadd [选项] 组名
    
  • 示例
    groupadd newgroup  # 创建名为 newgroup 的新组
    
  • 常用选项
    • -g:指定组ID(GID)。

6. groupdel / delgroup

  • 用途:用于删除组。
  • 基本用法
    groupdel 组名
    
  • 示例
    groupdel newgroup  # 删除名为 newgroup 的组
    

7. su

  • 用途:用于切换用户身份,通常用于切换到超级用户(root)。
  • 基本用法
    su [选项] [用户名]
    
  • 示例
    su -  # 切换到 root 用户
    su newuser  # 切换到 newuser 用户
    
  • 常用选项
    • --l:模拟登录环境,切换到目标用户的环境变量。

总结

以上命令是 Linux 用户和组管理的基本工具。使用这些命令时,请根据实际情况小心操作,确保不会误删用户或组,尤其是在生产环境中。


操作权限类

以下是有关操作权限的常用命令的详细说明,包括 sudochmodchownchgrp 的用法示例。

1. sudo

  • 用途:用于以其他用户(通常是超级用户)身份执行命令。
  • 基本用法
    sudo [命令]
    
  • 示例
    sudo apt-get update  # 以超级用户身份更新软件包列表
    
  • 注意:使用 sudo 时,系统会要求输入当前用户的密码。

2. chmod

  • 用途:用于更改文件或目录的访问权限。
  • 基本用法
    chmod [选项] 权限 文件名
    
  • 示例
    chmod 755 filename.txt  # 设置文件为可读、可写、可执行(用户),可读、可执行(组和其他人)
    
  • 权限表示法
    • 数字法
      • r(读)= 4
      • w(写)= 2
      • x(执行)= 1
      • 例如:chmod 644 filename.txt表示用户可读写,组和其他人可读。
    • 符号法
      • u:用户(owner)
      • g:组(group)
      • o:其他人(others)
      • a:所有人(all)
      • 例如:chmod u+x filename.txt表示为用户添加执行权限。

3. chown

  • 用途:用于更改文件或目录的所有者和/或所属组。
  • 基本用法
    chown [选项] 用户名[:组名] 文件名
    
  • 示例
    chown newuser filename.txt  # 将文件的所有者更改为 newuser
    chown newuser:newgroup filename.txt  # 将文件的所有者更改为 newuser,组更改为 newgroup
    
  • 常用选项
    • -R:递归更改目录及其内容的所有者。

4. chgrp

  • 用途:用于更改文件或目录的所属组。
  • 基本用法
    chgrp [选项] 组名 文件名
    
  • 示例
    chgrp newgroup filename.txt  # 将文件的所属组更改为 newgroup
    
  • 常用选项
    • -R:递归更改目录及其内容的组。

总结

以上命令是 Linux 系统中用于管理文件和目录权限的重要工具。正确设置权限和所有权对于保护系统安全和确保文件访问控制至关重要。在执行这些命令时,请务必小心,以避免意外更改重要文件的权限或所有权。


网络操作类

以下是有关网络操作的常用命令的详细说明,包括 ifconfigping 的用法示例。

1. ifconfig

  • 用途:用于查看和配置网络接口的详细信息。

  • 基本用法

    ifconfig [网络接口]
    
  • 示例

    ifconfig              # 显示所有网络接口的配置
    ifconfig eth0         # 显示名为 eth0 的网络接口的配置
    
  • 常见输出信息

    • inet:IPv4 地址。
    • netmask:子网掩码。
    • broadcast:广播地址。
    • RX packetsTX packets:接收和发送的数据包数量。
  • 配置示例

    ifconfig eth0 up              # 启用网络接口 eth0
    ifconfig eth0 down            # 禁用网络接口 eth0
    ifconfig eth0 192.168.1.10    # 为 eth0 接口设置 IPv4 地址
    ifconfig eth0 netmask 255.255.255.0  # 设置子网掩码
    

注意:在一些现代 Linux 发行版中,ifconfig 命令已被 ip 命令取代,因此可以使用 ip addr 查看网络接口信息。

2. ping

  • 用途:用于测试网络连接,检查网络主机的可达性。

  • 基本用法

    ping [选项] 主机名或IP地址
    
  • 示例

    ping 8.8.8.8           # ping Google 的公共 DNS 服务器
    ping www.example.com    # ping 一个域名
    
  • 常用选项

    • -c [次数]:指定发送的请求数量。
    • -i [秒数]:指定发送每个请求之间的间隔时间。
    • -t [ttl]:指定生存时间(TTL)。
  • 示例

    ping -c 4 8.8.8.8       # 发送 4 个 ICMP 回显请求
    ping -i 2 8.8.8.8       # 每 2 秒发送一个请求
    
  • 输出信息

    • bytes:每个数据包的大小。
    • time:往返时间(RTT)。
    • ttl:生存时间,表示数据包在网络中可以经过的最多路由器数量。

总结

以上命令是 Linux 系统中用于网络操作的重要工具。ifconfig 主要用于查看和配置网络接口,而 ping 用于测试网络连接的可达性。正确使用这些命令可以帮助你有效地管理和排查网络问题。


控制终端类

clear 命令

  • 用途clear 命令用于清除当前终端屏幕上的所有内容,提供一个干净的工作界面。它不会影响任何正在运行的程序或进程,只是将终端显示的内容清除。

  • 基本用法

    clear
    
  • 示例

    clear  # 执行该命令后,终端屏幕将被清空
    
  • 效果:使用 clear 命令后,屏幕上的所有输出内容将被清除,光标将移动到屏幕的左上角。这在需要整理视图或准备继续工作时非常有用。

  • 注意:在某些终端中,你也可以使用快捷键 Ctrl + L 来达到同样的效果,清空屏幕并将光标移到顶部。

总结

clear 是一个简单而实用的命令,用于提高终端的可读性,特别是在长时间使用命令行时。清理终端屏幕有助于更好地查看输出和输入。


开关机命令

开关机命令

以下是关于 Linux 系统中常用的开关机命令的详细说明,包括 rebootpoweroff 的用法。

1. reboot

  • 用途reboot 命令用于重新启动计算机。
  • 基本用法
    reboot
    
  • 示例
    reboot  # 立即重新启动计算机
    
  • 注意事项
    • 需要超级用户权限(例如使用 sudo)才能执行该命令。
    • 在执行重新启动前,请确保所有重要工作已保存,以避免数据丢失。
  • 附加选项
    • 可以使用 reboot -f 强制重启,跳过正常的关机过程,但不建议使用此选项,因为可能导致数据丢失或文件系统损坏。

2. poweroff

  • 用途poweroff 命令用于安全关闭计算机。

  • 基本用法

    poweroff
    
  • 示例

    poweroff  # 立即关闭计算机
    
  • 注意事项

    • 需要超级用户权限(例如使用 sudo)才能执行该命令。
    • 在关闭计算机之前,请确保所有程序和文件已保存,以避免数据丢失。
  • 附加选项

    • 可以使用 poweroff -f 强制关闭计算机,同样不建议频繁使用该选项,以免造成潜在的数据损失。

总结

rebootpoweroff 是 Linux 系统中重要的管理命令。reboot 用于重新启动系统,而 poweroff 用于安全关闭系统。在使用这些命令时,请务必小心,以确保数据的安全和系统的稳定性。


Shell脚本简介

shell命令按一定语法组成的文件

作用

批处理文件/整合命令

  • 软件启动
  • 性能监控
  • 日志分析

Shell命令的本质

内置命令/外部命令

Shell脚本语言和C语言一样吗?

  • 编译型语言
  • 解释型语言

常用的Shell解释器有哪些?

/etc/shells

Shell启动方式

  • 当程序执行
  • 指定解释器运行
  • source和.

Shell脚本语法

定义变量

  • variable=value
  • variable=’value’
  • variable=”value”

使用变量

  • $variable
  • ${variable}

将命令的结果赋值给变量

  • variable=`command`
  • variable=$(command)

删除变量

在Linux中,unset 是一个用于删除变量或函数的命令。它可以在 shell 脚本或命令行中使用。具体用法如下:

用法

  1. 删除变量

    unset VAR_NAME
    

    这里 VAR_NAME 是你想要删除的变量名。执行此命令后,VAR_NAME 将不再存在。

  2. 删除数组元素
    如果你有一个数组,可以删除其特定元素:

    unset ARRAY_NAME[index]
    

    这将删除数组 ARRAY_NAME 在指定 index 位置的元素。

  3. 删除函数
    unset 还可以用于删除函数:

    unset -f FUNCTION_NAME
    

    这里 FUNCTION_NAME 是你想要删除的函数名。

示例

# 创建一个变量
my_var="Hello, World!"

# 显示变量
echo $my_var  # 输出: Hello, World!

# 删除变量
unset my_var

# 尝试显示变量
echo $my_var  # 不会有输出,因为变量已经被删除

注意事项

  • 使用 unset 删除的变量无法恢复,除非在该变量重新赋值之前再次定义。
  • 如果试图删除一个未定义的变量,unset 不会导致错误。

特殊变量

变量 含义
$0 当前脚本的文件名。
$n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同.
$? 上个命令的退出状态或者获取函数返回值。
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

下面是一个示例脚本,演示了这些特殊变量的用法:

#!/bin/bash

echo "脚本名称: $0"
echo "传递的参数个数: $#"
echo "所有参数: $*"
echo "参数列表: $@"
echo "上一个命令的退出状态: $?"
echo "当前进程 ID: $$"

# 演示参数
for arg in "$@"; do
    echo "参数: $arg"
done

将脚本内容保存为 test_script.sh,通过以下命令运行:

chmod +x test_script.sh
./test_script.sh arg1 arg2

读取从键盘输入的数据

在 Bash 脚本中,read 命令用于从标准输入(通常是键盘)读取数据并将其存储在变量中。read 是处理用户输入的常用方法,下面是对 read 命令的详细说明和示例。

语法

read [选项] [变量名...]
  • 变量名:一个或多个变量的名称,用于存储输入的数据。如果没有提供变量名,则输入的数据将存储在内置变量 REPLY 中。

常用选项

  • -p:在读取输入前提示用户。
  • -s:静默模式,不显示输入的内容(用于密码输入)。
  • -a:将输入的内容作为数组元素存储。
  • -d:设置输入结束的定界符,默认为换行符。

示例

  1. 基本用法
#!/bin/bash

echo "请输入你的名字:"
read name
echo "你好, $name!"
  1. 带提示的输入
#!/bin/bash

read -p "请输入你的年龄:" age
echo "你的年龄是 $age 岁。"
  1. 静默模式(密码输入)
#!/bin/bash

read -sp "请输入密码:" password
echo
echo "你输入的密码是:$password"
  1. 读取多个变量
#!/bin/bash

echo "请输入你的名字和年龄(用空格分隔):"
read name age
echo "你好, $name! 你的年龄是 $age 岁。"
  1. 读取到数组
#!/bin/bash

echo "请输入多个水果名称(用空格分隔):"
read -a fruits
echo "你输入的水果有:${fruits[@]}"

在 Bash 脚本中,`fruits[@]` 是用来引用数组 `fruits` 中的所有元素的语法。这种语法非常有用,特别是在需要处理或输出数组的所有值时。以下是关于 Bash 数组及如何使用 `fruits[@]` 的详细说明。

### Bash 数组的定义和使用

1. **定义数组**:
   数组可以通过将元素用空格分隔并赋值的方式定义。例如:

   ```bash
   fruits=("apple" "banana" "cherry")
   ```

2. **访问数组元素**:
   - 访问数组的单个元素可以使用索引,例如 `fruits[0]` 访问第一个元素。
   - 使用 `${fruits[@]}` 获取数组中的所有元素。

### 示例

以下是一个完整的示例,展示了如何定义数组、访问单个元素以及使用 `fruits[@]` 引用所有元素。

```bash
#!/bin/bash

# 定义数组
fruits=("apple" "banana" "cherry" "date")

# 输出单个元素
echo "第一个水果是:${fruits[0]}"  # 输出: apple

# 输出所有元素
echo "你输入的水果有:${fruits[@]}"

# 遍历数组
echo "遍历数组中的水果:"
for fruit in "${fruits[@]}"; do
    echo "$fruit"
done

# 数组的长度
echo "数组的长度是:${#fruits[@]}"  # 输出: 4
```

### 解释

- **`${fruits[@]}`**:引用数组中所有元素。在输出时,它会将数组中的每个元素用空格分隔。
- **`"${fruits[@]}"`**:在双引号中引用数组,可以正确处理包含空格的元素。
- **`${#fruits[@]}`**:返回数组的元素个数。

### 结论

使用数组可以有效地存储和操作多个值,`fruits[@]` 语法使得我们可以方便地处理整个数组的内容。希望这个解释和示例对您理解 Bash 数组的用法有所帮助!如有其他问题,请随时询问!

注意事项

  • 当使用 read 命令时,用户需要按 Enter 键来提交输入。
  • 如果输入的内容超过了变量的存储能力,只有部分内容会被存储,剩余的内容将被丢弃。
  • read 命令可以与其他命令组合使用,以实现更复杂的输入处理。

退出当前进程

在 Bash 脚本中,exit 命令用于终止当前脚本或进程的执行。它可以带一个可选的退出状态码,指示进程的终止状态。退出状态码通常用于表示脚本的执行结果,0 通常表示成功,而非零值表示某种错误或异常。

语法

exit [n]
  • n:可选的退出状态码。它是一个整数,范围通常为 0 到 255。默认情况下如果不指定,exit 将返回上一个命令的退出状态。

示例

  1. 简单的退出命令
#!/bin/bash

echo "脚本正在执行..."
# 这里可以进行一些操作
exit 0  # 正常退出,返回状态码 0
  1. 使用条件退出
#!/bin/bash

echo "请输入一个数字:"
read number

if [ "$number" -lt 0 ]; then
    echo "输入无效,必须是非负数字。"
    exit 1  # 非正常退出,返回状态码 1
fi

echo "你输入的数字是:$number"
exit 0  # 正常退出
  1. 在函数中使用 exit
#!/bin/bash

function my_function {
    echo "执行 my_function"
    exit 2  # 在函数中退出,返回状态码 2
}

my_function
echo "这行不会被执行"

检查退出状态

可以通过 $? 变量来检查上一个命令或脚本的退出状态。例如:

#!/bin/bash

./myscript.sh  # 执行另一个脚本

# 检查上一个命令的退出状态
if [ $? -eq 0 ]; then
    echo "脚本成功执行。"
else
    echo "脚本执行失败。"
fi

对整数进行数学运算

在 Bash 脚本中,可以使用双圆括号 (( )) 进行整数的数学运算。(( )) 是一个算术扩展的语法,允许你执行多种数学运算,如加法、减法、乘法、除法和取余等。使用这种方法时,Bash 会将表达式的结果作为整数进行计算。

语法

(( 表达式 ))

常见用法

  1. 基础运算
#!/bin/bash

# 定义两个整数
a=10
b=5

# 加法
sum=$(( a + b ))
echo "和: $sum"

# 减法
difference=$(( a - b ))
echo "差: $difference"

# 乘法
product=$(( a * b ))
echo "积: $product"

# 除法
quotient=$(( a / b ))
echo "商: $quotient"

# 取余
remainder=$(( a % b ))
echo "余数: $remainder"
  1. 递增和递减

可以使用 ++-- 运算符进行递增和递减操作:

#!/bin/bash

num=5

# 递增
(( num++ ))
echo "递增后: $num"  # 输出 6

# 递减
(( num-- ))
echo "递减后: $num"  # 输出 5
  1. 条件判断

可以在 (( )) 语句中使用布尔运算符进行条件判断:

#!/bin/bash

num=10

if (( num > 5 )); then
    echo "$num 大于 5"
else
    echo "$num 小于或等于 5"
fi
  1. 复合运算

可以在一个表达式中进行多个运算:

#!/bin/bash

a=10
b=20
c=30

result=$(( a + b * c ))  # 先计算 b * c,再加上 a
echo "结果: $result"  # 输出: 610

注意事项

  • (( )) 中,不需要使用 $ 来引用变量,直接使用变量名即可。
  • (( )) 支持大多数常见的数学运算符,包括:+, -, *, /, %, **(幂运算),以及比较运算符如 ==, !=, <, >, <=, >=

逻辑与/或

command1 && command2

# 示例
mkdir my_directory && cd my_directory
# 如果创建目录成功,则进入该目录
command1 || command2

# 示例
cd my_directory || echo "目录不存在,无法进入"
# 如果进入目录失败,则输出提示信息

检测某个条件是否成立

test expression 和 [ expression ]

选 项 作 用
-eq 判断数值是否相等
-ne 判断数值是否不相等
-gt 判断数值是否大于
-lt 判断数值是否小于
-ge 判断数值是否大于等于
-le 判断数值是否小于到等于
-z str 判断字符串 str 是否为空
-n str 判断字符串str是否为非空
=和== 判断字符串str是否相等
-d filename 判断文件是否存在,并且是否为目录文件。
-f filename 判断文件是否存在,井且是否为普通文件。

在 Bash 脚本中,test 命令和方括号 [ 是用于进行条件测试的两种方法。它们的功能非常相似,通常可以互换使用,主要用于检查文件或字符串的状态以及数值的比较。

  1. test 命令

test 是一个内置命令,用于评估条件表达式。其基本语法如下:

test expression

例如,可以使用 test 来检查文件是否存在、比较字符串、比较数字等。

示例:

  • 检查文件是否存在:
if test -f "myfile.txt"; then
    echo "文件存在"
else
    echo "文件不存在"
fi
  • 比较两个数字:
a=5
b=10
if test $a -lt $b; then
    echo "$a 小于 $b"
fi
  1. 方括号 [

方括号 [test 命令的另一种形式,它的使用也非常普遍。语法如下:

[ expression ]

在使用方括号时,务必注意在方括号与条件表达式之间和方括号后面留有空格。

示例:

  • 检查文件是否存在:
if [ -f "myfile.txt" ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi
  • 比较两个字符串:
str1="hello"
str2="world"
if [ "$str1" != "$str2" ]; then
    echo "字符串不相等"
fi
  1. 常用条件表达式

test[ 中可以使用的条件表达式包括但不限于:

  • 文件测试

    • -e file:如果文件存在则为真。
    • -d directory:如果目录存在则为真。
    • -f file:如果文件存在且是普通文件则为真。
    • -r file:如果文件可读则为真。
    • -w file:如果文件可写则为真。
    • -x file:如果文件可执行则为真。
  • 字符串测试

    • -z string:如果字符串为空则为真。
    • -n string:如果字符串非空则为真。
    • string1 = string2:如果两个字符串相等则为真。
    • string1 != string2:如果两个字符串不相等则为真。
  • 整数比较

    • int1 -eq int2:如果两个整数相等则为真。
    • int1 -ne int2:如果两个整数不相等则为真。
    • int1 -lt int2:如果 int1 小于 int2 则为真。
    • int1 -le int2:如果 int1 小于或等于 int2 则为真。
    • int1 -gt int2:如果 int1 大于 int2 则为真。
    • int1 -ge int2:如果 int1 大于或等于 int2 则为真。
  1. 结合示例

结合 test[ 的使用示例:

#!/bin/bash

file="example.txt"

# 使用 test 命令
if test -e "$file"; then
    echo "$file 存在"
else
    echo "$file 不存在"
fi

# 使用方括号
if [ -f "$file" ]; then
    echo "$file 是一个普通文件"
else
    echo "$file 不是一个普通文件"
fi

管道

在 Bash 脚本和命令行中,管道(|)是一种非常有用的功能,它允许你将一个命令的输出直接传递给另一个命令作为输入。这样可以简化复杂的数据处理过程,并使得命令组合更为灵活和强大。

基本语法

command1 | command2

在这个语法中,command1 的标准输出(stdout)将作为 command2 的标准输入(stdin)。

示例

  1. 简单的示例
ls -l | less

在这个示例中,ls -l 命令列出当前目录中的文件和目录的详细信息,然后通过管道传递给 less,使得输出可以分页浏览。

  1. 组合多个命令
cat file.txt | grep "pattern" | sort

这里,cat file.txt 读取文件内容,grep "pattern" 过滤包含指定模式的行,最终 sort 命令对结果进行排序。整个过程可以链式组合起来,提高效率。

  1. 统计文件中的单词数
cat file.txt | wc -w

这个命令组合首先读取 file.txt 的内容,然后通过 wc -w 统计其中的单词数。

  1. 查找进程并排序
ps aux | grep "process_name" | sort -nrk 3

在这个示例中,ps aux 列出所有正在运行的进程,grep "process_name" 过滤出包含指定进程名称的行,sort -nrk 3 根据 CPU 使用率降序排序。

注意事项

  • 管道的使用:管道只能传递标准输出,不能传递标准错误(stderr)。如果需要将错误输出重定向,可以使用 2>&1 将标准错误合并到标准输出中,例如:

    command1 2>&1 | command2
    
  • 性能考虑:使用管道可能会引入额外的开销,尤其是在处理大量数据时。为了优化性能,最好根据具体情况评估是否使用管道。

  • 命令的相容性:确保通过管道连接的命令能够接受并正确处理来自前一个命令的输入数据格式。

结论

管道是 Bash 中一个强大的特性,使得用户能够高效地组合多个命令进行数据处理。通过将命令连接在一起,你能够实现更复杂的操作,并简化脚本的编写。如果您有更多问题或需要进一步的示例,请随时询问!


if语句

if  condition
then
   statement(s)
fi


#!/bin/bash

value=10

if [ $value -gt 5 ]; then
    echo "$value 大于 5"
fi

if else 语句

if  condition
then
    statement1
else
    statement2
fi


#!/bin/bash

value=3

if [ $value -gt 5 ]; then
    echo "$value 大于 5"
else
    echo "$value 小于或等于 5"
fi

if elif else 语句

if  condition1
then
    statement1
elif condition2
then
    statement2
……
else
    statementn
fi


#!/bin/bash

value=5

if [ $value -gt 5 ]; then
    echo "$value 大于 5"
elif [ $value -eq 5 ]; then
    echo "$value 等于 5"
else
    echo "$value 小于 5"
fi

case in 语句

通过 case 语句,可以根据变量的值匹配多个模式,并相应地执行不同的代码块。下面我将详细解释其结构和用法,并提供一些示例。

结构解析

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ...
    *)
        statementn
esac
  • expression:要匹配的变量或表达式。
  • **pattern1, pattern2, …**:可能的匹配模式,可以使用通配符(如 *?)进行模式匹配。
  • **statement1, statement2, …**:与每个模式匹配时执行的命令。
  • **;;**:在每个模式的末尾,用于表示该模式的结束。
  • *****:表示所有未匹配到的情况,即默认情况。
  • **esac**:是 case 语句的结束标志,相当于 case 的反向拼写。

示例

下面是一个完整的 case 语句示例:

示例 1:根据输入的数字打印星期几

#!/bin/bash

read -p "请输入一个数字(1-7): " day

case $day in
    1)
        echo "星期一"
        ;;
    2)
        echo "星期二"
        ;;
    3)
        echo "星期三"
        ;;
    4)
        echo "星期四"
        ;;
    5)
        echo "星期五"
        ;;
    6)
        echo "星期六"
        ;;
    7)
        echo "星期天"
        ;;
    *)
        echo "无效输入,请输入 1 到 7 之间的数字。"
esac

在这个示例中,用户输入一个数字,case 语句根据输入的数字输出对应的星期几。如果输入的数字不在 1 到 7 之间,则输出无效提示。

示例 2:处理不同类型的文件后缀

#!/bin/bash

filename="example.txt"

case $filename in
    *.txt)
        echo "这是一个文本文件"
        ;;
    *.jpg | *.jpeg)
        echo "这是一个 JPEG 图片文件"
        ;;
    *.png)
        echo "这是一个 PNG 图片文件"
        ;;
    *.sh)
        echo "这是一个 Shell 脚本文件"
        ;;
    *)
        echo "未知文件类型"
esac

在这个示例中,case 语句根据文件的后缀输出对应的文件类型。如果没有匹配到任何已知的后缀,则输出“未知文件类型”。

总结

case 语句在处理多个条件时更加清晰和简洁,特别是当多个模式需要匹配时。它避免了嵌套的 if 语句,使得代码更易于阅读和维护。

如果您有更多问题或需要更具体的示例,请随时询问!


for in 循环

for 循环在 Bash 脚本中是一种常用的迭代结构,用于遍历一组值或执行特定的操作。

基本语法

for variable in value_list
do
    statements
done
  • variable:在每次迭代中,variable 将被赋值为 value_list 中的当前项。
  • value_list:可以是具体值的列表、取值范围、命令的执行结果、Shell 通配符匹配的文件名或特殊变量。
  • statements:在每次迭代中要执行的命令。
  1. 直接给出具体的值

可以直接在 value_list 中列出具体的值。

示例:

#!/bin/bash

for fruit in apple banana orange
do
    echo "水果: $fruit"
done

输出:

水果: apple
水果: banana
水果: orange
  1. 给出一个取值范围

可以使用 Bash 的 {} 语法生成一系列数字。

示例:

#!/bin/bash

for i in {1..5}
do
    echo "数字: $i"
done

输出:

数字: 1
数字: 2
数字: 3
数字: 4
数字: 5
  1. 使用命令的执行结果

可以将 for 循环与命令结合,处理命令的输出结果。

示例:

#!/bin/bash

for file in $(ls)
do
    echo "文件: $file"
done

在这个示例中,ls 命令的输出会被 for 循环逐一处理。

  1. 使用 Shell 通配符

可以结合 Shell 通配符来遍历匹配的文件。

示例:

#!/bin/bash

for file in *.sh
do
    echo "Shell 脚本文件: $file"
done

这个示例会输出当前目录下所有以 .sh 结尾的文件。

  1. 使用特殊变量

Bash 中的一些特殊变量可以用于 for 循环。

示例:

#!/bin/bash

for arg in "$@"
do
    echo "参数: $arg"
done

在这个示例中,"$@" 表示传递给脚本的所有命令行参数,每个参数都会被逐一处理。

总结

for 循环是一种非常灵活且强大的结构,适用于多种情况。通过不同的方式生成 value_list,使得 for 循环能够处理各种类型的数据和文件。

如果您有更多问题或需要更具体的示例,请随时询问!


while 循环

while 循环是 Bash 脚本中用于重复执行一组语句的控制结构,直到给定的条件不再满足为止。

基本语法

while condition
do
    statements
done
  • condition:这是一个测试条件,只要条件为真(即返回值为 0),就会继续执行 do 后面的语句。
  • statements:在条件为真时要执行的命令或操作。

示例 1:简单的计数器

下面的示例演示了如何使用 while 循环进行简单的计数:

#!/bin/bash

count=1

while [ $count -le 5 ]
do
    echo "计数: $count"
    ((count++))  # 自增操作
done

在这个示例中,count 从 1 开始,每次循环打印当前的计数,然后将 count 加 1,直到它大于 5 为止。

示例 2:读取文件行

while 循环可以用于逐行读取文件内容:

#!/bin/bash

filename="example.txt"

while read -r line
do
    echo "读取的行: $line"
done < "$filename"

在这个示例中,while 循环逐行读取 example.txt 文件中的内容,并打印每一行。

示例 3:用户输入

可以使用 while 循环处理用户输入,直到满足特定条件:

#!/bin/bash

password="secret"
input=""

while [ "$input" != "$password" ]
do
    read -s -p "请输入密码: " input
    echo  # 打印换行
    if [ "$input" == "$password" ]; then
        echo "密码正确!"
    else
        echo "密码错误,请重试。"
    fi
done

在这个示例中,用户被要求输入密码,直到输入正确为止。

示例 4:无限循环

如果没有适当的条件,while 循环可以创建无限循环,通常在需要时使用 break 语句退出:

#!/bin/bash

while true
do
    read -p "输入 'exit' 退出: " input
    if [ "$input" == "exit" ]; then
        echo "退出循环。"
        break
    else
        echo "你输入的是: $input"
    fi
done

在这个示例中,循环将不断询问用户输入,直到用户输入 “exit” 为止。


函数

在 Bash 脚本中,函数是一种封装代码块的方式,可以方便地组织和重用代码。函数可以接受参数,执行一系列命令,并返回状态值。

函数的基本语法

function name() {
    statements
    [return value]
}
  • function name:定义函数的名称,可以使用 function 关键字,也可以直接使用 name() 的形式。
  • statements:函数体,包含要执行的命令。
  • **[return value]**:可选的返回值,函数可以通过 return 语句返回一个整数值(状态码),通常返回 0 表示成功,非 0 表示失败。

示例 1:基本函数

下面是一个简单的函数示例,打印问候语:

#!/bin/bash

function greet() {
    echo "你好,$1!"  # $1 是第一个参数
}

greet "Alice"  # 调用函数并传递参数

在这个示例中,函数 greet 接受一个参数并打印问候语。

示例 2:返回值

可以使用 return 语句返回状态码:

#!/bin/bash

function add() {
    local sum=$(( $1 + $2 ))  # 计算两个参数的和
    return $sum  # 返回状态码(0-255)
}

add 5 3
result=$?  # 获取上一个命令的返回值
echo "结果: $result"

在这个示例中,函数 add 返回两个参数之和的值,但实际返回值只能是 0 到 255 之间的整数。在这种情况下,使用 echo 语句输出结果更为合适。

示例 3:使用 echo 来返回值

通常,Bash 函数使用 echo 输出结果,而不是使用 return 返回值:

#!/bin/bash

function multiply() {
    local product=$(( $1 * $2 ))
    echo $product  # 输出结果
}

result=$(multiply 4 5)  # 使用命令替换获取结果
echo "乘积: $result"

在这个示例中,函数 multiply 计算乘积并使用 echo 输出结果。使用 $(...) 语法可以捕获输出结果。

示例 4:函数参数

函数可以接受多个参数,可以使用 $1$2 等来访问它们,$@ 用于访问所有参数:

#!/bin/bash

function display_params() {
    echo "总参数数量: $#"
    echo "所有参数: $@"
}

display_params "参数1" "参数2" "参数3"

在这个示例中,display_params 函数打印传递给它的参数数量和所有参数。


Linux环境变量

环境变量是操作系统中用于配置和控制运行环境的重要机制。在 Linux 中,环境变量对系统和用户的操作有着重要影响。以下是有关环境变量的详细信息,以及全局变量与环境变量的区别、Shell 配置文件的作用和执行顺序等内容。

为什么需要环境变量?

  1. 配置和控制环境:环境变量存储了系统和应用程序需要的配置信息,例如路径、用户信息、语言设置等。
  2. 共享信息:环境变量可以在系统的不同进程间共享,从而确保应用程序可以访问相同的配置信息。
  3. 动态调整:通过修改环境变量,可以动态改变程序的行为,而无需修改代码或重启系统。

全局变量 VS 环境变量

  • 全局变量

    • 仅在当前 Shell 进程及其子进程中可用。
    • 通过直接定义(如 var=value)进行设置。
    • 例如:
      my_var="Hello, World!"
      
  • 环境变量

    • 在当前 Shell 进程及所有子进程中可用。
    • 通过 export 命令进行设置,使变量成为环境变量。
    • 例如:
      export my_var="Hello, World!"
      

Shell 配置文件

与 Bash Shell 有关的配置文件主要有:

  1. /etc/profile:系统范围内的配置文件,所有用户登录时都会读取。
  2. ~/.bash_profile:用户登录时执行的配置文件,优先级高于 ~/.bash_login~/.profile
  3. ~/.bash_login:如果没有 ~/.bash_profile,则执行此文件。
  4. ~/.profile:与 ~/.bash_profile~/.bash_login 类似,作为最后的选项执行。
  5. ~/.bashrc:非登录交互式 Shell 启动时读取的配置文件,通常用于定义函数和别名。
  6. /etc/bashrc:系统范围内的 bashrc,为所有用户的非登录 Shell 提供配置。
  7. /etc/bash.bashrc:类似于 /etc/bashrc,用于全局配置。
  8. /etc/profile.d/*.sh:包含的脚本文件,在 /etc/profile 中被调用,用于设置系统范围的环境变量。

Shell 执行顺序

当用户登录时,Shell 的执行顺序如下:

  1. /etc/profile 被执行。
  2. 然后根据用户的设置依次执行以下文件:
    • ~/.bash_profile
    • ~/.bash_login(如果没有 ~/.bash_profile
    • ~/.profile(如果没有前面的两个文件)

修改配置文件

  • 全部用户、全部进程共享:可以修改 /etc/bash.bashrc/etc/profile
  • 一个用户、全部进程共享:可以修改 ~/.bashrc~/.bash_profile

Shell 启动方式对变量的影响

  • 子Shell进程中执行
    • 通过 /bin/bash./script.sh 启动新的 Shell,这会创建一个新的子进程,子进程不会影响父进程的变量。
  • 当前进程中执行
    • 使用 source script.sh. script.sh 可以在当前 Shell 中执行脚本,变量的更改会影响当前进程。

总结

环境变量在 Linux 系统中起着至关重要的作用,能够帮助配置和控制运行环境。通过理解全局变量与环境变量的区别,以及 Shell 配置文件的作用和执行顺序,用户可以更灵活地管理系统环境。


如何构建一个deb软件安装包

Linux软件包的组成

文件类型 保存目录
普通程序 /usr/bin
root权限程序 /usr/sbin
程序配置文件 /etc
日志文件 /var/log
文档文件 /usr/share/doc

deb包

Debian、Ubuntu、Deepin等Linux发行版的软件安装包。

rpm包

RedHat,Fedora,Centos等Linux发行版的软件安装包。

dpkg工具

底层的包管理工具,主要用于对已下载到本地和已经安装的deb包进行管理

常用命令

安装软件:dpkg -i xxxx.deb
查看安装目录:dpkg -L xxxx
显示版本:dpkg -l xxxx
详细信息:dpkg -s xxxx
罗列内容:dpkg -c xxxx.deb
卸载软件:dpkg -r xxxx

文件结构分析

  • DEBIAN目录:

    • control文件:

      • Package:软件名称

      • Version:版本

      • Section:软件类别

      • Priority:对系统的重要性

      • Architecture:支持的硬件平台

      • Maintainer:软件包的维护者

      • Description:对软件的描述

    • preinst文件 : 安装之前执行的shell脚本

    • postinst文件 : 安装之后执行的shell脚本

    • prerm文件:卸载之前执行的shell脚本

    • postrm文件: 卸载之后执行的shell脚本

    • copyright文件:版权声明

    • changlog文件: 修改记录

  • 软件具体安装目录: 视实际需求

0. 环境准备

确保您已经安装了 sudoapt 工具。您可以使用以下命令更新您的软件包列表并安装所需的工具:

sudo apt update
sudo apt install dos2unix

1. 进入工作目录

首先,确保您在一个合适的工作目录中。例如,我们使用 /home/jungle/mywork 作为工作目录:

cd /home/jungle/mywork/

2. 上传脚本文件

使用 rz 命令从本地上传 build_deb.sh 脚本。确保脚本文件存在,并使用以下命令查看该目录内容:

#!/bin/bash

version="0.1.2"
author="Emdebfire"
package_name="$2"
package_dir="$1"

mkdir -p ./$package_dir/DEBIAN/

cat <<EOF > ./$package_dir/DEBIAN/changelog
AUTHOR:$author
VERSION:$version 
DATE:$(date -R)
EOF


cat <<EOF > ./$package_dir/DEBIAN/copyright
******************************************************************
  * @attention
  *
  * 实验平台:野火  i.MX6ULL开发板 
  * 公司    :http://www.embedfire.com
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
* * ******************************************************************
EOF

cat <<EOF > ./$package_dir/DEBIAN/control
Source:embedfire
Package:${package_name%.*}
Version:$version
Section: debug
Priority: optional
Architecture: amd64
Maintainer:$author 
Description: Embedfire Tools
EOF

cat <<EOF > ./$package_dir/DEBIAN/postinst
#!/bin/sh
echo "******************************************************************"
echo "welcome to use $package_name!"
echo "******************************************************************"
EOF

sudo chmod 775 ./$package_dir/DEBIAN/postinst

dpkg -b $package_dir $package_name

3. 修改脚本权限

build_deb.sh 脚本设置为可执行:

sudo chmod +x build_deb.sh

4. 创建目标目录

创建一个名为 helloworld 的目录,用于存放打包内容:

sudo mkdir helloworld

5. 创建文件结构

helloworld 目录下,创建一个 usr/bin 目录以存放可执行文件:

sudo mkdir -p helloworld/usr/bin

6. 创建可执行脚本

使用 vim 编辑器创建一个脚本文件 helloworld.sh,并写入简单的输出内容:

sudo vim helloworld/usr/bin/helloworld.sh

在文件中添加以下内容:

#!/bin/bash
echo "hello, world!!"

然后设置该脚本为可执行:

sudo chmod 755 helloworld/usr/bin/helloworld.sh

7. 检查文件结构

确认 helloworld 目录下的文件结构:

ll helloworld/usr/bin/

确保 helloworld.sh 文件存在。

8. 运行打包脚本

使用 build_deb.sh 脚本来构建 helloworld 包。运行以下命令:

sudo ./build_deb.sh helloworld helloworld.deb

如果出现“无法执行”错误,请确保脚本是 Unix 格式。您可以使用 dos2unix 命令转化格式:

dos2unix ./build_deb.sh

然后再次运行打包命令。

9. 安装软件包

构建成功后,使用 dpkg 命令安装生成的 .deb 包:

sudo dpkg -i helloworld.deb

10. 运行安装的程序

安装完成后,尝试运行 helloworld.sh 脚本:

helloworld.sh

如果输出 hello, world!!,则表示您的软件包已成功安装并能正常运行。


apt命令和apt-get命令

在 Debian、Ubuntu 及其衍生发行版中,aptapt-get 是用于包管理的工具。虽然它们的功能相似,但有一些关键的区别和优势。以下是对这两个命令的比较和说明。

1. apt命令

  • 概念apt 是一个较新的包管理工具,旨在整合 apt-getapt-cache 的功能,为用户提供更简单、更一致的命令行界面。

  • 用户友好apt 提供了更友好的默认输出,如进度条、升级提示等,使用户在安装和管理软件包时体验更佳。

  • 主要命令

    • apt update:更新软件包索引。
    • apt upgrade:升级所有已安装的软件包。
    • apt install <package>:安装指定的软件包。
    • apt remove <package>:卸载指定的软件包。
    • apt search <package>:搜索软件包。

2. apt-get命令

  • 概念apt-get 是一个更早期的包管理工具,用于处理软件包的安装、升级和删除。它的功能相对分散,操作较为直接,但输出信息较为原始。

  • 使用场景:对于自动化脚本或需要更细粒度控制的场景,apt-get 依然被广泛使用。

  • 主要命令

    • apt-get update:更新软件包索引。
    • apt-get upgrade:升级所有已安装的软件包。
    • apt-get install <package>:安装指定的软件包。
    • apt-get remove <package>:卸载指定的软件包。

3. 主要区别

  • 界面友好性apt 提供更好的用户体验,通常会显示进度条和更清晰的提示信息,而 apt-get 输出较为简单。

  • 功能集成apt 整合了 apt-getapt-cache 的一些功能,简化了命令行操作。

  • 命令选项apt-get 提供了许多高级选项,适合需要详细控制的高级用户,apt 则更适合日常使用。

4. 总结

使用 apt 命令可以更方便地管理软件包,适合大多数用户的日常需求。而对于更复杂的任务或脚本,仍然可以使用 apt-get。建议新手用户从 apt 开始使用,根据需要逐步深入学习 apt-get 的功能。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jungle8884@163.com

×

喜欢就点赞,疼爱就打赏