kejilion作者所写的脚本工具箱使得网站搭建变得尤为简单
笔者将对部分shell脚本进行逐行分析,用于自学和供大家分享学习,有助于我们了解shell脚本结构和一些基本语法语句,在出错时能够即使自查。
笔者仓库:https://github.com/Aovo7/One-click
kejilion仓库地址:https://github.com/kejilion/sh

2024.03.23更新(while/case)

  6)
    while true; do                       
      clear
      echo "1. curl 下载工具"
      echo "0. 返回主菜单"
      echo "------------------------"
      read -p "请输入你的选择: " sub_choice
      case $sub_choice in
          1)
              clear
              install curl
              clear
              echo "工具已安装,使用方法如下:"
              curl --help
          ;;

          0)
              kejilion
          ;;

          *)
              echo "无效的输入!"
          ;;
      esac
      break_end
    done
  ;;

开始逐行分析该脚本
while true; do

  • while:循环会一直执行,直到给定的条件不再为真。
  • true:这是一个总是返回真值(即非零状态)的命令。在 Bash 中,true 命令用来表示一个永远为真的条件。
  • do:这个关键字后面跟着的是循环体,即只要条件为真,就会重复执行的代码块。
    因此,while true; do 创建了一个无限循环,里面的代码会不断地执行,直到被显式地中断(比如通过按下 Ctrl+C)或脚本中的某个命令使用 break 退出循环。

clear

  • do 后的所有命令都是循环体的一部分,因此它们应该相对于 while 有一级缩进。
    在 Bash 脚本中,通常使用两个或四个空格作为标准缩进。

echo" "

  • Echo全称为"Echo Command",用于在终端或命令行界面显示一行文本。

read -p "请输入你的选择: " sub_choice

  • read: 是一个内置命令,用于从标准输入(通常是键盘)读取数据。
  • -p: 全称为prompt,这个选项后面跟随的字符串会作为提示信息显示给用户。在这个例子中,提示信息是 "请输入你的选择: "。
  • sub_choice: 这是一个变量名。用户输入的数据会被保存在这个变量中。

case $sub_choice in

  • case语句,对$sub_choice变量的值匹配某个特定模式
  • 在 Bash 脚本中,当你需要引用或获取某个变量的值时,你需要在变量名前加上 $ 符号。这告诉 Bash,你希望获取的是变量的值,而不是变量名本身。
1)
    ---
;;
  • 当变量值为1时,执行---命令
    每个case分支的代码块都应该相对于case有一级缩进,表示它们是case语句的一部分。
  • ;; :用来结束每个模式块。它告诉脚本不再继续检查后续的模式。

*)

  • 默认模式,当没有其他模式匹配时执行它后面的命令。

esac

  • 这标志着 case 语句的结束。它应该与 case语句保持同样的缩进级别。

break_end

  • 这个命令是while循环体的一部分,因此它应该相对于 while 有一级缩进。
    (此命令是脚本作者定义的函数,用于提示信息显示给用户,并使用clear清除屏幕,调用函数后期再详细讲解)

done

  • 这标志着 while 循环的结束。它应该与 while 语句保持同样的缩进级别。

;;

  • 结尾的;;,作为这整个6)模式块的终止,它告诉脚本不再继续检查后续的模式。

这里着重强调一下对齐
;; 应该与它所结束的模式块的模式匹配符(如 pattern))对齐。
while 循环应以 done 关键字结束。done表示循环体的结束。二者需对齐。

2024.04.02更新(挂载)

在Docker中,挂载目录是一种将主机文件系统中的目录或文件与容器中的目录或文件进行关联的方式。这允许容器可以访问主机文件系统上的数据,并且在容器和主机之间共享数据。

挂载目录可以通过 -v--mount 选项来实现。
1.使用 -v 选项挂载目录
docker run -v /host/directory:/container/directory image_name
2.使用 --mount 选项挂载目录
docker run --mount type=bind,source=/host/directory,target=/container/directory image_name
这将把主机上的 /host/directory 目录挂载到容器中的 /container/directory 目录。

挂载目录的好处包括:

  • 数据共享:容器可以访问主机上的数据,并且主机和容器之间可以共享数据。
  • 持久性存储:挂载目录可以用于在容器重新启动时保留数据,从而实现数据的持久性存储。
  • 灵活性:通过挂载目录,可以轻松地在容器和主机之间传输文件和数据。

这里以/home/web/conf.d/default.conf为例

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}
  

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
  
    ssl_certificate /etc/nginx/certs/default_server.crt;
    ssl_certificate_key /etc/nginx/certs/default_server.key;

    return 444;
}

证书公钥和密钥文件的路径即为nginx容器中的目录,而非位于宿主机的etc文件下,想要找到对应路径可以先运行
docker ps
找到nginx容器的id,例如abc123
然后运行
docker inspect -f '{{ .GraphDriver.Data.MergedDir }}' abc123
此时便会在命令行终端界面上返还给我们nginx容器的具体路径,随后通过sftp进入对应路径即可找到etc文件夹。

安装nginx时

docker run -d --name nginx --restart always -p 80:80 -p 443:443 -p 443:443/udp -v /home/web/nginx.conf:/etc/nginx/nginx.conf -v /home/web/conf.d:/etc/nginx/conf.d -v /home/web/certs:/etc/nginx/certs -v /home/web/html:/var/www/html -v /home/web/log/nginx:/var/log/nginx nginx:alpine

可以看到在宿主机中nginx配置文件、证书、html等均挂载到了nginx容器的对应路径中,这样做的目的是为了在创建站点、反代、重定向时能够直接修改宿主机中对应的文件,从而使nginx容器随着宿主机相应文件的改变而改变。如果直接修改nginx容器对应的文件会将代码复杂化,因为每次安装nginx时的id可能不同,致使相应路径不同,而通过挂载,我们可以通过直接修改宿主机的对应文件来使得容器随之变化而简化代码。同时挂载也诸多其他好处,上面已讲到部分方面,不再赘述。

文件实际上是在宿主机上,通过挂载使得docker容器也能共享这个文件夹,任意一方的改动都会使得宿主机上的文件发生改变,如果为了数据安全可以增加只读权限,例如
-v /home/web/nginx.conf:/etc/nginx/nginx.conf:ro
ro代表赋予只读权限,即/etc/nginx/nginx.conf只能读取共享文件的内容而无法进行修改。

最后修改:2024 年 04 月 12 日
如果觉得我的文章对你有用,请随意赞赏