网站首页 包含标签 Linux教程 的所有文章

  • linux启动流程步骤详解

    Linux是怎么启动的? 几乎每个软件工程师都用过 Linux,但并不是每个人都知道它的启动过程,让我们深入了解一下。 下图给我们展示了具体步骤。 第1步 当我们打开电源时,BIOS(基本输入/输出系统,Basic Input/Output System)或 UEFI(统一可扩展固件接口,Unified Extensible Firmware Interface)固件会从非易失性内存中加载,并执行 POST(开机自检,Power On Self Test)。 第2步 BIOS/UEFI 检测连接到系统的设备,包括 CPU、内存和存储设备。 第3步 选择一个启动设备来启动操作系统。 可以是硬盘、网络服务器或 CD ROM。 第4步 BIOS/UEFI 运行引导加载器 (GRUB),它提供了一个选择操作系统或内核功能的菜单。 第5步 内核准备就绪后,我们现在切换到用户空间。 内核启动 systemd 作为第一个用户空间进程,负责管理进程和服务、探测所有剩余硬件、挂载文件系统并运行桌面环境。 第6步 系统启动时,systemd 默认激活 default.target 单元。 同时还会执行其他分析单元。 第7步 系统运行一组启动脚本并配置环境。 第8步 用户将看到一个登录窗口。 系统现已准备就绪。 ...

    2023-12-22 229
  • Linux实时信息与状态监控脚本

    最近遇到一台无法连接互联网并且没有集成状态监控的Linux服务器,没办法整体观测服务器状态去排查问题。 所以写了下面这个这个脚本来监控,声明这个脚本没办法适配所有Linux服务器。 思路如下,针对自己的服务器情况有需要自己改下再用。 也能在拿到一台新机器时,一键观测下服务器状态。 先看代码 请注意将脚本中的eth0替换为你实际使用的网络接口(如enp0s3,wlan0,ens33等)。 #!/bin/bash # 获取服务器基本信息 hostname=$(hostname) ip_address=$(hostname -I | awk '{print $1}') os=$(lsb_release -ds) kernel=$(uname -r) uptime=$(uptime -p) # 监控循环 while true; do # 获取CPU信息 cpu_model=$(cat /proc/cpuinfo | grep "model name" | head -n1 | awk -F': ' '{print $2}') cpu_cores=$(cat /proc/cpuinfo | grep "model name" | wc -l) # 获取内存信息(加入单位) memory_total=$(free -h | awk 'NR==2{print $2}') memory_used=$(free -h | awk 'NR==2{print $3}') memory_free=$(free -h | awk 'NR==2{print $4}') memory_available=$(free -h | awk 'NR==2{print $7}') # 获取磁盘使用情况 disk_total=$(df -h --output=size / | awk 'NR==2{print $1}') disk_used=$(df -h --output=used / | awk 'NR==2{print $1}') disk_free=$(df -h --output=avail / | awk 'NR==2{print $1}') # 使用 top 命令获取 CPU 使用率 cpu_usage=$(top -b -n 1 | grep "%Cpu(s):" | awk '{printf "%.2f%%", 100-$8}') # 输出监控信息 clear echo "服务器信息:" echo "主机名:$hostname" echo "IP地址:$ip_address" echo "操作系统:$os" echo "内核版本:$kernel" echo "运行时间:$uptime" echo "--------------------------------------" echo "CPU信息:" echo "型号:$cpu_model" echo "核心数:$cpu_cores" echo "CPU使用率:$cpu_usage" echo "--------------------------------------" echo "内存信息:" echo "总量:$memory_total" echo "已使用:$memory_used" echo "可用:$memory_available" echo "--------------------------------------" echo "磁盘信息:" echo "总量:$disk_total" echo "已使用:$disk_used" echo "可用:$disk_free" # 每 3 秒刷新一次 sleep 3 done   运行结果 ...

    2023-12-14 224
  • Linux系统安装软件四种方式

    Linux系统安装软件四种方式: 绿色安装 yum安装 rpm安装 源码安装 1. 绿色安装 这种方式最简便,一般提供Compressed Archive压缩文档包,如Java软件的压缩文档包,只需要解压、设置环境变量即可直接使用。 # 下载软件 https://www.oracle.com/java/technologies/downloads/ # 新建java软件存放路径 mkdir /opt/java # 解压 tar -xvf jdk-21_linux-x64_bin.tar.gz -C /opt/java # 设置环境变量 vim /etc/profile.d/java.sh JAVA_HOME=/opt/java/jdk-21.0.1/ CLASSPATH=.:$JAVA_HOME/lib PATH=JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH # 加载环境变量 source /etc/profile.d/java.sh # 检验java环境是否配置好 java 2. yum安装 前提条件是有网络 需要安装的软件及版本,yum源里刚好有。 # 搜索redis源 yum search redis # 查看redis详细信息 yum info redis # 安装redis软件 yum -y install redis # 查看redis状态 systemctl status redis # 设置开机自启 systemctl enable redis # 启动redis服务 systemctl start redis 3. rpm安装 需要的软件及版本,只提供了rpm包 3.1 rpm常用命令 # 安装一个包 rpm -ivh 包名 # 升级一个包 rpm -Uvh 包名 # 查询包是否安装 rpm -q 包名 # 查询安装包详情信息 rpm -qi 包名 # 列出服务器上的一个文件属于哪个rpm包 rpm -qf 文件名 # 列出所有安装的rpm包 rpm -qa # 卸载包 rpm -e 包名 [root@centos ~]# rpm --help Usage: rpm [OPTION...] Query/Verify package selection options: -a, --all query/verify all packages -f, --file query/verify package(s) owning file -g, --group query/verify package(s) in group -p, --package query/verify a package file --pkgid query/verify package(s) with package identifier --hdrid query/verify package(s) with header identifier --triggeredby query the package(s) triggered by the package --whatrequires query/verify the package(s) which require a dependency --whatprovides query/verify the package(s) which provide a dependency --nomanifest do not process non-package files as manifests Query options (with -q or --query): -c, --configfiles list all configuration files -d, --docfiles list all documentation files -L, --licensefiles list all license files --dump dump basic file information -l, --list list files in package --queryformat=QUERYFORMAT use the following query format -s, --state display the states of the listed files Verify options (with -V or --verify): --nofiledigest don't verify digest of files --nofiles don't verify files in package --nodeps don't verify package dependencies --noscript don't execute verify script(s) Install/Upgrade/Erase options: --allfiles install all files, even configurations which might otherwise be skipped --allmatches remove all packages which match <package> (normally an error is generated if <package> specified multiple packages) --badreloc relocate files in non-relocatable package -e, --erase=<package>+ erase (uninstall) package --excludedocs do not install documentation --excludepath=<path> skip files with leading component <path> --force short hand for --replacepkgs --replacefiles -F, --freshen=<packagefile>+ upgrade package(s) if already installed -h, --hash print hash marks as package installs (good with -v) --ignorearch don't verify package architecture --ignoreos don't verify package operating system --ignoresize don't check disk space before installing -i, --install install package(s) --justdb update the database, but do not modify the filesystem --nodeps do not verify package dependencies --nofiledigest don't verify digest of files --nocontexts don't install file security contexts --noorder do not reorder package installation to satisfy dependencies --noscripts do not execute package scriptlet(s) --notriggers do not execute any scriptlet(s) triggered by this package --nocollections do not perform any collection actions --oldpackage upgrade to an old version of the package (--force on upgrades does this automatically) --percent print percentages as package installs --prefix=<dir> relocate the package to <dir>, if relocatable --relocate=<old>=<new> relocate files from path <old> to <new> --replacefiles ignore file conflicts between packages --replacepkgs reinstall if the package is already present --test don't install, but tell if it would work or not -U, --upgrade=<packagefile>+ upgrade package(s) --reinstall=<packagefile>+ reinstall package(s) Common options for all rpm modes and executables: -D, --define='MACRO EXPR' define MACRO with value EXPR --undefine=MACRO undefine MACRO -E, --eval='EXPR' print macro expansion of EXPR --macros=<FILE:...> read <FILE:...> instead of default file(s) --noplugins don't enable any plugins --nodigest don't verify package digest(s) --nosignature don't verify package signature(s) --rcfile=<FILE:...> read <FILE:...> instead of default file(s) -r, --root=ROOT use ROOT as top level directory (default: "/") --dbpath=DIRECTORY use database in DIRECTORY --querytags display known query tags --showrc display final rpmrc and macro configuration --quiet provide less detailed output -v, --verbose provide more detailed output --version print the version of rpm being used Options implemented via popt alias/exec: --scripts list install/erase scriptlets from package(s) --setperms set permissions of files in a package --setugids set user/group ownership of files in a package --setcaps set capabilities of files in a package --restore restore file/directory permissions --conflicts list capabilities this package conflicts with --obsoletes list other packages removed by installing this package --provides list capabilities that this package provides --requires list capabilities required by package(s) --info list descriptive information from package(s) --changelog list change logs for this package --xml list metadata in xml --triggers list trigger scriptlets from package(s) --last list package(s) by install time, most recent first --dupes list duplicated packages --filesbypkg list all files from each package --fileclass list file names with classes --filecolor list file names with colors --fscontext list file names with security context from file system --fileprovide list file names with provides --filerequire list file names with requires --filecaps list file names with POSIX1.e capabilities Help options: -?, --help Show this help message --usage Display brief usage message # 安装java的jdk rpm -ivh jdk-21_linux-x64_bin.rpm # 查看安装的jdk rpm -qa | grep "jdk" # 忽略依赖关系强制卸载jdk rpm -evh --nodeps jdk-21-21.0.1-12.x86_64 4. 源码安装 软件给的是C语言的源代码,需要编译成二进制,再安装。 Linux下安装软件,大型软件docker、oracle一般放/opt目录下;/usr目录一般由软件包管理器(yum、apt)来管理;/usr/local是用户级程序目录,/usr/local/src是用户级存放目录。 以安装nginx为例 # 安装依赖 yum install -y gcc pcre-devel openssl-devel 4.1 执行configure脚本 ./configure [option…] 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文件生成Makefile 检查依赖到的外部环境,如依赖的软件包 tar -xvf nginx-1.25.3.tar.gz cd nginx-1.25.3 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=nginx --group=nginx 选项说明: 选项 说明 –prefix=/usr/local/nginx 编译安装目录。如果没有指定,默认为 /usr/local/程序名 –user=nginx 所属用户nginx –group=nginx 所属组nginx –with-http_stub_status_module 该模块提供nginx的基本状态信息 –with-http_ssl_module 支持HTTPS 4.2 编译、安装 # 编译 make make 根据Makefile文件,会检测依赖的环境,进行构建应用程序 4.3 安装 # 安装 make install make install 复制文件到相应路径 4.4 操作nginx # 启动服务 /usr/local/nginx/sbin/nginx # 重新加载配置文件 /usr/local/nginx/sbin/nginx -s reload # 设置软连接 ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 强制停止 nginx -s stop # 安全退出 nginx -s quit # 查看进程 ps -ef | grep nginx # 测试 curl 127.0.0.1 4.5 创建服务器 编写配置文件 # 编写配置文件 vi /usr/lib/systemd/system/nginx.service # 写入这些信息 [Unit] Description=nginx After=network.target [Service] Type=forking ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target 使用systemctl管理nginx服务 systemctl enable nginx systemctl strat nginx systemctl status nginx </div> ...

    2023-11-14 303
  • Linux系统shell中那些特殊变量

    在Shell脚本中,$符号有多种含义,它通常用于表示变量、特殊变量或参数,今天介绍几个特殊的变量。 $0表示shell脚本文件本身 $1 ~ $n脚本的位置参数,表示脚本或函数的参数。例如,$1表示第一个参数,$2表示第二个参数,依此类推 $#传递给脚本或函数的参数个数 $@传递给脚本或函数的所有参数的列表,每个参数是一个独立的单词 $?表示上一个命令的退出状态,如果为0表示成功,非零值表示失败 $$表示当前脚本或进程的进程ID $!表示后台运行的最后一个进程的进程ID $*表示所有传递给脚本的参数列表(位置参数),并将它们作为一个单词显示 $-用于显示当前Shell的选项设置 当运行 echo $- 时,它会输出一个包含不同字母的字符串 # echo $- himBH 每个字母的含义如下: h: 启用hash命令功能,用于记住命令的路径,以加快命令的查找速度。 i: 启用Shell的交互模式。 m: 启用作业控制的多用户模式。 B: 启用通知作业完成状态的功能。 H: 启用Shell历史功能。 因此,himBH 表示这个Shell当前启用了 hash、交互模式、多用户模式、作业状态通知和历史功能。 这些选项可以根据脚本或Shell的需要进行配置 注意:$* 和 $@ 在大多数情况下表现相似,但在处理引号时有一些关键的区别。 [root@localhost]# cat b.sh && bash b.sh # 使用 "$*" 和 "$@" set -- "arg1" "arg2 with space" "arg3" echo 'Using "$*"' for arg in "$*"; do echo $arg done echo 'Using "$@"' for arg in "$@"; do echo $arg done Using "$*" arg1 arg2 with space arg3 Using "$@" arg1 arg2 with space arg3 在"$*"中,所有参数被当作单个字符串,参数之间用第一个字符(默认是空格)分隔。而在"$@"中,每个参数都被当作独立的字符串。 在实际使用中,如果希望参数原封不动的传递出去,可能更适合使用"$@",它以类似数组的方式表示传递给脚本的所有参数。 ...

    2023-11-13 244
  • 如何在Arch Linux上安装Docker

    在 Arch Linux 上安装 Docker 很简单。它可以在 Extra 仓库中找到,你可以简单地 执行 pacman 魔法: sudo pacman -S docker 但要在 Arch Linux 上正确运行 Docker,还需要执行更多步骤。 让 Arch Docker 做好准备 这一切都归结为以下步骤: 从 Arch 仓库安装 Docker 启动 Docker 守护进程并在每次启动时自动运行 将用户添加到 docker组以运行docker命令而无需sudo 让我们看看详细步骤。 步骤 1:安装 Docker 包 打开终端并使用以下命令: sudo pacman -S docker 输入密码并在询问时按 Y。 这可能需要一些时间,具体取决于你使用的镜像。 ? 如果你看到找不到包或 404 错误,那么你的同步数据库可能是旧的。使用以下命令更新系统(它将下载大量软件包并需要时间): sudo pacman -Syu 步骤 2:启动 docker 守护进程 Docker 已安装但未运行。你应该在第一次运行 Docker 命令之前启动 Docker 守护进程: sudo systemctl start docker.service 我还建议启用 Docker 服务,以便 Docker 守护进程在系统启动时自动启动。 sudo systemctl enable docker.service 这样,你就可以开始运行 docker命令了。你不再需要手动启动 Docker 服务。 步骤 3:将用户添加到 docker 组 Docker 已安装并且 Docker 服务正在运行。你几乎已准备好运行 docker命令。 但是,默认情况下,你需要将 sudo与docker命令一起使用。这很烦人。 为了避免在每个 docker命令中使用sudo,你可以将自己(或任何其他用户)添加到docker组,如下所示: sudo usermod -aG docker $USER 你必须注销(或关闭终端)并重新登录才能使上述更改生效。如果你不想这样做,请使用以下命令: newgrp docker 现在已经准备好了。我们来测试一下。 步骤 4:验证 docker 安装 Docker 本身提供了一个很小的 Docker 镜像来测试 Docker 安装。运行它并查看是否一切正常: docker run hello-world 你应该看到类似这样的输出,表明 Docker 成功运行: 恭喜! 你已经在 Arch Linux 上成功安装了 Docker。 可选:安装 Docker Compose Docker Compose 已经成为 Docker 不可或缺的一部分。它允许你管理多个容器应用。 较早的经典 Compose 由 docker-composePython 软件包提供。Docker 还将其移植到 Go 中,并通过docker compose提供,但该软件包附带Docker Desktop。 在这个阶段,我建议使用经典的 docker-compose插件并使用以下命令安装它: sudo pacman -S docker-compose 故障排除技巧 以下是你可能遇到的一些常见问题以及可能的解决方案: 制表符补全不适用于 docker 子命令 如果你想对 docker命令选项使用制表符补全(例如将im补全到images等),请安装bash-completion包: sudo pacman -S bash-completion 关闭终端并启动一个新终端。你现在应该能够通过 docker命令使用制表符补全功能。 无法连接到 Docker 守护进程错误 如果你看到以下错误: docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. See 'docker run --help'. 那是因为 Docker 守护进程没有运行。参考步骤 2,启动 Docker 服务,确保其正在运行并启用它,以便 Docker 守护进程在每次启动时自动运行。 sudo systemctl start docker.service sudo systemctl enable docker.service 尝试连接到 Docker 守护程序套接字时权限被拒绝 如果你看到此错误: ddocker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'. 这是因为你需要使用 sudo运行docker命令,或者将用户添加到docker组以在不使用sudo的情况下运行docker命令。 我希望这篇简短的文章可以帮助你在 Arch Linux 上运行 Docker。 ...

    2023-11-10 202
  • 如何在Vim编辑器中剪切、复制和粘贴

    剪切、复制和粘贴文本是文本编辑中最基本的任务之一,我们都知道 Vim 有不同的处理方式。 这意味着,在你掌握它之前,你会害怕它,一旦你掌握了它,它就只是一个兔子洞。 虽然我将详细介绍剪切、复制和粘贴,但这里是本教程的基本摘要,以帮助你开始使用: 按键 描述 yiw 复制当前单词。 yy 复制整行。 diw 剪切当前单词。 dd 剪掉整行。 p 粘贴文本。 别担心,Vim 为你提供的选项比我上面提到的要多得多。 在本教程中,我将引导你完成以下内容: 如何在 Vim 中复制文本 如何在 Vim 中剪切文本 如何在 Vim 中粘贴文本 如何使用可视模式在 Vim 中剪切和复制文本 那么让我们从第一个开始。 如何在 Vim 编辑器中复制文本 虽然我们使用术语“复制”,但 Vim 有一个不同的术语,称为 “扽出yank”,因此从现在开始,我将使用“扽出”而不是“复制”。 正如我之前提到的,你可以使用多种方法在 Vim 中扽出文本,以下是一些有用的方法: 命令 描述 nyy或nY 扽出(复制)当前行和接下来的 n-1行。例如,3yy复制当前行及其下面的两行。 yaw 扽出(复制)光标所在的当前单词。 yy或Y 扽出(复制)整个当前行。 y$ 扽出(复制)从光标到行尾的文本。 y^或y0 扽出(复制)从光标到行首的文本。 要在 Vim 中扽出,请执行以下 3 个简单步骤: 按 Esc键切换到正常模式 移动到要复制的行或单词 按上表中的相关命令,你的文本将被复制 想学习交互式复制行的方式吗? 跳到本教程的最后一部分。 如何在 Vim 编辑器中剪切文本 在 Vim 中,你没有任何删除文本的选项。取而代之的是剪切文本,因此删除和剪切文本与 Vim 中的操作类似。 要在 Vim 中剪切文本,请按 d命令。但你永远不会在没有任何选项的情况下使用d命令。你总是会添加一些东西来做更多操作。 因此,你可以使用以下一些实用方法使用 d命令剪切文本: 命令 描述 dd 剪切整个当前行。 d$ 将文本从光标剪切到行尾。 d^或d0 将文本从光标剪切到行首。 ndd或dN 剪切当前行和接下来的 n-1行。例如,3dd剪切当前行及其下面的两行。 daw 剪切光标所在的当前单词。 假设我想从文件中剪切前 4 行,然后我需要使用 4dd,我是这样做的: 如何在 Vim 编辑器中粘贴文本 在 Vim 中复制或剪切文本后,只需按 p键即可粘贴它。 你可以多次按 p键多次粘贴文本,也可以使用np,其中n是要粘贴文本的次数。 例如,在这里,我粘贴了之前复制了三遍的行: 就是这么简单! 如何通过选择文本来剪切和复制文本 如果你使用过 GUI 文本编辑器,那么你肯定习惯于通过选择文本来复制和剪切文本。 让我们从如何通过在 Vim 中选择文本来复制开始。 通过选择文本复制 要在可视模式下复制文本,请执行以下 3 个简单步骤: 移动到要开始选择的地方 按 Ctrl + v启用可视模式 使用箭头键进行选择 按 y键复制所选文本 例如,在这里,我使用可视模式复制了 4 行: 如果你注意到,当我按下 y键,它就会显示有多少行被扽出(复制)。就我而言,有 4 行被复制。 在 Vim 中选择文本来剪切文本 要在 Vim 中以可视模式剪切文本,你所要做的就是遵循 4 个简单步骤: 移动到要剪切的位置 按 Ctrl + v切换到可视模式 使用箭头键选择要剪切的行 按 d键剪切选定的行 假设我想剪掉 4 行,那么我会这样做: 挺容易。是吧? ...

    2023-11-07 201
  • Linux Shell脚本监控磁盘利用率

    这是一个用于监控服务器磁盘利用率的shell脚本,它的功能和意义如下: 第一行是一个特殊的注释,用于指定执行这个脚本的解释器,这里是bash。 第三行到第十行是一些变量的定义,用于设置监控的参数,比如要监控哪些磁盘分区,报警的阈值是多少,检测的频率是多少,日志文件的位置和名称是什么等。 第十二行到第二十四行是一个函数的定义,叫做send_mail,它的作用是发送邮件给指定的收件人,告知他们哪些磁盘分区已经超过了阈值。这个函数需要一个参数,就是超过阈值的分区名称和利用率。 第二十六行到第四十八行是另一个函数的定义,叫做monitor_disk,它是主循环函数,它的作用是不断地检测磁盘利用率,并且如果发现有超过阈值的情况,就调用send_mail函数发送邮件,并且记录日志文件。这个函数没有参数,但是会使用前面定义的一些变量。 第五十行是调用monitor_disk函数的语句,这样就可以开始执行监控任务了。 #!/bin/bash # 监控服务器磁盘利用率的shell脚本 # 定义要监控的磁盘分区,可以有多个,用空格隔开 PARTITIONS="/dev/sda1 /dev/sdb1" # 定义报警阈值,单位为百分比 THRESHOLD=80 # 定义检测频率,单位为秒 INTERVAL=60 # 定义日志文件的路径和名称 LOGFILE=/tmp/disk_monitor.log # 定义邮件发送函数,需要安装mailx命令 send_mail(){ # 定义收件人邮箱地址,可以有多个,用空格隔开 MAILTO="user1@example.com user2@example.com" # 定义邮件主题 SUBJECT="Disk Usage Alert" # 定义邮件正文 MESSAGE="The following partitions have reached the threshold of $THRESHOLD%: $1" # 发送邮件 echo $MESSAGE | mailx -s "$SUBJECT" $MAILTO } # 定义主循环函数 monitor_disk(){ while true do # 获取当前时间 DATE=$(date "+%Y-%m-%d %H:%M:%S") # 遍历要监控的磁盘分区 for PARTITION in $PARTITIONS do # 获取磁盘利用率,去掉百分号 USAGE=$(df -h | grep $PARTITION | awk '{print $5}' | sed 's/%//') # 判断是否超过阈值 if [ $USAGE -ge $THRESHOLD ] then # 记录日志文件 echo "$DATE $PARTITION usage: $USAGE%" >> $LOGFILE # 调用邮件发送函数,传入超过阈值的分区名称和利用率 send_mail "$PARTITION usage: $USAGE%" fi done # 等待一定时间后再次检测 sleep $INTERVAL done } # 调用主循环函数 monitor_disk </div> ...

    2023-11-05 185
  • 如何在Ubuntu服务器22.04上设置静态IP地址

    在这篇文章中,我们将介绍如何在 Ubuntu 服务器 22.04 上设置静态 IP 地址。 强烈建议在 Linux 服务器上使用静态 IP,因为它会在重启后保持不变。静态 IP 对邮件服务器、Web 服务器和文件服务器等服务器起着重要作用。 准备条件 最小安装的 Ubuntu 服务器 22.04 具有 sudo 管理员权限的普通用户 在 Ubuntu 服务器 22.04 中,网络由 netplan 程序控制,因此我们将使用 netplan 在 Ubuntu 服务器上配置静态 IP 地址。 注意:我们不能使用 nmcli 程序,因为它不是 Ubuntu 服务器上默认安装的一部分。 在Ubuntu服务器22.04上设置静态IP地址 登录到你的 Ubuntu 服务器 22.04,查找 netplan 配置文件。它位于 /etc/netplan 目录下。 $ cd /etc/netplan/ $ ls -l total 4 -rw-r--r-- 1 root root 116 Oct 12 04:03 00-installer-config.yaml $ 运行以下 cat 命令以查看 00-installer-config.yaml 的内容。 注意:配置文件的名称可能因你的设置而异。由于它是一个 yaml 文件,因此请确保在编辑时保持缩进和语法。 $ cat 00-installer-config.yaml 输出: 根据上面的输出,它说我们有 ens33 接口,它正在从 DHCP 服务器获取 IP。查看接口名称的另一种方法是通过 ip 命令。 现在,要配置静态 IP 代替 DHCP,使用 vi 或 nano 编辑器编辑 netplan 配置文件并添加以下内容。 $ sudo vi 00-installer-config.yaml # This is the network config written by 'subiquity' network: renderer: networkd ethernets: ens33: addresses: - 192.168.1.247/24 nameservers: addresses: [4.2.2.2, 8.8.8.8] routes: - to: default via: 192.168.1.1 version: 2 保存并关闭文件。 在上面的文件中,我们使用了以下内容, ens33 为接口名称 用于设置静态 IP 的地址 nameservers 用于指定 DNS 服务器的 IP 用于指定默认网关的路由 注意:根据你的环境更改 IP 详细信息和接口名称。 要是上述修改生效,请使用以下 netplan 命令应用这些更改: $ sudo netplan apply 运行以下 IP 命令查看接口上的 IP 地址: $ ip addr show ens33 要查看默认路由,请运行: $ ip route show 上述命令的输出。 ip-addr-route-command-output-u buntu-server 完美,以上命令的输出确认静态 IP 和路由配置成功。 这就是这篇文章的全部内容。请在下面的评论部分发表你的问题和反馈。 ...

    2023-10-28 265
  • 终端基础:Linux终端中的目录切换

    本篇文章作为终端基础教程系列的一部分,介绍如何在 Linux 命令行中,利用绝对路径和相对路径实现目录切换。 Linux 的 cd命令让你可以轻松切换文件夹(即目录)。只需提供你要切换到的文件夹路径即可。 cd path_to_directory 然而对于 Linux 新人来说,可能会在路径的指定上有所困扰。 首先,让我们解决这个问题。 理解 Linux 中的路径 在 Linux 文件系统中,路径是用来追踪文件位置的信息。所有的路径都从根目录开始,然后向下延伸。 你可以通过下面的方式查看当前所在的位置: pwd 结果可能是类似于 /home/username的输出。注意,这里的username将会是你自己的用户名。 你可以注意到,路径是由 /符号和目录名组成的。比如路径/home/abhishek/scripts, 表示scripts是在文件夹abhishek之内,而文件夹abhishek在home文件夹之内。要注意,第一个 ‘/’ 是指根目录(即文件系统的开始处),后面的 ‘/’ 则作为目录的分隔符。 ?️ 在终端中键入 ls /,然后按回车。你将会看到根目录下的所有内容,试试看! 接下来,让我们学习两种常见的路径指定方式:绝对路径和相对路径。 绝对路径:这种路径从根开始,然后一直扩展到你需要的位置。如果一个路径是以/开头,那就说明它是一个绝对路径。 相对路径:这是相对于你文件系统中当前位置的路径。如果我当前位置在/home/abhishek,并且我需要去/home/abhishek/Documents, 我只需要简单地切换到Documents,而不需要指定整个绝对路径/home/abhishek/Documents。 在我演示这两种路径的区别之前,有必要先熟悉两个特殊的目录标识: .(单点)表示当前目录。 ..(双点)表示上一级目录,也就是当前目录的母目录。 这里有一张图形化的表示。 利用 cd 命令变更目录 在你已对路径概念有所了解之后,我们来了解如何切换目录。 ?️ 如果你仅键入 cd并按回车键,无论当前位置在哪,系统都会将你带回主目录。试一试吧。 敲入以下命令,你就能看到主目录里的所有文件夹: ls 这是我看到的情况: abhishek@ituxedo:~$ ls Desktop Downloads Pictures Templates VirtualBoxVMs Documents Music Public Videos 你的情况可能与此类似,但未必完全一样。 假如你希望跳转到 Documents文件夹。由于它就在当前目录下,这里使用相对路径会比较方便: cd Documents ? 注意,大部分 Linux 发行版预设的终端模拟器会在提示符本身显示出当前所在的位置。因此你不必频繁使用 pwd指令来确认自己的位置。 假如你希望切换到位于主目录里的 Templates文件夹。 你可以使用相对路径 ../Templates(..会让你返回到上层目录,即/home/username,然后你就可以进入Templates文件夹了)。 但这次我们尝试使用绝对路径。请把下面的 abhishek替换成你的用户名。 cd /home/abhishek/Templates 此刻你已经在 Templates文件夹里了。如何前往Downloads文件夹呢?这次我们再使用相对路径: cd ../Downloads 下面的图片会回顾一下你刚才学到的所有或有关目录切换的范例。 ? 别忘了你还可以使用终端的 tab键自动补全功能。只需要键入命令或者文件夹名称的前几个字母,然后敲击tab键,系统就会尝试自动地补全命令或文件夹名称,或者给你显示出所有可能的选项。 故障解决 在 Linux 终端操作切换目录的过程中,你可能会遇到一些常见的错误。 文件或目录不存在 如果在你尝试切换目录时,出现类似下面的错误信息: bash: cd: directory_name: No such file or directory 那么你可能在路径或目录名称上犯了误解。这里有几点你需要注意的: 请确定你输入的目录名中没有拼写错误。 Linux 系统对大小写敏感,因此,Downloads和downloads会被识别为不同的目录。 你可能未正确指定路径。可能你所在的位置与你预期的不同?或者你遗漏了绝对路径中的开头的 /字符? 非目录错误 如果你看到像下面这样的错误提示: bash: cd: filename: Not a directory 这表示你尝试使用 cd命令对一个文件进行操作,而不是一个目录(文件夹)。很明显,你不能像进入文件夹那样“进入”一个文件,因此会出现这样的错误。 参数过多 这是 Linux 新手常犯的另一个错误: bash: cd: too many arguments cd命令只接受一个参数。也就是说,你只能对命令指定一个目录。 如果你指定了超过一个的参数,或者在路径中误加了空格,你就会看到这个错误。 ?? 如果你输入 cd -,它将会把你带到前一个目录。当你在两个相隔较远的地方切换时非常方便,可以避免再次输入长路径。 特殊目录符号 在结束这个教程之前,我想快速告诉你关于特殊符号 ~。在 Linux 中,~是用户主目录的捷径。 如果用户 abhi运行它,~就会代表/home/abhi,如果用户prakash运行,~就意味着/home/prakash。 总结一下你在这个基础教程系列中学到的所有特殊目录标识: 符号 描述 . 当前目录 .. 上级目录 ~ 主目录 - 前一个目录 测试你的知识 下面是一些简单的练习,用来测试你刚刚学到的关于路径和 cd命令的知识。 移动到你的主目录,并使用这个命令创建一个嵌套的目录结构: mkdir -p sample/dir1/dir2/dir3 然后,一步步来试试这个: 使用绝对路径或相对路径进入 dir3 使用相对路径移动到 dir1 使用你能想象到的最短路径进入 dir2 使用绝对路径切换到 sample目录 返回你的主目录 ? 想知道你是否全都做对了吗?欢迎分享你的答案。 ...

    2023-10-22 187
  • Linux如何设置定时任务

    定时任务crond Linux 可以定时执行指定的任务或程序,是一种常用工具。主要采用 crontab 命令: crontab -e # 编辑 crontab 任务 crontab -l # 查询 crontab 任务 crontab -r # 删除当前用户所有的 crontab 任务 在 crond 编辑中,可以采用如下方式编辑定时任务: * * * * * [command] 上述命令中: 第一个星号为分钟,取值为 0-59 这 60 个整数。 第二个星号为小时,取值为 0-23 这 24 个整数。 第三个星号为当月天数,取值为 1-31 这 31 个整数。 第四个星号为月份,取值为 1-12 这 12 个整数。 第五个星号为星期,取值为 0-6 这七个整数(0 为周日)。 以下是两个例子: # 每天 01 点 05 分自动关机 05 01 * * * /sbin/shutdown -h now # 每周日的 01 点 05 分自动重启 05 01 * * 0 /sbin/shutdown -r now 除使用星号代表所有值外,crontab 中还有以下符号: 逗号 , 可用于不连续时间。 横杠 - 用于表示时间范围。 斜杠 / 用于除以某个数,表示隔多久执行一次。 以下是几个示例: * * * 12 * # 每年的 12 月每一天的每一分钟都执行一次 58 5 9 * * # 每个月的 9 号 5 点 58 分执行一次 0 1,8,15,23 * * * # 每天的 1, 8, 15, 23 点整各执行一次 0 1-14 * * * # 每天 1 点到 14 点一小时执行一次 */15 * * * * # 每隔 15 分钟执行一次 单次定时计划at 与 crontab 的循环定时任务不同,at 命令用于制定一次性的定时任务。 如果系统没有 at 指令,则需要安装 sudo apt update && sudo apt install at 然后启动调度 atd 的守护进程: sudo systemctl enable --now atd 在使用 at 命令时,切记要确保 atd 在后台已经启动,可采用以下命令查询: ps -ef | grep atd ❝atd 会在每隔 60s 查询一次当前是否存在任务,若存在则执行一次,然后自动删除任务信息。❞ at 命令的使用规则如下: at [options] [runtime] 其中指定时间的方式比较复杂,甚至还有很多模糊的时间指代方式。我个人认为常用的指定时间应是这几种格式: # 指定当天具体的时间 at 16:00 # 指定某一天的具体时间 at 16:00 2023-09-21 # 指定多长时间后执行, 单位为 minutes, hours, days, weeks at now + 50 minutes at 16:00 2023-09-21 + 100 days 输入上述命令后,会进入 at 命令模式,在此输入需要执行的命令后回车,再用 Ctrl+D 完成输入并退出。例如: $ at now + 10 minutes warning: commands will be executed using /bin/sh at> ls > /home/ubuntu/mount0/test.log at> <EOT> job 5 at Thu Sep 21 17:46:00 2023 此时可以用 atq 命令来查询目前还未执行的任务。 atq # 输出以下内容 5 Thu Sep 21 17:46:00 2023 a bunian 在上述输出中,5 代表任务编号,该编号每执行一次 at 就会增加一个。a 是队列字母。 如果想要放弃还未执行的任务,则需执行以下命令即可。 atrm [任务编号] </div> ...

    2023-10-19 182
  • Linux如何扩容lvm磁盘容量

    LVM(逻辑卷管理器)可以将多个物理磁盘或分区组合成一个存储池,然后从这个存储池中划分出新的逻辑卷。 这些逻辑卷可以被看作是新的逻辑分区,它们可以像物理分区一样被格式化和挂载。因此我们可以动态地添加更多的磁盘来增加文件系统空间。 在安装 Ubuntu server 系统时,默认将 LVM 挂载在根目录下。 可以执行以下操作为 LVM 进行扩容。 使用 vgdisplay 查询空间信息,如得到以下结果: ... VG Size <126.50 GiB PE Size 4.00 MiB Total PE 32383 Alloc PE / Size 16192 / 63.25 GiB Free PE / Size 16191 / <63.25 GiB ... 磁盘扩容。 # 增加 100G lvextend -L +100G /dev/mapper/ubuntu--vg-ubuntu--lv # 减小 100G lvreduce -L -100G /dev/mapper/ubuntu--vg-ubuntu--lv # 按百分比扩大到最大 lvresize -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv 执行扩容。 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv 使用 vgdisplay 再次查看效果。 ...

    2023-10-19 213
  • 如何在Arch Linux上安装和使用Yay

    Yay 是最流行的 AUR 助手之一,用于处理 Arch 用户资源库中的软件包。学习在 Arch Linux 中安装它。 你可以在 Arch 用户仓库Arch User Repository(AUR)中找到社区成员打包的大量软件。 由于它来自第三方,纯粹主义者建议从 AUR 手动下载并构建每个所需的包。 但这是一项乏味的任务,这就是为什么会有 AUR 助手来避免麻烦。 Yay 是最受欢迎的 AUR 帮助程序之一,在本教程中,我将分享如何在 Arch Linux 上安装 Yay。我还将分享一些有关使用 Yay 管理 AUR 包的技巧。 ? Yay 可在 Manjaro 的仓库中找到。因此,Manjaro 用户只需使用 pacman -S yay即可安装 在 Arch Linux 上安装 Yay 在继续安装 Yay 之前,你需要一些构建它所需的软件包。 让我把它分成几个步骤。 步骤 1:安装必备包 首先刷新包缓存并更新系统是一个好主意: sudo pacman -Syu 安装所需的 base-devel(包含makepkg等工具)和git(克隆 yay 的 Git 仓库所需的)。 sudo pacman -S --needed base-devel git 使用 --needed标志,它不会重新安装已经安装的软件包。 它看起来是这样的: 现在你已经有了所需的软件包,是时候在你的系统上安装 Yay。 步骤 2:克隆 Yay Git 仓库并切换到它 使用 git 命令“克隆” Yay 仓库。你可以在系统中的任何位置执行此操作,无论是主目录还是其他目录。 git clone https://aur.archlinux.org/yay.git 完成后,切换到克隆的目录: cd yay 终于可以安装 Yay 了。 步骤 3:安装 Yay 事实上,你是在构建它。你将在此处看到 PKGBUILD文件。使用以下命令从此处构建包: makepkg -si 按照屏幕上的说明进行操作。当系统要求你确认时,按 Y。 该过程完成后,通过检查其版本来验证 Yay 是否已成功安装。 yay --version 现在你已经成功安装了它,你可以删除克隆的 Yay Git 仓库。不再需要它了。 使用 Yay 进行包管理 Yay 遵循与 pacman类似(但不相同)的命令结构。所以你用 Yay 管理 AUR 包应该不难。 搜索软件包: yay search_term 安装软件包: yay -S package_name 删除软件包: yay -R package_name 要删除包及其依赖项: yay -Rns package_name 仅升级 AUR 包: yay -Sua Yay 还能够升级非 AUR 软件包。上面的 a标志将其限制为 AUR。 将 Yay 升级到新版本 现在,你可能想知道如何将 Yay 升级到可用的新版本。 答案是你不需要做任何特别的事情。当你运行以下命令时,Yay 可以自行更新: yay -Sua 从 Arch 系统中删除 Yay 如果你不喜欢 Yay 或不再需要它,你可以使用 pacman命令像删除任何其他软件包一样删除它: sudo pacman -Rs yay 总结 这是对 Yay AUR 助手的快速介绍。你可以访问其 GitHub 仓库以了解有关其工作的更多详细信息。 Arch 用户仓库(AUR)是为什么有些人喜欢使用 Arch Linux的原因之一。 虽然纯粹的 Arch 用户一般都会嘲笑 AUR,特别是 AUR 助手,但它们仍然因其提供的易用性而受到欢迎。 ...

    2023-10-15 210
  • Linux安装redis详细教程

    1、yum install安装redis源码安装所需工具 yum -y install gcc automake autoconf libtool make vim wget 2、下载并解压redis安装包 # 目录切换 cd /usr/local # 下载redis源码 wget http://download.redis.io/releases/redis-7.0.10.tar.gz # 解压redis源码 tar -zvxf redis-7.0.10.tar.gz 3、进入解压包并执行编译 # 进入解压包 cd redis-7.0.10 # 执行编译 make 4、执行安装并指定安装目录 make install PREFIX=/usr/local/redis 5、启动服务 前台启动 /usr/local/redis/bin/redis-server 后台启动 # 把redis解压包配置文件拷贝一份到安装目录下 cp /usr/local/redis-7.0.10/redis.conf /usr/local/redis/bin/ 修改 redis.conf 文件,把 daemonize no 改为 daemonize yes /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf 6、设置开机启动 添加开机启动服务 vim /etc/systemd/system/redis.service 复制粘贴以下内容: [Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target 设置开机启动 # 重新加载配置 systemctl daemon-reload # 重启redis服务 systemctl restart redis.service # 设置开机就启动redis服务 systemctl enable redis.service # redis-cli客户端设置软连接 ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis 7、redis服务操作命令 # 启动redis服务 systemctl start redis.service # 停止redis服务 systemctl stop redis.service # 重新启动服务 systemctl restart redis.service # 查看服务当前状态 systemctl status redis.service # 设置开机自启动 systemctl enable redis.service # 停止开机自启动 systemctl disable redis.service </div> ...

    2023-10-14 180
  • Linux如何设置ssh密钥(免密)登录

    我们在使用ssh客户端远程连接Linux服务器时,为了考虑安全方面的因素,通常使用密钥的方式来登录。 密钥分为公钥和私钥,这两把密钥可以互为加解密。 公钥是公开的,私钥是由个人自己持有,并且必须妥善保管和注意保密。 Linux设置密钥登录的步骤 一、生成密钥(公钥与私钥) 执行ssh-keygen命令,生成id_rsa和id_rsa.pub两个文件,id_rsa是私钥(重要,需安全保管),id_rsa.pub是公钥,密钥生成过程中可根据提示对密钥设置密码,也可留空直接回车。 解释: -t 选项指定要使用的加密算法,“rsa”表示使用RSA算法; -b 选项指定密钥的长度; -C 选项是可选的,用于添加注释。 二、创建authorized_keys文件并设置权限 1.查看密钥认证文件authorized_keys是否存在,若不存在则创建并授权,命令如下: [root@server1 ~]# touch ~/.ssh/authorized_keys [root@server1 ~]# chmod 600 ~/.ssh/authorized_keys 2.将公钥内容追加到authorized_keys文件中 [root@server1 ~]# cd ~/.ssh [root@server1 .ssh]# cat id_rsa.pub >> authorized_keys 三、设置sshd配置文件允许使用密钥登录 修改sshd_config文件,启用以下参数: RSAAuthentication yes PubkeyAuthentication yes PermitRootLogin yes AuthorizedKeysFile .ssh/authorized_keys 修改完配置文件,重启sshd服务 [root@server1 ~]# systemctl restart sshd 四、使用私钥登录验证 在Linux主机上登录验证 [root@server1 .ssh]# ssh root@localhost -i id_rsa Last login: Wed Sep 13 17:13:28 2023 from 192.168.15.1 在Win下使用ssh客户端导入私钥登录验证 五、禁用密码登录 修改sshd_config文件,启用以下参数: PasswordAuthentication no 重启sshd服务 [root@server1 ~]# systemctl restart sshd 至此,Linux已经设置为密钥登录,相对于使用密码认证登录的方式更为安全,前提是私钥要安全保管。 ...

    2023-10-10 205
  • 如何在Linux上用Doxygen生成源代码文档

    在试着熟悉别人的代码时,你总希望他们留下的代码注释能对你理解代码有所帮助。同理,无论为了自己还是其他人,编写代码时写注释是好习惯。所有编程语言都有专门的注释语法,注释可以是一个单词、一行文字、甚至是一整段话。编译器或解释器处理源代码时会忽略注释。 注释不能完全取代文档,但是有方法可以使用注释来生成文档。Doxygen是一个开源的文档生成工具,它能够根据代码注释生成 HTML 或 LaTeX 格式的文档。Doxygen 让你在不用额外操作的情况下创建代码结构概览。尽管 Doxygen 主要是用来给 C++ 生成文档的,它对其它语言同样适用,比如 C、Objective-C、 C#、 PHP、Java 和 Python 等。 要使用 Doxygen,你只需要在源代码中使用 Doxygen 能够识别的语法来写注释。Doxygen 会扫描源码文件,然后根据这些特殊注释生成 HTML 或 LaTeX 文档。下面的示例项目会演示如何使用 Doxygen 注释,以及文档是如通过注释生成出来的。示例代码可从 GitHub上获得,本文中也将引用Doxygen 手册及文档的相关章节。 在 Linux 上安装 Doxygen 在 Fedora 上可以通过软件包的形式安装 Doxygen。打开终端运行命令: sudo dnf install doxygen 在基于 Debian 的操作系统上,可以通过以下命令来安装: sudo apt-get install doxygen 使用 安装完 Doxygen 后,你需要在项目中按 Doxygen 可以识别的格式来注释代码,还要提供一个 Doxyfile 配置文件来控制 Doxygen 的一些行为。 注意:如果你用的是 GitHub 上的示例项目,你可以忽略下面一步。 如果 Doxyfile 文件不存在,你可以用 Doxygen 生成一个标准 Doxyfile 模板文件。切换到项目根目录下,运行: doxygen -g 参数 -g表示 生成generate。现在应该会出现一个名为Doxyfile的新文件。通过命令调用 Doxygen: doxygen 现在应该能会有两个新文件夹: html/ latex/ 默认情况下,Doxygen 会同时输出 LaTeX 和 HTML 格式的文档。本文主要关注 HTML 文档。你可以在 Doxygen 官方文档的入门小节中找到关于 LaTeX 格式输出的更多信息。 双击 html/index.html打开 HTML 文件。用空的配置文件生成的文档如下图: 现在我们试着修改 Doxyfile文件,并在源代码中添加特殊注释。 Doxyfile 文件 在 Doxyfile文件中可以定义大量的可调选项,本文通过介绍示例项目的Doxyfile文件我只能覆盖其中很小的子集。 第 35 行:项目名称 你可以在这里指定项目名称,它最终会显示在页眉header和浏览器标签上。 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "My Project" 第 47 行:项目简介 项目简介会以略小的字号显示在页眉上。 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "An example of using Doxygen in C++" 第 926 行:包含子目录 允许 Doxygen 查找源代码和文档文件时递归遍历子目录。 # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES 第 1769 行:禁用 LaTeX 输出 如果你只想生成 HTML 文档,可以通过这个开关禁用 LaTeX 输出。 # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO 修改完成后,你可以再次运行 Doxygen 来检验修改是否生效了。可以在调用 Doxygen 时使用 -x选项来查看Doxyfile文件的变更项: 通过调用 diff命令,Doxygen 仅显示当前 Doxyfile 文件和模板文件的差异。 特殊注释 Doxygen 通过扫描源代码文件中的特殊注释和关键字来生成 HTML 文档。示例项目中的 ByteStream 类的头文件可以很好地解释特殊注释的用法。 下面用构造函数和析构函数作为示例: /*! @brief Constructor which takes an external buffer to operate on * * The specified buffer already exist. * Memory and size can be accessed by buffer and size. * * @param[in] pBuf Pointer to existing buffer * @param[in] size Size of the existing buffer */ ByteStream(char* pBuf, size_t size) noexcept; 特殊注释块有不同的格式风格。我倾向于使用 /*!开头(Qt 风格),每行前添加*,以*/结束注释块。你可以参考 Doxygen 手册的文档化代码小节,以大致了解不同的风格选项。 Doxygen 注释分两个部分:简要描述和详细描述。它们都是可选的。在上面的例子中的注释块是对紧跟其后的构造函数声明的描述。在 @brief之后的文本会显示在类概览小节中: 在空行(空行是段落分隔符)之后是构造函数的实际文档。用 @param[in/out]关键字标注传递给构造函数的参数,Doxygen 基于此生成参数列表: 值得注意的是 Doxygen 为 buffer和size方法自动生成了链接。相反,Doxygen 忽略了析构函数前的注释,因为它并没有使用特殊注释: // Destructor ~ByteStream; 现在你已经看到 Doxygen 的绝大部分功能了。通过使用一种稍微改良的注释格式,让 Doxygen 能够识别它们。通过使用一些关键字,你甚至可以进一步控制格式化。在下一节中,我会进一步介绍 Doxygen 的其它特性。 其它特性 现在几乎所有的工作都可以通过对源代码注释的方式完成。通过一些微调,你可以轻松地优化 Doxygen 的输出。 Markdown 格式 为了进阶的格式化,Doxygen 支持 Markdown 和 HTML 命令。Markdown 速查表可以在 这里下载到。 项目主页 除了自定义页眉之外,html/index.html几乎没有其它内容了。你可以通过使用关键字向其中添加一些有意义的内容。因为主页通常不是针对某个源代码文件的,你可以将要显示在主页的内容放到项目根目录下的一个单独文件中。示例项目中就是这样做的,其输出效果如下: 自动链接生成 上面已将提到了,当你引用代码的其它部分时,Doxygen 会自动识别并生成相应链接。但要注意,这要求被引用部分也有文档才行。 更多信息可以在官方文档的自动链接生成中找到。 分组 ByteStream类重载overload 了的读写流操作符 ( 和 >>)。在类的概览中可以发现操作符被分为读和写两组。分组是在ByteStream的头文件中定义的。 分组的语法以标记 @{开始,以}@结束。在标记范围中的内容都属于这个分组。在ByteStream.h中的实现如下: /** @name Writing * Operators for writing to the stream * @{ */ (...) /** @} * @name Reading * Operators for reading from the stream * @{ */ (...) /** @} */ 你可以在官方文档的分组中找到更多相关信息。 LLVM 支持 如果你用 Clang构建项目的话,可以通过使用-Wdocumentation选项让 Clang 对特殊注释进行检查。想了解该特性的更多信息,可以参考 LLVM 用户手册和 Dmitri Gribenko 的展示报告,它们可以在 Clang 网站上找到。 谁在用 Doxygen Doxygen 是在 1997 年首次发布的。尽管有些年头了,现在仍然有很多项目在使用 Doxygen。比如 NASA 的飞行软件框架 F Prime、图像处理库OpenCV、包管理器RPM。你还可以在其它领域发现 Doxygen 语法标记的身影,比如内容管理平台Drupal的文档标准中。 注意:Doxygen 输出的 HTML 文档风格类似于九十年代网页。并且它也难以描绘元编程和模板编程架构。在这些情况下,你应该选择 Sphinx而不是 Doxygen。 ...

    2023-09-26 265
  • 如何在Linux的VirtualBox中从USB驱动器启动

    你有一个 立付Live Linux USB 吗?在当前系统上测试它的常用方法是重新启动,并在系统重新启动时选择从立付 USB 启动。 但这很烦人,因为你需要停止计算机上的工作并重新启动它。 一种干扰较小的方法是使用虚拟机。 是的,你可以使用 VirtualBox 从虚拟机中的 USB 启动。这样,你不必为了尝试而在 VM 中安装发行版,而是改用立付会话。 在本教程中,我将展示在 Linux 系统使用 VirtualBox 从 USB 驱动器启动的步骤。这需要花费一些时间和精力,但可以让你免于重启系统。 在 Linux 的 VirtualBox 中从 USB 驱动器启动 由于这是针对高级用户的教程,因此我省略了你事先需要的几个步骤: 在 Linux 系统上 安装 VirtualBox 创建立付 Linux USB,最好 使用 Ventoy 本指南分为三个部分: 创建虚拟机磁盘文件 在 VM 中使用 USB 启动 删除虚拟机磁盘(可选) 那么让我们从第一个开始。 步骤 1:创建虚拟机磁盘文件(VMDK) 首先,你需要识别 USB 驱动器的磁盘名称,为此,你需要 列出系统的驱动器。 为此,我将使用 lsblk 命令: lsblk ? 确保使用不带任何数字的磁盘名称。就我而言,Ventoy 以 sdb1 命名,但我仍然只能使用 sdb。 从上图中,你可以看到,Ventoy 列出了 sdb11,但你必须使用不带任何数字的名称。这意味着我必须只使用sdb,否则,它会抛出错误。 找到驱动器名称后,使用以下命令中的 VBoxManage命令来创建: sudo VBoxManage createmedium disk --filename=/path/to/rawdisk.vmdk --variant=RawDisk --format=VMDK --property RawDrive=/dev/sda 在上面的命令中,将 /path/to/rawdisk.vmdk替换为要保存文件的路径 ,将/dev/sda替换为目标驱动器。 就我而言,我想在我的主目录中创建一个名为 IF.vmdk的文件,并且我的目标驱动器是/dev/sdb,然后,我将使用以下命令: ? 你需要提供绝对路径来创建 vmdk 文件! sudo VBoxManage createmedium disk --filename=/home/sagar/IF.vmdk --variant=RawDisk --format=VMDK --property RawDrive=/dev/sdb 最后,使用 chmod命令更改权限: sudo chmod 777 Filename.vmdk 步骤 2:在 Linux 的 VirtualBox 中从 USB 启动 首先,从系统菜单中打开 VirtualBox,然后单击 “新建New” 按钮。 在那里,为你的虚拟机命名并选择操作系统类型及其版本: 现在,单击 “下一步Next” 按钮,它会要求你为虚拟机分配硬件资源: 完成硬件资源分配后,单击“下一步”按钮。 在这里,你将找到创建或添加虚拟磁盘的选项。现在,请执行 3 个简单步骤: 选择第二个选项 “使用现有虚拟硬盘文件Use an Existing Virtual Hard Disk File”。 点击“文件”图标。 点击“添加Add”按钮并选择你最近创建的以 .vmdk结尾的文件。 选择文件后,它将显示文件的名称,选择它并点击 “选择Choose” 选项: 它将向你显示已选择从中启动的文件。单击下一步,它将显示你所做的选择的摘要。 点击 “完成Finish” 按钮: 就是这样! 虚拟机已创建。 要启动虚拟机,首先选择虚拟机并单击启动按钮: 由于我的 USB 有 Ventoy,你可以看到,此处列出了多个发行版: 很酷。是么? 步骤 3:使用删除虚拟机及 vmdk 文件(可选) 当我在删除虚拟机后尝试删除 vmdk 文件时,当然,它被删除了,但每当我尝试创建具有相同名称的新文件时,它都会给我一个错误,说该文件已经存在! 因此,在这里,我将引导你了解如何删除虚拟机及 vmdk 文件。 首先,关闭虚拟机并将其删除。 现在,如果你尝试 使用 rm 命令并提升权限删除 vmdk 文件,你可以删除它(但这就是幻觉的开始)。 例如,在这里,我删除了 IF.vmdk文件: sudo rm IF.vmdk 现在,如果我尝试创建一个具有相同名称的新 vmdk 文件,则会出现错误,指出该文件已存在: 要删除 vmdk 文件,首先,你必须使用以下命令取消注册该文件: sudo VBoxManage closemedium disk /path/to/MyDrive.vmdk 完成后,你可以使用 rm命令删除该文件,它将轻松删除: sudo rm Filename.vmdk 然后,如果你尝试创建具有相同文件名的 vmdk 文件,你可以这样做: 这就行了! 更多虚拟机技巧 如果你正在寻找最快的 VM,可以使用 Qemu + KVM 的组合。 ...

    2023-09-23 225
  • Linux系统如何创建用户并为其设置密码

    根据下列要求创建用户及组账号: 1、名为admins的组 2、用户harry,其附属组为admins 3、用户natasha,其附属组还属于admins 4、用户alice,没有可交互的登录Shell,且不属于admins组 5、harry、natasha、alice的密码都应该是redhat [root@bunian ~]# groupadd admins #创建admins组 [root@bunian ~]# useradd -G admins harry #创建用户harry并设置其附属组为admins [root@bunian ~]# useradd -G admins natasha #创建用户natasha并设置其附属组为admins [root@bunian ~]# useradd -s /sbin/nologin alice #创建用户alice,设置不可交互的登录shell,不为其指定admins组 要求5的命令如下 [root@bunian ~]# echo redhat |passwd --stdin harry #为harry设置密码为redhat Changing password for user harry. passwd: all authentication tokens updated successfully. [root@bunian ~]# echo redhat |passwd --stdin natasha #为natasha设置密码为redhat Changing password for user natasha. passwd: all authentication tokens updated successfully. [root@bunian ~]# echo redhat |passwd --stdin alice #为alice设置密码为redhat Changing password for user alice. passwd: all authentication tokens updated successfully. </div> ...

    2023-09-02 330
  • 在Linux中如何将cURL输出保存到文件?

    当你需要将cURL的输出保存到文件时,Linux提供了几种不同的方法。 cURL是一个功能强大的命令行工具,用于在网络上传输数据,通常用于HTTP请求。 在本文中,我们将探讨如何使用cURL将其输出保存到文件,以及一些附加的选项和技巧。 安装cURL 在介绍如何使用cURL将输出保存到文件之前,确保已安装cURL是非常关键的。下面是如何安装cURL的指南,具体取决于您所使用的Linux发行版: Ubuntu/Debian sudo apt install curl Fedora/RHEL sudo dnf install curl Arch Linux sudo pacman -S curl 使用重定向操作符 最简单的方法是使用重定向操作符>或>>来将cURL的输出保存到文件中。>将覆盖文件内容,而>>将追加到文件末尾。 curl -o output.txt URL 这将下载URL的内容并将其保存到名为output.txt的文件中。如果output.txt不存在,它将被创建;如果已经存在,它将被覆盖。 curl -o output.txt URL 这将下载URL的内容并将其追加到名为output.txt的文件末尾。 例如,我们将访问百度的域名: curl -o output.txt https://www.baidu.com 使用-c选项保存Cookie 有时,你可能需要保存cURL请求的Cookie信息。你可以使用-c选项将Cookie保存到一个文件中,然后使用-b选项加载Cookie信息。 curl -c cookies.txt URL 这将保存从URL获取的Cookie信息到名为cookies.txt的文件中。然后,你可以使用-b选项来加载Cookie信息: curl -b cookies.txt URL 例如,我们将访问百度的域名: curl -b cookies.txt https://www.baidu.com 保存HTTP头信息 如果你想保存HTTP响应头信息,可以使用-i选项将它们保存到文件中: curl -i -o output.txt URL 这将把HTTP响应头信息保存到output.txt中。 例如,我们将访问百度的域名: curl -i -o output.txt https://www.baidu.com 同时保存输出和错误信息 有时,你可能希望将cURL的输出和错误信息保存到不同的文件中。你可以使用2>操作符来将错误信息重定向到一个文件: curl -o output.txt URL 2> error.txt 这将下载URL的内容并将正常输出保存到output.txt,将错误信息保存到error.txt。 保存到特定目录 如果你想将文件保存到特定目录,可以在文件名中包含目录路径: curl -o /path/to/directory/output.txt URL 这将下载URL的内容并将其保存到/path/to/directory/目录下的output.txt文件中。 例如,我们将访问百度的域名,并将结果保存至/tmp/test/baidu/output.txt: curl -o /tmp/test/baidu/output.txt https://www.baidu.com 注意:在保存至特定目录,一定要先保证该目录存在! 使用-w选项自定义输出格式 使用-w选项,你可以自定义cURL的输出格式。例如,你可以只保存响应的HTTP状态码: curl -o output.txt -w "%{http_code}" URL 这将下载URL的内容并将HTTP状态码保存到output.txt中。 例如,我们将访问百度的域名: curl -o output.txt -w "%{http_code}" https://www.baidu.com 使用 cURL 命令保存多个文件 -o选项可以用于为每个链接指定一个输出文件名,这对于批量下载文件非常方便。 以下是示例用法: curl https://link-1.com https://link-2.com https://link-3.com -o File1 -o File2 -o File3 在这个示例中,cURL会从三个不同的链接下载文件,并将它们分别保存为File1、File2和File3。 这对于下载多个文件非常有用,特别是在需要自动化下载任务时。 例如: curl https://www.baidu.com https://www.baidu.com https://www.baidu.com -o File1 -o File2 -o File3 总结 这些是在Linux中使用cURL将输出保存到文件的一些常见方法和技巧。 你可以根据你的需求选择最合适的方法,希望这篇文章对你有所帮助! 如果你有任何问题或需要更多信息,请随时提问。 ...

    2023-09-02 327
  • 上海人如何看待上海大学?

    上海人看上海大学评价也是很高的。上海大学是上海市属、国家“211工程”重点建设的综合性大学,是教育部与上海市人民政府共建高校,上海市首批高水平地方高校建设试点,国家一流学科建设高校。学校现有研究生16967人,全日制本科生20191人,预科生63人,成人教育学生18188人。上海大学是上海市重要的人才培养基地。学校是拥有国家试点学院的17所高校之一,是教育部实施“卓越工程师教育培养计划”的首批高校之一。学校也是中宣部、教育部实施“卓越新闻传播人才教育培养计划”的高校之一。钱伟长学院入选教育部首批“三全育人”综合改革试点院(系)单位。学校建立了以学分制、选课制、短学期制为核心的特色鲜明的人才培养模式。以上内容参考?上海大学——学校简介每年报考时,高三同学都喜欢追着老师问“上海大学属于什么档次的大学?上海大学厉害吗?上海大学在全国认可度高吗”,本文圆梦志愿将为大家展示上海大学的求学价值,希望能帮助大家更好的了解这所位于上海市的好大学。上海大学属于什么档次的大学?一、从上海大学受教育部认可度来看:上海大学是一所211高校、一流学科建设高校、省重点高校、卓越工程师人才培养高校,上海大学的多个专业入选双万计划。二、从上海大学近三年在上海市本科批的录取分数线来看:高三考生至少要考进上海市内前8892名,才有较大的可能被上海大学给录取。三、从上海大学的全国排名来看:上海大学在2020年ESI国际排名中,位于国际729名,内地第43名;上海大学在2021QS世界排名中,位于国际387名,内地第16名;上海大学在2021年泰晤士世界排名中,位于国际801-1000名,内地第66名;上海大学在2021U.S.News世界排名中,位于国际511名,内地第42名。综上可见,上海大学在国际大学中的排名位于387~1000名之间,在中国内地的大学排名中位于16~66名之间。四、从上海大学在教育部第四轮学科评估中取得的成绩来看:上海大学有 2个A-学科 : 社会学、美术学上海大学有 7个B+学科: 马克思主义理论、新闻传播学、数学、力学、机械工程、材料科学与工程、戏剧与影视学上海大学有 11个B学科: 应用经济学、中国语言文学、物理学、冶金工程、信息与通信工程、控制科学与工程、计算机科学与技术、环境科学与工程、管理科学与工程、图书情报与档案管理、设计学上海大学有 5个B-学科: 外国语言文学、世界史、土木工程、软件工程、工商管理上海大学有 6个C+学科: 法学、中国史、化学、电气工程、电子科学与技术、化学工程与技术上海大学有 4个C学科: 哲学、生物学、统计学、仪器科学与技术上海大学有 1个C-学科: 理论经济学综合上文,我们从上海大学的受教育部认可度、上海大学在全国的排名、上海大学的录取分数线、上海大学的学科成绩等方方面面中可以窥见, 上海大学是一所档次极高的办学水平高超的综合类公办大学,上海大学在全国范围内的认可度与影响力都极高,非常值得高三同学报考!...

    2023-08-28 197
  • Bash脚本编程入门

    Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat等的命令与 Linux 内核进行交互。 Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同,但并非完全一样。Bash 是目前最受欢迎的 Shell,并在大多数 Linux 发行版中被设为默认 Shell。 当你打开一个终端或 SSH 会话时,即使你无法真切地看到它,你其实已经在运行着一个 Shell。 当你输入一个命令,它会被 Shell 解释。如果命令和语法是正确的,它就会被执行,否则你会看到一个错误。 当你可以直接运行 Linux 命令时,为什么还需要 Bash 脚本? 你可以直接在终端输入命令,它们就会被执行。 $ echo "hello world" hello world 并且,同样的操作也可以在脚本中进行: $ cat >> script.sh #!/bin/bash echo "hello world" $ bash script.sh hello world 那么,为什么我们需要 Shell 脚本呢?因为你不必一遍又一遍地输入同一个命令,你只需运行 Shell 脚本即可。 此外,如果你的脚本中有复杂的逻辑,把所有的命令都输入到终端中可能并不是一个好主意。 例如,如果你输入下面的命令,它会奏效,但这并不容易理解。不断地输入相同的命令(甚至要在 Bash 历史记录中搜索)会造成困扰。 if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi 相反,你可以把命令放进 shell 脚本中,这样就更容易理解并且可以轻松运行了: #!/bin/bash if [ $(whoami) = 'root' ]; then echo "You are root" else echo "You are not root" fi 这还是比较简单的情况。尝试想象一下,一个复杂的脚本可能有五十行或一百行! 你将会学到什么? 在这个 Bash 脚本教程中,有九个部分。你将会学到: 创建并运行你的第一个 Bash Shell 脚本 使用变量 在你的 Bash 脚本中传递参数和接受用户输入 进行数学计算 操作字符串 使用条件语句,例如 if-else 使用 for、while和until循环 创建函数 ? 所有的部分都会给你一个简单的例子。如果你愿意,你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。 这个教程的目标读者是谁? 这个教程适合任何想要开始学习 Bash Shell 脚本的人。 如果你是一名学生,而你的课程里包括了 Shell 脚本,那么这个系列就是为你准备的。 如果你是一个常规的桌面 Linux 用户,这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。 在这个 Bash 脚本教程结束时,你应该可以编写简单的 Bash 脚本。 ? 希望你已经拥有 Linux 命令行和编程语言的基础知识。 如果你对 Linux 命令行完全不熟悉,我建议你先掌握基础知识。 19 个你应该知道的基础而重要的 Linux 终端技巧 你应该了解如何在命令行中进入特定的位置。为了做到这一点,你需要理解 Linux 文件系统中的路径是如何工作的。 Linux 中的绝对路径和相对路径有什么不同 接下来,这个教程系列会给你介绍目录导航和文件操作的基本知识。 终端基础:Linux 终端入门 1、编写你的第一个 Bash Shell 脚本 创建一个名为 hello.sh的新文件: nano hello.sh 这将在终端中打开 nano 编辑器。在其中输入以下几行代码: #!/bin/bash echo "Hello World" 通过按 Ctrl+X键可以保存并退出 nano 编辑器。 现在,你可以以以下方式运行 Bash Shell 脚本: bash hello.sh 你应该可以看到以下的输出: Hello World 另一种方式是首先赋予脚本执行权限: chmod u+x hello.sh 然后这样运行它: ./hello.sh ? 你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而,你需要切换到保存脚本的目录中才能运行它。 恭喜!你刚刚运行了你的第一个 Bash 脚本。 Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本 2、在 Bash 脚本中使用变量 变量的声明方式如下: var=some_value 然后可以像这样访问变量: $var ? 在声明变量时,等号(=)前后不能有空格。 我们通过添加一个变量来修改前面的脚本。 #!/bin/bash message="Hello World" echo $message 如果运行这个脚本,输出仍然会保持不变。 Hello World Bash 基础知识系列 #2:在 Bash 中使用变量 3、向 Bash 脚本传递参数 你可以在运行 Bash 脚本时以以下方式传递参数: ./my_script.sh arg1 arg2 在脚本中,你可以使用 $1来代表第 1 个参数,用$2来代表第 2 个参数,以此类推。$0是一个特殊变量,它代表正在运行的脚本的名字。 现在,创建一个新的 shell 脚本,命名为 arguments.sh,并向其中添加以下几行代码: #!/bin/bash echo "Script name is: $0" echo "First argument is: $1" echo "Second argument is: $2" 使其可执行并像这样运行它: $ ./argument.sh abhishek prakash Script name is: ./argument.sh First argument is: abhishek Second argument is: prakash 让我们快速看一下特殊变量: 特殊变量 描述 $0 脚本名称 $1、$2…$9 脚本参数 ${n} 10 到 255 的脚本参数 $# 参数数量 $@ 所有参数一起 $$ 当前 shell 的进程 id $! 最后执行命令的进程 id $? 最后执行命令的退出状态 你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。 为此,你必须使用 read命令。你还可以使用read -p命令提示用户进行键盘输入,而不需要echo命令。 #!/bin/bash echo "What is your name, stranger?" read name read -p "What's your full name, $name? " full_name echo "Welcome, $full_name" 现在,如果你运行这个脚本,当系统提示你输入“参数”时,你必须输入。 $ ./argument.sh What is your name, stranger? abhishek What's your full name, abhishek? abhishek prakash Welcome, abhishek prakash Bash 基础知识系列 #3:传递参数和接受用户输入 4、执行算术运算 在 Bash Shell 中执行算术运算的语法是这样的: $((arithmetic_operation)) 下面是你可以在 Bash 中执行的算术运算的列表: 操作符 描述 + 加法 - 减法 * 乘法 / 整数除法(没有小数) % 模运算(只余) ** 指数(a 的 b 次方) 以下是在 Bash 脚本中进行加法和减法的示例: #!/bin/bash read -p "Enter first number: " num1 read -p "Enter second number: " num2 sum=$(($num1+$num2)) sub=$(($num1-$num2)) echo "The summation of $num1 and $num2 is $sum" echo "The substraction of $num2 from $num1 is $sub" 你可以执行 Shell 脚本,使用你选择的任意数字作为参数。 如果你尝试除法,会出现一个大问题。Bash 只使用整数。默认情况下,它没有小数的概念。因此,你会得到 10/3 的结果为3,而不是 3.333。 对于浮点数运算,你需要这样使用 bc命令: #!/bin/bash num1=50 num2=6 result=$(echo "$num1/$num2" | bc -l) echo "The result is $result" 这个时候,你将看到准确的结果。 The result is 8.33333333333333333333 Bash 基础知识系列 #4:算术运算 5、在 Bash 脚本中使用数组 你可以使用 Bash 中的数组来存储同一类别的值,而不是使用多个变量。 你可以像这样声明一个数组: distros=(Ubuntu Fedora SUSE "Arch Linux" Nix) 要访问一个元素,使用: ${array_name[N]} 像大多数其他的编程语言一样,数组的索引从 0 开始。 你可以像这样显示数组的所有元素: ${array[*]} 这样获取数组长度: ${#array_name[@]} Bash 基础知识系列 #5:在 Bash 中使用数组 6、Bash 中的基础字符串操作 Bash 能够执行许多字符串操作。 你可以使用这种方式获取字符串长度: ${#string} 连接两个字符串: str3=$str1$str2 提供子字符串的起始位置和长度来提取子字符串: ${string:$pos:$len} 这里有一个例子: 你也可以替换给定字符串的一部分: ${string/substr1/substr2} 并且你也可以从给定字符串中删除一个子字符串: ${string/substring} Bash 基础知识系列 #6:处理字符串操作 7、在 Bash 中使用条件语句 你可以通过使用 if或if-else语句为你的 Bash 脚本添加条件逻辑。这些语句以fi结束。 单个 if语句的语法是: if [ condition ]; then your code fi 注意使用 [ ... ];和then。 if-else语句的语法是: if [ expression ]; then ## execute this block if condition is true else go to next elif [ expression ]; then ## execute this block if condition is true else go to next else ## if none of the above conditions are true, execute this block fi 这里有一个使用 if-else语句的 Bash 脚本示例: #!/bin/bash read -p "Enter the number: " num mod=$(($num%2)) if [ $mod -eq 0 ]; then echo "Number $num is even" else echo "Number $num is odd" fi 运行它,你应该能看到这样的结果: -eq被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较: 这些是你可以用来进行数值比较的测试条件操作符: 条件 当…时,等同于 true $a -lt $b $a ($a是小于$b) $a -gt $b $a > $b($a是大于$b) $a -le $b $a ($a是小于或等于$b) $a -ge $b $a >= $b($a是大于或等于$b) $a -eq $b $a == $b($a等于$b) $a -ne $b $a != $b($a不等于$b) 如果你在进行字符串比较,你可以使用以下这些测试条件: 条件 当…时,等同于 true "$a" = "$b" $a等同于$b "$a" == "$b" $a等同于$b "$a" != "$b" $a不同于$b -z "$a" $a是空的 还有些条件用于检查文件类型: 条件 当…时,等同于 true -f $a $a是一个文件 -d $a $a是一个目录 -L $a $a是一个链接 ? 要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地,条件操作符(-le、==等)之前和之后必须有空格。 Bash 基础知识系列 #7:If-Else 语句 8、使用 Bash 脚本中的循环 Bash 支持三种类型的循环:for、while和until。 这是 for循环的一个例子: #!/bin/bash for num in {1..10}; do echo $num done 运行它,你将看到以下输出: 1 2 3 4 5 6 7 8 9 10 如果你选择使用上面的示例,可以使用 while循环这样重写: #!/bin/bash num=1 while [ $num -le 10 ]; do echo $num num=$(($num+1)) done 同样,可以使用 until循环来重写: #!/bin/bash num=1 until [ $num -gt 10 ]; do echo $num num=$(($num+1)) done ? while循环和until循环非常相似。区别在于:while循环在条件为真时运行,而until循环在条件为假时运行。 Bash 基础知识系列 #8:For、While 和 Until 循环 9、在 Bash 脚本中使用函数 Bash Shell 支持使用函数,这样你不必反复编写相同的代码片段。 这是声明 Bash 函数的通用语法: function_name { commands } 这是一个使用带参数的函数的 Bash 脚本样例: #!/bin/bash sum { sum=$(($1+$2)) echo "The sum of $1 and $2 is: $sum" } echo "Let's use the sum function" sum 1 5 如果你运行该脚本,你将看到以下输出: Let's use the sum function The sum of 1 and 5 is: 6 Bash 基础知识系列 #9:Bash 中的函数 接下来呢? 这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多,你可以慢慢地、逐渐地探索。 GNU Bash 参考是一份优秀的在线资源,可以解答你的 Bash 疑问。 GNU Bash 参考 除此之外,你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容: 下载 Bash 初学者指南 一旦你具有足够的 Bash 基础知识,你可以通过这本免费书籍来学习高级 Bash 脚本: 下载高级 Bash 编程指南 这两本书至少都有十年的历史,但你仍然可以使用它们来学习 Bash。 ...

    2023-08-23 213

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注