<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>anyu967</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://anyu967.github.io/</id>
  <link href="https://anyu967.github.io/" rel="alternate"/>
  <link href="https://anyu967.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, anyu967</rights>
  <subtitle>The end of the world</subtitle>
  <title>旅行の梦</title>
  <updated>2026-04-03T09:39:10.656Z</updated>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <content>
      <![CDATA[<span id="more"></span><!-- markdownlint-disable MD041 MD002--><hr /><h3 id="移动平均线-ma"><strong>1. 移动平均线 (MA)</strong></h3><ul><li><strong>定义</strong>：计算一段时间内的平均价格，平滑价格波动，反映趋势方向。</li><li><strong>常见类型</strong>：<ul><li>简单移动平均线 (SMA)：如5日、10日、20日、50日。</li><li>指数移动平均线 (EMA)：更重视近期价格，反应更快。</li></ul></li><li><strong>使用方法</strong>：<ul><li><strong>金叉</strong>：短期均线（如5日）上穿长期均线（如20日），看涨信号。</li><li><strong>死叉</strong>：短期均线下穿长期均线，看跌信号。</li><li><strong>支撑/阻力</strong>：均线常作为动态支撑或阻力位。</li></ul></li><li><strong>应用</strong>：判断趋势方向，适合中长期交易。</li></ul><hr /><h3 id="相对强弱指数-rsi"><strong>2. 相对强弱指数 (RSI)</strong></h3><ul><li><strong>定义</strong>：衡量价格超买或超卖的震荡指标，范围0-100。</li><li><strong>计算</strong>：RSI = 100 - [100 / (1 +平均上涨幅度/平均下跌幅度)]，通常取14日。</li><li><strong>使用方法</strong>：<ul><li><strong>超买</strong>：RSI &gt; 70，可能回调，考虑止盈。</li><li><strong>超卖</strong>：RSI &lt; 30，可能反弹，考虑买入。</li><li><strong>背离</strong>：价格创新高而RSI未创新高，暗示反转。</li></ul></li><li><strong>应用</strong>：捕捉短期买卖点，适合震荡行情。</li></ul><hr /><h3 id="随机震荡指标-stochastic-oscillator-kdj"><strong>3. 随机震荡指标(Stochastic Oscillator, KDJ)</strong></h3><ul><li><strong>定义</strong>：比较收盘价与一段时间内价格范围的关系，判断超买超卖。</li><li><strong>组成</strong>：%K（快线）、%D（慢线），范围0-100。</li><li><strong>使用方法</strong>：<ul><li><strong>超买</strong>：%K &gt; 80，可能下跌。</li><li><strong>超卖</strong>：%K &lt; 20，可能上涨。</li><li><strong>交叉信号</strong>：%K上穿%D为买入信号，反之为卖出信号。</li></ul></li><li><strong>应用</strong>：短线交易，适合波动市场。</li></ul><hr /><h3 id="布林带-bollinger-bands"><strong>4. 布林带 (BollingerBands)</strong></h3><ul><li><strong>定义</strong>：由中轨（通常20日SMA）和上下轨（中轨±2倍标准差）组成，反映价格波动范围。</li><li><strong>使用方法</strong>：<ul><li><strong>突破上下轨</strong>：价格突破上轨看涨，下轨看跌，但需确认趋势。</li><li><strong>收窄</strong>：布林带收窄预示大行情将至。</li><li><strong>反弹</strong>：价格触碰上下轨后常回撤至中轨。</li></ul></li><li><strong>应用</strong>：判断趋势强度和反转点，适合波段交易。</li></ul><hr /><h3 id="macd-指数平滑异同移动平均线"><strong>5. MACD(指数平滑异同移动平均线)</strong></h3><ul><li><strong>定义</strong>：通过快线（DIF）、慢线（DEA）和柱状图（MACD）分析趋势和动能。</li><li><strong>计算</strong>：<ul><li>DIF = 12日EMA - 26日EMA</li><li>DEA = DIF的9日EMA</li><li>MACD柱 = DIF - DEA</li></ul></li><li><strong>使用方法</strong>：<ul><li><strong>金叉</strong>：DIF上穿DEA，买入信号。</li><li><strong>死叉</strong>：DIF下穿DEA，卖出信号。</li><li><strong>柱状图</strong>：柱由负转正看涨，由正转负看跌。</li></ul></li><li><strong>应用</strong>：捕捉趋势转折，适合中短期交易。</li></ul><hr /><h3 id="平均真实波幅-atr"><strong>6. 平均真实波幅 (ATR)</strong></h3><ul><li><strong>定义</strong>：衡量价格波动幅度，常用于设定止盈止损。</li><li><strong>计算</strong>：取一段时间内真实波幅（TR）的平均值，TR =Max(高-低, |高-前收|, |低-前收|)。</li><li><strong>使用方法</strong>：<ul><li><strong>止损</strong>：买入价 - 2×ATR。</li><li><strong>止盈</strong>：买入价 + 3×ATR。</li></ul></li><li><strong>应用</strong>：动态调整交易范围，适合波动性大的股票。</li></ul><hr /><h3 id="成交量-volume"><strong>7. 成交量 (Volume)</strong></h3><ul><li><strong>定义</strong>：反映市场参与度和资金流动，需结合K线分析。</li><li><strong>使用方法</strong>：<ul><li><strong>放量上涨</strong>：看涨，趋势可能持续。</li><li><strong>缩量下跌</strong>：可能反弹，卖压减弱。</li><li><strong>异常放量</strong>：结合K线形态判断反转或突破。</li></ul></li><li><strong>应用</strong>：验证K线信号的可靠性。</li></ul><hr /><h3 id="斐波那契回调-fibonacci-retracement"><strong>8. 斐波那契回调(Fibonacci Retracement)</strong></h3><ul><li><strong>定义</strong>：利用斐波那契比例（23.6%、38.2%、50%、61.8%）预测支撑和阻力位。</li><li><strong>使用方法</strong>：<ul><li>从波段低点拉到高点，回调至38.2%或50%可能是买入点。</li><li>从高点拉到低点，反弹至61.8%可能是卖出点。</li></ul></li><li><strong>应用</strong>：确定关键价格区间，适合波段交易。</li></ul><hr /><h3 id="一目均衡表-ichimoku-cloud"><strong>9. 一目均衡表 (IchimokuCloud)</strong></h3><ul><li><strong>定义</strong>：综合指标，包括转换线、基准线、云带等，反映趋势、支撑阻力。</li><li><strong>使用方法</strong>：<ul><li><strong>价格在云带上方</strong>：看涨。</li><li><strong>价格在云带下方</strong>：看跌。</li><li><strong>云带颜色变化</strong>：绿色看涨，红色看跌。</li></ul></li><li><strong>应用</strong>：全面判断趋势，适合中长期分析。</li></ul><hr /><h3 id="支撑位与阻力位"><strong>10. 支撑位与阻力位</strong></h3><ul><li><strong>定义</strong>：基于历史K线高低点，判断价格可能停顿或反转的区域。</li><li><strong>使用方法</strong>：<ul><li><strong>支撑位</strong>：历史低点或密集成交区，跌至此处可能反弹。</li><li><strong>阻力位</strong>：历史高点或密集成交区，涨至此处可能回落。</li></ul></li><li><strong>应用</strong>：结合K线形态设定止盈止损。</li></ul><hr /><h3id="如何结合k线使用技术指标"><strong>如何结合K线使用技术指标</strong></h3><ol type="1"><li><strong>确认趋势</strong>：<ul><li>用MA或MACD判断大方向，避免逆势操作。</li></ul></li><li><strong>寻找买卖点</strong>：<ul><li>RSI、KDJ、布林带适合捕捉超买超卖信号。</li></ul></li><li><strong>验证信号</strong>：<ul><li>成交量和K线形态（如锤头线、吞没形态）确认指标信号。</li></ul></li><li><strong>设定止盈止损</strong>：<ul><li>ATR和支撑阻力位提供具体价格参考。</li></ul></li></ol><hr /><h3 id="示例"><strong>示例</strong></h3><p>假设当日K线：开盘100元，收盘103元，最高105元，最低98元。 -<strong>MA</strong>：5日均线102元，价格突破看涨。 -<strong>RSI</strong>：若为75，接近超买，考虑止盈。 -<strong>布林带</strong>：上轨106元，接近时可止盈；下轨97元，跌破可止损。- <strong>MACD</strong>：DIF上穿DEA，买入信号。</p><hr /><h3 id="注意事项"><strong>注意事项</strong></h3><ul><li><strong>指标局限</strong>：单一指标可能失灵，建议组合使用（如MACD+RSI）。</li><li><strong>时间周期</strong>：短线用1分钟/5分钟K线，长线用日K线或周K线。</li><li><strong>市场环境</strong>：震荡行情用RSI/KDJ，趋势行情用MA/MACD。</li></ul>]]>
    </content>
    <id>https://anyu967.github.io/posts/e0c73783.html</id>
    <link href="https://anyu967.github.io/posts/e0c73783.html"/>
    <published>2026-04-03T03:03:24.000Z</published>
    <summary>
      <![CDATA[<span id="more"></span>
<!-- markdownlint-disable MD041 MD002-->
<hr />
<h3 id="移动平均线-ma"><strong>1. 移动平均线 (MA)</strong></h3>
<ul>
<li>]]>
    </summary>
    <title>Investment01</title>
    <updated>2026-04-03T09:39:10.656Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="PMP" scheme="https://anyu967.github.io/categories/PMP/"/>
    <category term="PMP" scheme="https://anyu967.github.io/tags/PMP/"/>
    <content>
      <![CDATA[<p>2020-09-26-PMP <span id="more"></span></p>]]>
    </content>
    <id>https://anyu967.github.io/posts/2be6d594.html</id>
    <link href="https://anyu967.github.io/posts/2be6d594.html"/>
    <published>2020-09-26T15:16:32.000Z</published>
    <summary>
      <![CDATA[<p>2020-09-26-PMP]]>
    </summary>
    <title>pmp</title>
    <updated>2026-03-27T09:02:04.435Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="python" scheme="https://anyu967.github.io/categories/python/"/>
    <category term="python" scheme="https://anyu967.github.io/tags/python/"/>
    <content>
      <![CDATA[<p>2020-09-23-pyData <span id="more"></span></p><h3 id="一环境搭建">一、环境搭建</h3><p>pip常用命令</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#查找模块</span><br>pip search &lt;包名&gt;<br><span class="hljs-comment">#安装/更新/卸载模块</span><br>pip install -r requirements.txt -i SOURCE<br>    pip install / uninstall &lt;包名&gt;<br>    pip install -U &lt;包名&gt;<br><span class="hljs-comment">#列出已安装模块</span><br>    pip freeze &gt;requirements.txt<span class="hljs-comment">#导出模块清单</span><br>    pip <span class="hljs-built_in">list</span><br><br><span class="hljs-comment">#指定全局安装源</span><br><span class="hljs-comment">##在unix和macos，配置文件为：$HOME/.pip/pip.conf</span><br><span class="hljs-comment">##在windows上，配置文件为：%HOME%\pip\pip.ini</span><br>    <span class="hljs-comment">## 阿里源</span><br>    [<span class="hljs-keyword">global</span>]<br>    timeout = <span class="hljs-number">6000</span><br>    index-url = http://mirrors.aliyun.com/pypi/simple/<br>    trusted-host = mirrors.aliyun.com<br><span class="hljs-comment">## 豆瓣源</span><br>[<span class="hljs-keyword">global</span>]<br>    timeout = <span class="hljs-number">6000</span><br>index-url = http://pypi.douban.com/simple<br>trusted-host = pypi.douban.com<br><span class="hljs-comment">#解决 ModuleNotFoundError: No module named &#x27;pip&#x27;</span><br>python -m ensurepip<br>python -m pip install --upgrade pip <br>python -m pip install --upgrade setuptools<br><span class="hljs-comment">#源</span><br><span class="hljs-comment">##豆瓣 http://pypi.douban.com/ </span><br><span class="hljs-comment">##中国科学技术大 http://pypi.mirrors.ustc.edu.cn/simple/ </span><br><span class="hljs-comment">##清华：https://pypi.tuna.tsinghua.edu.cn/simple</span><br><span class="hljs-comment">##阿里云：http://mirrors.aliyun.com/pypi/simple/</span><br></code></pre></td></tr></table></figure><h4 id="安装virtualenv-与virtualenvwrapper-win模块">安装virtualenv与virtualenvwrapper-win模块</h4><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs py">pip3 install virtualenv<br>pip3 install virtualenvwrapper-win<br><br>WORKON_HOME<br>Path:<br></code></pre></td></tr></table></figure><h4 id="常用命令">常用命令</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python">mkvirtualenv pyData<span class="hljs-comment">#创建虚拟环境</span><br>lsvirtualenv / workon<span class="hljs-comment">#查看虚拟环境</span><br>workon pyData<span class="hljs-comment">#进入虚拟环境</span><br>rmvirtualenv pyData<span class="hljs-comment">#删除虚拟环境</span><br>deactivate<span class="hljs-comment">#停止 虚拟环境</span><br></code></pre></td></tr></table></figure><h3id="二数据可视化库matplotlib快速入门">二、数据可视化库Matplotlib快速入门</h3><h3 id="三科学计算库numpy快速入门">三、科学计算库NumPy快速入门</h3><h3 id="五数据分析库pandas快速入门">五、数据分析库Pandas快速入门</h3><h3 id="六python爬虫">六、Python爬虫</h3>]]>
    </content>
    <id>https://anyu967.github.io/posts/62a7ad9d.html</id>
    <link href="https://anyu967.github.io/posts/62a7ad9d.html"/>
    <published>2020-09-23T08:48:03.000Z</published>
    <summary>
      <![CDATA[<p>2020-09-23-pyData]]>
    </summary>
    <title>pyData</title>
    <updated>2026-02-22T05:33:39.850Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Linux" scheme="https://anyu967.github.io/categories/Linux/"/>
    <category term="Linux" scheme="https://anyu967.github.io/tags/Linux/"/>
    <content>
      <![CDATA[<p>2019-11-29-LinuxTools <span id="more"></span></p><h2 id="linux-系统观测工具">Linux 系统观测工具</h2><h2 id="系统负载及性能">系统负载及性能</h2><h3 id="uptime">1. uptime</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@192.168.1.161:~<span class="hljs-variable">$uptime</span><br>10:30:06 up 10 days, 19:26,  1 user,  load average: 3.05, 2.81, 2.15<br><br>1、当前时间 10:30:06<br>2、系统已运行的时间 10 days, 19:26<br>3、当前前在线用户 1 user<br>4、平均负载：0.54, 0.40, 0.20，最近1分钟、5分钟、15分钟系统的负载<br>5、load average数据是每隔5秒钟检查一次活跃的进程数，然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量，结果高于5的时候就表明系统在超负荷运转了；<br></code></pre></td></tr></table></figure><h3 id="dmesg">2. dmesg</h3><h3 id="top">3. top</h3><ul><li><ahref="https://www.cnblogs.com/zhoug2020/p/6336453.html">top参考</a></li><li><code>系统运行时间和平均负载</code></li><li><code>Tasks — 任务（进程）</code>，系统现在共有137个进程，其中处于运行中的有1个，136个在休眠（sleep），stoped状态的有0个，zombie状态（僵尸）的有0个</li><li><code>CPU 状态</code><ul><li>us, user: 运行(未调整优先级的) 用户进程的CPU时间 √</li><li>sy，system: 运行内核进程的CPU时间 √</li><li>ni，niced: 运行已调整优先级的用户进程的CPU时间</li><li>wa，IO wait: 用于等待IO完成的CPU时间</li><li>hi: 处理硬件中断的CPU时间</li><li>si: 处理软件中断的CPU时间</li><li>st：这个虚拟机被hypervisor偷去的CPU时间（译注：如果当前处于一个hypervisor下的vm，实际上hypervisor也是要消耗一部分CPU处理时间的）</li></ul></li><li><code>内存使用</code><ul><li>第一行是物理内存使用，第二行是虚拟内存使用(交换空间)</li><li>第四行的free + 第四行的buffers + 第五行的cached √</li></ul></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs bash">top - 10:41:25 up 10 days, 19:37,  1 user,  load average: 0.34, 1.03, 1.56<br>Tasks: 137 total,   1 running, 136 sleeping,   0 stopped,   0 zombie<br>%Cpu(s): 16.6 us,  1.7 sy,  0.0 ni, 81.2 <span class="hljs-built_in">id</span>,  0.3 wa,  0.0 hi,  0.3 si,  0.0 st<br>KiB Mem :  7730168 total,   204536 free,  7324360 used,   201272 buff/cache<br>KiB Swap:  5242876 total,   399728 free,  4843148 used.    81848 avail Mem<br><br>  PID USER PR  NI  VIRT    RES    SHR  S  %CPU %MEM   TIME+   COMMAND<br>21257 xy   20  0   4757972 990552 3384 S  12.0 12.8   3173:53 /opt/xy/java+<br><br>16.6% us — 用户空间占用CPU的百分比；1.7% sy — 内核空间占用CPU的百分比。<br>0.0% ni  — 改变过优先级的进程占用CPU的百分比<br>81.2% <span class="hljs-built_in">id</span> — 空闲CPU百分比<br>0.3% wa — IO等待占用CPU的百分比<br>0.0% hi — 硬中断（Hardware IRQ）占用CPU的百分比<br>0.3% si — 软中断（Software Interrupts）占用CPU的百分比<br></code></pre></td></tr></table></figure><table><thead><tr><th>命令</th><th>描述</th></tr></thead><tbody><tr><td>d</td><td>指定刷新时间（s）</td></tr><tr><td>M</td><td>按内存占用率显示</td></tr><tr><td>P</td><td>按CPU占用率显示</td></tr><tr><td>T</td><td>按累计时间显示</td></tr><tr><td>c</td><td>切换显示命令名称和完整命令行</td></tr></tbody></table><h3 id="htop">4. htop</h3><h2 id="cpu使用率">CPU使用率</h2><h3 id="vmstatvirtual-meomory-statistic">1. vmstat(Virtual MeomoryStatistic)</h3><blockquote><p>对系统的整体情况进行统计，对系统的整体情况进行统计<br />r经常大于4，id经常少于40，表示<code>cpu的负荷很重</code>;bi，bo长期不等于0，表示<code>内存不足</code>;disk经常不等于0，且在b中的队列大于3，表示<code>io性能不好</code><br /><code>-f,--fork</code> 显示从系统启动至今的fork数量<br /><code>-s</code> 显示内存相关统计信息及多种系统活动数量<br /><code>-d,--disk</code> 查看磁盘的读写</p></blockquote><ul><li>Procs（进程）<ul><li>r: 运行队列中进程数量</li><li>b: 等待IO的进程数量</li></ul></li><li>Memory（内存）<ul><li>swpd: 使用虚拟内存大小</li><li>free: 可用内存大小</li><li>buff: 用作缓冲的内存大小</li><li>cache: 用作缓存的内存大小</li></ul></li><li>Swap<ul><li>si: 每秒从交换区写到内存的大小</li><li>so: 每秒写入交换区的内存大小</li></ul></li><li>IO(现在的Linux版本块的大小为1024bytes）<ul><li>bi: 每秒从块设备接收到的块数，单位：块/秒 也就是读块设备</li><li>bo: 每秒发送到块设备的块数，单位：块/秒 也就是写块设备</li></ul></li><li>系统<ul><li>in: 每秒中断数，包括时钟中断[interrupt]</li><li>cs: 每秒上下文切换数[count/second]</li></ul></li><li>CPU(以百分比表示)<ul><li>us: 用户进程执行时间(user time)</li><li>sy: 系统进程执行时间(system time)</li><li>id: 空闲时间(包括IO等待时间),中央处理器的空闲时间,以百分比表示</li><li>wa: 等待IO时间</li></ul></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@192.168.1.161:~<span class="hljs-variable">$vmstat</span> 5 5  <span class="hljs-comment"># 5s内采集5个样本</span><br>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----<br>r  b   swpd   free   buff  cache   si   so    bi    bo   <span class="hljs-keyword">in</span>   cs us sy <span class="hljs-built_in">id</span> wa st<br>4  0 4216792 187800      0 212148   88   40   746    84    9    4 10  2 86  2  0<br><br>root@192.168.1.161:~<span class="hljs-variable">$vmstat</span> -a 2 5  <span class="hljs-comment"># -a,--active</span><br>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----<br>r  b   swpd   free  inact active   si   so    bi    bo   <span class="hljs-keyword">in</span>   cs us sy <span class="hljs-built_in">id</span> wa st<br>1  0 4215656 196520 1385284 5829956   88   40   746    84    9    5 10  2 86  2  0<br></code></pre></td></tr></table></figure><h3 id="mpstat">2. mpstat</h3><blockquote><p>主要用于多CPU环境下，它显示各个可用CPU的状态<br />mpstat -P CPU 时间间隔 采集次数</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@192.168.1.161:~<span class="hljs-variable">$mpstat</span> -P ALL<br>Linux 3.10.0-693.el7.x86_64 (centos) 2019年11月29日 _x86_64_(4 CPU)<br><br>12时10分00秒  CPU    %usr   %<span class="hljs-built_in">nice</span>    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle<br>12时10分00秒  all    9.62    0.00    1.44    2.34    0.00    0.35    0.01    0.00    0.00   86.24<br></code></pre></td></tr></table></figure><h3 id="sarsystem-activity-reporter">3. sar(System ActivityReporter)</h3><blockquote><p><a href="https://blog.51cto.com/11555417/2138903">参考sar</a><br />sar [options][-o file] [t] [n]<br />t为采样间隔，n为采样次数，默认值是1；</p></blockquote><ul><li>%nice：显示在用户级别，用于nice操作，所占用 CPU 总时间的百分比</li><li>%steal：管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU的百分比。</li><li>%idle：显示 CPU 空闲时间占用 CPU 总时间的百分比。</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">root@192.168.1.161:~<span class="hljs-variable">$sar</span> -u -o <span class="hljs-built_in">test</span> 10 3  <span class="hljs-comment"># 周期 次数</span><br>Linux 3.10.0-693.el7.x86_64 (centos) 2019年11月29日 _x86_64_(4 CPU)<br><br>12时16分46秒     CPU     %user     %<span class="hljs-built_in">nice</span>   %system   %iowait    %steal     %idle<br>12时16分56秒     all     12.16      0.00      1.90      5.22      0.00     80.72<br><br>root@192.168.1.161:~<span class="hljs-variable">$sar</span> -u -f <span class="hljs-built_in">test</span><span class="hljs-comment"># 查看  </span><br></code></pre></td></tr></table></figure><h3 id="pidstat">4. pidstat</h3><blockquote><p>主要用于监控全部或指定进程占用系统资源的情况，如CPU，内存、设备IO、任务切换、线程等<br />cpu使用情况统计(-u)<br />内存使用情况统计(-r) IO情况统计(-d)</p></blockquote><h3 id="dstat">5. dstat</h3><blockquote><p>综合了vmstat，iostat，ifstat，netstat<br />dstat [option] [time] [count]<br />常用选项：-l,–load; -m,–memory; -tcp</p></blockquote><h2 id="内存使用率">内存使用率</h2><ul><li>free -m</li></ul><h2 id="进程">进程</h2><ul><li>vmstat 1：查看进程是否阻塞（r）</li><li>pidstat 1：查看每个进程的情况”</li></ul><h2 id="磁盘io">磁盘IO</h2><ul><li>iostat -xzm 1</li></ul><h2 id="网络io">网络IO</h2><ul><li>sar -n DEV 1</li><li>sar -n TCP,ETCP 1</li></ul><h3 id="磁盘扩容">6. 磁盘扩容</h3><ul><li><code>df -h</code> # 查看分区空间使用情况<code>-T</code>,显示<strong>文件系统</strong>类型<ul><li><code>parted -l</code></li><li><code>lsblk -f</code></li><li><code>file -s /dev/sda1</code></li></ul></li><li><code>du -sh *</code> # 查看文件所占用大小</li><li><code>fdisk -l</code> # 查看磁盘</li></ul><h4 id="新增加的磁盘">6.1 新增加的磁盘</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@anyue ~]# pvs             <span class="hljs-comment"># 查看新增加的盘</span><br>[root@anyue ~]# fdisk /dev/sdb  <span class="hljs-comment"># 建立新分区更改类型为8e</span><br>[root@anyue ~]# mkfs.ext4 /dev/sdb1<br>[root@anyue ~]# pvcreate /dev/sdb1      <span class="hljs-comment"># pvscan</span><br>[root@anyue ~]# vgextend VolGroup /dev/sdb1     <span class="hljs-comment"># 当前需要扩容的LVM的组名，通过lvs查看</span><br>[root@anyue ~]# lvextend -L +20G /dev/mapper/VolGroup-lv_root <br>[root@anyue ~]# resize2fs -p /dev/mapper/VolGroup-lv_root<br></code></pre></td></tr></table></figure><h4 id="从其他分区获得空间home-299g">6.2 从其他分区获得空间,/home299G</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@anyue ~]# umount /home    <span class="hljs-comment"># 提到无法卸载，fuser -m /home</span><br>[root@anyue ~]# e2fsck -f /dev/mapper/VolGroup-lv_home<br>[root@anyue ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 279G<br>[root@anyue ~]# mount /home     <span class="hljs-comment"># 此时可查看 df -h /home</span><br>[root@anyue ~]# lvreduce -L 279G /dev/mapper/VolGroup-lv_home   <span class="hljs-comment"># -L,减小到20G；-l,减小20G；+</span><br>[root@anyue ~]# lvextend -L +20G /dev/mapper/VolGroup-lv_root<br>[root@anyue ~]# resize2fs -p /dev/mapper/VolGroup-lv_root  <br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/df044da8.html</id>
    <link href="https://anyu967.github.io/posts/df044da8.html"/>
    <published>2019-11-29T07:19:44.000Z</published>
    <summary>
      <![CDATA[<p>2019-11-29-LinuxTools]]>
    </summary>
    <title>Linux Tools</title>
    <updated>2026-03-27T09:02:10.036Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="SPL" scheme="https://anyu967.github.io/categories/SPL/"/>
    <category term="SPL" scheme="https://anyu967.github.io/tags/SPL/"/>
    <content>
      <![CDATA[<p>2019-11-20-SPL <span id="more"></span></p><h2 id="堆-栈-队列">堆 栈 队列</h2><h3 id="参考">参考</h3><ul><li><p><ahref="https://www.cnblogs.com/guoxiaoyan/p/8664150.html">参考1</a></p></li><li><p><ahref="https://www.cnblogs.com/hedeyong/p/7841548.html">参考2</a></p></li><li><p><ahref="https://www.cnblogs.com/jinbang/p/8658708.html">参考3</a></p></li><li><p>堆：</p><ul><li>堆是在<code>程序运行</code>时，而不是在程序编译时，申请某个大小的内存空间。即动态分配内存，对其访问和对一般内存的访问没有区别。</li><li>堆是应用程序在运行的时候请求操作系统<code>分配给自己内存</code>，一般是申请/给予的过程。</li><li>堆是指程序运行时申请的动态内存，而栈只是指一种使用堆的方法(即先进后出)。</li></ul></li><li><p>堆区：由程序员分配释放，若程序员不释放，程序结束时可能有OS回收（引用类型值）。</p></li><li><p>栈：</p><ul><li>一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶，相对地，把另一端称为栈底。</li><li>栈就是一个桶，后放进去的先拿出来，它下面本来有的东西要等它出来之后才能出来（<code>先进后出</code>）。</li><li>栈(Stack)是操作系统在建立某个进程时或者线程（在支持多线程的操作系统中是线程）为这个线程建立的存储区域。</li></ul></li><li><p>栈区：由<code>编辑器自动分配释放</code>，存放函数的<code>参数值，局部变量</code>的值等（基本类型值）。</p></li><li><p>队列：</p><ul><li>队列是一种特殊的线性表，特殊之处在于它只允许在表的<code>前端（front）进行删除操作</code>，而在<code>表的后端（rear）进行插入操作</code>，和栈一样，队列是一种操作受限制的线性表。进行删除操作的端称为队头，进行插入操作的端称为队尾。</li><li>队列中没有元素时，称为空队列。</li><li>建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间，并设置两个指针进行管理。一个是队头指针front，它指向队头元素；另一个是队尾指针rear，它指向下一个入队元素的存储位置。</li><li>队列采用的FIFO(first in firstout)，新元素（等待进入队列的元素）总是被插入到链表的尾部，而读取的时候总是从链表的头部开始读取。每次读取一个元素，释放一个元素。所谓的动态创建，动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成，遍历也方便。（先进先出）</li></ul></li><li><p>堆栈的特性：</p><ul><li>堆本身就是栈，最后一个放入堆栈中的物体总是被最先拿出来，这个特性通常称为后进先出(LIFO)队列。</li><li>堆栈中定义了一些操作，两个最重要的是PUSH和POP。PUSH操作在堆栈的顶部加入一个元素。POP操作相反，在堆栈顶部移去一个元素，并将堆栈的大小减一。</li></ul></li></ul><h3 id="链表">链表</h3><ul><li>链表中每一个元素都是一个对象，每个对象称为一个<code>节点</code>，包含有<code>数据域key和指向下一个节点的指针next</code>。通过各个节点之间的相互连接，最终串联成一个链表。</li></ul><h2 id="关于spl">关于SPL</h2><h3 id="splsearch-process-language搜索处理语言">SPL:Search ProcessLanguage(搜索处理语言)</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-keyword">AND</span> <span class="hljs-keyword">OR</span> () <span class="hljs-keyword">NOT</span> <br>通配符：<span class="hljs-string">&#x27;* ? []&#x27;</span><br>field:[x <span class="hljs-keyword">TO</span> y]<br><br>cat <span class="hljs-operator">/</span>var<span class="hljs-operator">/</span>log<span class="hljs-operator">/</span>messages <span class="hljs-operator">|</span>grep Error <span class="hljs-operator">|</span>awk <span class="hljs-string">&#x27;&#123;print substr($3,1,5)&#125;&#x27;</span> <span class="hljs-operator">|</span>sort <span class="hljs-operator">|</span>uniq <span class="hljs-operator">-</span>c <span class="hljs-operator">|</span>sort <span class="hljs-operator">-</span>nr <span class="hljs-operator">|</span>head <span class="hljs-number">10</span> <br>source:&quot;/var/log/messages&quot; Error <span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> sapn<span class="hljs-operator">=</span><span class="hljs-number">1</span>m <span class="hljs-keyword">as</span> ts <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> ts <span class="hljs-operator">|</span>sort <span class="hljs-keyword">by</span> <span class="hljs-string">&#x27;count()&#x27;</span> <span class="hljs-operator">|</span>limit <span class="hljs-number">10</span> <br></code></pre></td></tr></table></figure><h3 id="常用命令">常用命令</h3><h4 id="stats">stats</h4><blockquote><p>提供统计信息，可以选择按照<code>字段分组</code>(单值统计)<br />* count() – 返回字段出现次数，统计事件数 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL"># 统计ip和stats的组合的事件数量<br>logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> apache.clientip,apache.status<br></code></pre></td></tr></table></figure></p></blockquote><ul><li><p>avg() – 返回字段平均值 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs SQL"># 统计平均值<br>logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">avg</span>(apache.resp_len) <span class="hljs-keyword">as</span> avg_resp_len <span class="hljs-keyword">by</span> apache.request_path <br><span class="hljs-operator">|</span>rename avg_resp_len <span class="hljs-keyword">as</span> &quot;平均响应长度&quot;<br></code></pre></td></tr></table></figure></p></li><li><p>sum() <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL"># 统计日志量<br><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>stats <span class="hljs-built_in">sum</span>(raw_message_length) <span class="hljs-keyword">as</span> byte <br><span class="hljs-operator">|</span>eval Mb<span class="hljs-operator">=</span>byte<span class="hljs-operator">/</span><span class="hljs-number">1024</span><span class="hljs-operator">/</span><span class="hljs-number">1024</span><br></code></pre></td></tr></table></figure></p></li><li><p>max()</p></li><li><p>min()</p></li><li><p>dc() – 返回字段唯一个数，去重，<code>dedup field</code></p></li></ul><h4 id="bucket">bucket</h4><blockquote><p>将字段连续的值放到离散的数据桶中，可用于后续的stats等命令分组字段中<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-comment">/*每1小时跨度内每个hostname的apache.resp_len平均值*/</span><br>logtype:apache <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">avg</span>(apache.resp_len) <span class="hljs-keyword">by</span> hostname,ts <br><span class="hljs-operator">|</span>eval ts_human<span class="hljs-operator">=</span>foramtdate(ts)<br><span class="hljs-comment">/******/</span><br><span class="hljs-comment">/*返回apache.status为100-200，200-400，400以上的apache.status事件数*/</span><br>logtype:apache <br><span class="hljs-operator">|</span>bucket apache.status ranges<span class="hljs-operator">=</span>((<span class="hljs-number">100</span>,<span class="hljs-number">200</span>),(<span class="hljs-number">200</span>,<span class="hljs-number">400</span>),(<span class="hljs-number">400</span>,)) <span class="hljs-keyword">as</span> rs <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(apache.status) <span class="hljs-keyword">by</span> rs<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="rename">rename</h4><blockquote><p>重命名指定字段，支持对多字段同时进行重命名用<code>,</code>分开，支持通配符<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>rename apache.clientip <span class="hljs-keyword">as</span> &quot;ip地址&quot;<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="eval">eval</h4><blockquote><p>计算表达式并将生成值放到新的字段中，存在将覆盖<br />常用函数：todouble()、formatdate(timestamp,“HH:mm”)<br />* 根据响应时间获取short,middle,long三个分类值 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>eval length<span class="hljs-operator">=</span><span class="hljs-keyword">case</span>(apache.resp_len<span class="hljs-operator">&lt;</span><span class="hljs-number">1500</span>,&quot;short&quot;,apache.resp_len<span class="hljs-operator">&gt;</span><span class="hljs-number">2000</span>,&quot;long&quot;,<span class="hljs-keyword">default</span>,&quot;middle&quot;) <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(<span class="hljs-keyword">desc</span>) <span class="hljs-keyword">by</span> <span class="hljs-keyword">desc</span><br><span class="hljs-comment">/********************************/</span><br><br>logtype:apache <br><span class="hljs-operator">|</span>eval <span class="hljs-keyword">desc</span><span class="hljs-operator">=</span>if(apache.status<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-number">20</span>,&quot;OK&quot;,&quot;Error&quot;) <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(<span class="hljs-keyword">desc</span>) <span class="hljs-keyword">by</span> <span class="hljs-keyword">desc</span><br><span class="hljs-comment">/********************************/</span><br>logtype apache <br><span class="hljs-operator">|</span>eval <span class="hljs-type">int</span> status<span class="hljs-operator">=</span>tolong(apache.status)<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="fileds">fileds</h4><blockquote><p>保留搜索结果中的字段，支持通配<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> appname,hostname <br><span class="hljs-operator">|</span>fields appname,hostname<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="table">table</h4><blockquote><p>将查询结果以表格形式展示，并对字段进行筛选，若不包含空行显示，支持通配符<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span><span class="hljs-keyword">table</span> apache.status,apache.method<br><span class="hljs-comment">/*****/</span>  <br>appname:nginx <span class="hljs-keyword">AND</span> nginx.request_time:<span class="hljs-operator">*</span> <br><span class="hljs-operator">|</span>eval new_reuqest_time<span class="hljs-operator">=</span>todouble(nginx.request_time) <br><span class="hljs-operator">|</span><span class="hljs-keyword">table</span> nginx.client_ip.geo.ip,nginx.client_ip.geo.isp,nginx.client_ip.gep.province<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="makeresults">makeresults</h4><blockquote><p>构造指定的结果<br />* 产生一条结果并生成新的app字段，用于后续map命令 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span> makeresults count<span class="hljs-operator">=</span><span class="hljs-number">1</span> <br><span class="hljs-operator">|</span>eval app<span class="hljs-operator">=</span>&quot;zookeeper&quot; <br><span class="hljs-operator">|</span>map &quot;* appname:$app$&quot;<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="where">where</h4><blockquote><p>使用表达式对结果进行过滤<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <span class="hljs-keyword">AND</span> apache.geo.city:&quot;深圳市&quot; <br><span class="hljs-operator">|</span>stats dc(apache.clientip) <span class="hljs-keyword">as</span> dc_count <span class="hljs-keyword">by</span> apache.request_path <br><span class="hljs-operator">|</span><span class="hljs-keyword">where</span> dc_count<span class="hljs-operator">&gt;</span><span class="hljs-number">40</span> <span class="hljs-operator">&amp;&amp;</span> dc_count<span class="hljs-operator">&lt;</span><span class="hljs-number">100</span><br></code></pre></td></tr></table></figure></p></blockquote><h4 id="top">top</h4><blockquote><p>获取字段出现次数前N的值集合<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>top <span class="hljs-number">5</span> nginx.client_ip.geo.province<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="limit">limit</h4><blockquote><p>返回前n个结果<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <span class="hljs-operator">|</span>limit <span class="hljs-number">2</span><br><span class="hljs-comment">/*******/</span><br>logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> apache.clientip <br><span class="hljs-operator">|</span>limit <span class="hljs-number">5</span><br></code></pre></td></tr></table></figure></p></blockquote><h4 id="sort">sort</h4><blockquote><p>按照指定字段对搜索结果排序，+升序，-降序<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <span class="hljs-operator">|</span>sort <span class="hljs-keyword">by</span> <span class="hljs-operator">+</span><span class="hljs-type">timestamp</span><br><span class="hljs-comment">/********/</span><br>logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(apache.clientip) <span class="hljs-keyword">as</span> ip_count <span class="hljs-keyword">by</span> appname <br><span class="hljs-operator">|</span>sort <span class="hljs-keyword">by</span> <span class="hljs-operator">-</span>ip_count<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="join">join</h4><blockquote><p>对父管道结果和子管道结果进行类似SQL的join，关联分析<br />type=left/inner (取左/取并)<br />* 统计昨天每个小时每个IP的事件数占当前这个小时总数的百分比<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> ip_count <span class="hljs-keyword">by</span> apache.clientip,ts <br><span class="hljs-operator">|</span><span class="hljs-keyword">join</span> type<span class="hljs-operator">=</span><span class="hljs-keyword">left</span> ts [[ <br>  logtype:apache <br>  <span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> hour_count <span class="hljs-keyword">by</span> ts<br>  ]] <br><span class="hljs-operator">|</span>eval ippercent<span class="hljs-operator">=</span><span class="hljs-number">100</span><span class="hljs-operator">*</span>ip_count<span class="hljs-operator">/</span>hour_count<br></code></pre></td></tr></table></figure></p></blockquote><ul><li>按照运营商ISP统计总数，status：400-499数量及占比，status：500-599数量及占比，请求长度大于1000数量及占比，形成一张统计表<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_all <span class="hljs-keyword">by</span> apache.geo.isp <br><span class="hljs-operator">|</span>sort <span class="hljs-keyword">by</span> count_all <br><span class="hljs-operator">|</span>limit <span class="hljs-number">5</span><br><span class="hljs-comment">/**************/</span><br>logtype:apache <span class="hljs-keyword">AND</span> apache.status:[<span class="hljs-number">400</span> <span class="hljs-keyword">TO</span> <span class="hljs-number">499</span>] <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_400 <span class="hljs-keyword">by</span> apache.geo.isp<br><span class="hljs-comment">/**************/</span><br>logtype:apache <span class="hljs-keyword">AND</span> apache.status:[<span class="hljs-number">500</span> <span class="hljs-keyword">TO</span> <span class="hljs-number">599</span>] <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_500 <span class="hljs-keyword">by</span> apache.geo.isp<br><span class="hljs-comment">/**************/</span><br>logtype:apache <span class="hljs-keyword">AND</span> apache.resp_len<span class="hljs-operator">&gt;</span><span class="hljs-number">1000</span> <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> len_1000 <span class="hljs-keyword">by</span> apache.geo.isp<br><span class="hljs-comment">/**************/</span><br>logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_all <span class="hljs-keyword">by</span> apache.geo.isp <br><span class="hljs-operator">|</span>sort <span class="hljs-keyword">by</span> count_all <br><span class="hljs-operator">|</span>limit <span class="hljs-number">5</span> <br><span class="hljs-operator">|</span><span class="hljs-keyword">join</span> type<span class="hljs-operator">=</span><span class="hljs-keyword">left</span> apache.geo.isp [[ <br>  logtype:apache <span class="hljs-keyword">AND</span> apache.status:[<span class="hljs-number">400</span> <span class="hljs-keyword">TO</span> <span class="hljs-number">499</span>] <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_400 <span class="hljs-keyword">by</span> apache.geo.isp<br>  ]]  <br><span class="hljs-operator">|</span><span class="hljs-keyword">join</span> type<span class="hljs-operator">=</span><span class="hljs-keyword">left</span> apache.geo.isp [[ <br>  logtype:apache <span class="hljs-keyword">AND</span> apache.status:[<span class="hljs-number">500</span> <span class="hljs-keyword">TO</span> <span class="hljs-number">599</span>] <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> count_500 <span class="hljs-keyword">by</span> apache.geo.isp<br>  ]] <br><span class="hljs-operator">|</span><span class="hljs-keyword">join</span> type<span class="hljs-operator">=</span><span class="hljs-keyword">left</span> apache.geo.isp [[<br>  logtype:apache <span class="hljs-keyword">AND</span> apache.resp_len<span class="hljs-operator">&gt;</span><span class="hljs-number">1000</span> <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(logtype) <span class="hljs-keyword">as</span> len_1000 <span class="hljs-keyword">by</span> apache.geo.isp<br>  ]]<br></code></pre></td></tr></table></figure></li></ul><h4 id="append">append</h4><blockquote><p>将子管道结果附加在主管道结果之后，可以将不同类型数据进行关联分析，子查询*主管道统计大前天的平均响应值，append命令中子管道统计昨天的平均值，其结果合并在一张表中<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs SQL">starttime<span class="hljs-operator">=</span>&quot;-3d/d&quot; endtime<span class="hljs-operator">=</span>&quot;-2d/d&quot; <span class="hljs-operator">*</span> <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">avg</span>(apache.resp_len) <br><span class="hljs-operator">|</span>eval <span class="hljs-keyword">day</span><span class="hljs-operator">=</span>&quot;the day before yesterday&quot; <br><span class="hljs-operator">|</span>append [[<br>  starttime<span class="hljs-operator">=</span>&quot;-1d/d&quot; endtime<span class="hljs-operator">=</span>&quot;now/d&quot; <span class="hljs-operator">*</span> <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">avg</span>(apache.resp_len) <br>  <span class="hljs-operator">|</span>eval <span class="hljs-keyword">day</span><span class="hljs-operator">=</span>&quot;yesterday&quot;<br>  ]]<br><span class="hljs-comment">/**************/</span><br>starttime<span class="hljs-operator">=</span>&quot;-1d/d endtime=now/d&quot; <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>eval <span class="hljs-type">time</span><span class="hljs-operator">=</span>formatdate(ts,&quot;HH&quot;) <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> _count <span class="hljs-keyword">by</span> <span class="hljs-type">time</span> <br><span class="hljs-operator">|</span>eval <span class="hljs-keyword">group</span><span class="hljs-operator">=</span>&quot;yesterday&quot; <br><span class="hljs-operator">|</span>append [[<br>  starttime<span class="hljs-operator">=</span>&quot;now/d endtime=now&quot; <br>  <span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br>  <span class="hljs-operator">|</span>eval <span class="hljs-type">time</span><span class="hljs-operator">=</span>formatdate(ts,&quot;HH&quot;) <br>  <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> _count <span class="hljs-keyword">by</span> <span class="hljs-type">time</span> <br>  <span class="hljs-operator">|</span>eval <span class="hljs-keyword">group</span><span class="hljs-operator">=</span>&quot;today&quot;<br>  ]]<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="autoregress">autoregress</h4><blockquote><p>一般用作行与行之间的值计算，计算指标数据，如环比， *按小时统计事件数，并计算出当前小时和上个小时的事件变化率<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>h <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> count_ <span class="hljs-keyword">by</span> ts <br><span class="hljs-operator">|</span>autoregress count_ <span class="hljs-keyword">as</span> last_count p<span class="hljs-operator">=</span><span class="hljs-number">1</span> <br><span class="hljs-operator">|</span>eval a<span class="hljs-operator">=</span>(last_count<span class="hljs-operator">-</span>count_) <span class="hljs-operator">/</span> count_ <br><span class="hljs-operator">|</span>eval change_rate<span class="hljs-operator">=</span>format(&quot;%.3f%%&quot;,(last_count <span class="hljs-operator">-</span> count_)<span class="hljs-operator">*</span><span class="hljs-number">100</span> <span class="hljs-operator">/</span> count_)<br><span class="hljs-comment">/**************/</span><br>starttime<span class="hljs-operator">=</span>&quot;-2h/h&quot; endtime<span class="hljs-operator">=</span>&quot;now/h&quot; <span class="hljs-operator">*</span> <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">10</span>m <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> count_app <span class="hljs-keyword">by</span> ts \<br><span class="hljs-operator">|</span>eval <span class="hljs-type">time</span><span class="hljs-operator">=</span>formatdate(ts) <br><span class="hljs-operator">|</span>autoregress count_app p<span class="hljs-operator">=</span><span class="hljs-number">3</span><br></code></pre></td></tr></table></figure></p></blockquote><h4 id="lookup">lookup</h4><blockquote><p>外部导入生成新字段 * csv文件字段host,user,department将搜索结果的hostname字段与csv文件的host进行关联<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> hostname <br><span class="hljs-operator">|</span>lookup <span class="hljs-keyword">user</span>,department <span class="hljs-operator">/</span>data<span class="hljs-operator">/</span>rizhiyi<span class="hljs-operator">/</span>share<span class="hljs-operator">/</span>host_user.csv <span class="hljs-keyword">on</span> hostname<span class="hljs-operator">=</span>host<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="map">map</h4><blockquote><p>引用上次搜索结果 *列出日志数最多的三种logtype他们各自最大的日志文本长度 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">by</span> logtype <br><span class="hljs-operator">|</span>limit <span class="hljs-number">3</span> <br><span class="hljs-operator">|</span>rename logtype <span class="hljs-keyword">as</span> type <br><span class="hljs-operator">|</span>map &quot;logtype:$type$ <br>|stats max(raw_message_length)&quot;<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="parse">parse</h4><blockquote><p>搜索时抽取字段<br />* 从原文中抽取IP地址，得到新的字段ip_addr分组并计算appname的个数<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>parse &quot;(?&lt;ip_addr&gt;\d+\.\d+\.\d+\.\d+)&quot; <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>(appname) <span class="hljs-keyword">by</span> ip_addr<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="parsedate">parsedate</h4><blockquote><p>时间处理<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">|</span>makeresults count<span class="hljs-operator">=</span><span class="hljs-number">1</span> <br><span class="hljs-operator">|</span>eval pd<span class="hljs-operator">=</span>parsedate(&quot;28/04/2019:12:01:01&quot;,&quot;dd/MM/yyyy:HH:mm:ss&quot;) <br><span class="hljs-operator">|</span>eval fd<span class="hljs-operator">=</span>formatdate(bd,&quot;yyyy/dd/MM HH:mm:ss&quot;)<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="esma智能运维">esma智能运维</h4><blockquote><p>对某一个字段的未来值进行预测<br />* 统计过去一年的每天平均延迟，推测接下来一个月网络延迟<br /><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs routeros">* |bucket timestamp <span class="hljs-attribute">span</span>=1d as ts <br>|stats avg(network.latency) as latency by ts <br>|esma latency <span class="hljs-attribute">timefield</span>=ts <span class="hljs-attribute">period</span>=7 <span class="hljs-attribute">futurecount</span>=30<br></code></pre></td></tr></table></figure></p></blockquote><ul><li>主机内存使用预测 <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs SQL">appname:top_info_system_stats <span class="hljs-keyword">AND</span> ip:<span class="hljs-number">192.168</span><span class="hljs-number">.10</span><span class="hljs-number">.1</span> <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">10</span>m <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">avg</span>(json.Mem.used_percent) <span class="hljs-keyword">as</span> mem_use <span class="hljs-keyword">by</span> ts <br><span class="hljs-operator">|</span>esma mem_use timefield<span class="hljs-operator">=</span>ts<br></code></pre></td></tr></table></figure></li></ul><h4 id="movingavg">movingavg</h4><blockquote><p>计算移动平均值<br />*以分钟为单位统计apache返回apache_len长度的和，以10为窗口计算移动平均值，得到每分钟的响应长度和平滑后的值<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>bucket <span class="hljs-type">timestamp</span> span<span class="hljs-operator">=</span><span class="hljs-number">1</span>m <span class="hljs-keyword">as</span> ts <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">sum</span>(apache.resp_len) <span class="hljs-keyword">as</span> sum_len <span class="hljs-keyword">by</span> ts <br><span class="hljs-operator">|</span>movingavg sum_len,<span class="hljs-number">10</span> <span class="hljs-keyword">as</span> moving_avg_resp_len<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="rollingavg">rollingavg</h4><blockquote><p>计算移动标准差 *以时间分组算出apache返回的reponse长度的和，以10为窗口计算rolling的标准差，观察resp_len的波动情况<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs SQL">logtype:apache <br><span class="hljs-operator">|</span>stats <span class="hljs-built_in">sum</span>(apache.resp_len) <span class="hljs-keyword">as</span> sum_resp_len <span class="hljs-keyword">by</span> <span class="hljs-type">timestamp</span> <br><span class="hljs-operator">|</span>rollingstd sum_resp_len,<span class="hljs-number">10</span> <span class="hljs-keyword">as</span> resp_len_rolling_std<br></code></pre></td></tr></table></figure></p></blockquote><h4 id="transpose">transpose</h4><blockquote><p>将查询的表格数据进行行列转换<br /><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs SQL"><span class="hljs-operator">*</span> <span class="hljs-operator">|</span>stats <span class="hljs-built_in">count</span>() <span class="hljs-keyword">as</span> cnt <span class="hljs-keyword">by</span> apache.method,apache.status <br><span class="hljs-operator">|</span>transpose <span class="hljs-type">row</span><span class="hljs-operator">=</span>apache.method <span class="hljs-keyword">column</span><span class="hljs-operator">=</span>apache.status valuefield<span class="hljs-operator">=</span>cnt<br></code></pre></td></tr></table></figure></p></blockquote>]]>
    </content>
    <id>https://anyu967.github.io/posts/546a1914.html</id>
    <link href="https://anyu967.github.io/posts/546a1914.html"/>
    <published>2019-11-20T08:06:25.000Z</published>
    <summary>
      <![CDATA[<p>2019-11-20-SPL]]>
    </summary>
    <title>SPL</title>
    <updated>2026-02-22T05:33:39.850Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Linux" scheme="https://anyu967.github.io/categories/Linux/"/>
    <category term="linux" scheme="https://anyu967.github.io/tags/linux/"/>
    <category term="Devops" scheme="https://anyu967.github.io/tags/Devops/"/>
    <content>
      <![CDATA[<p>2019-11-08-Zookeeper&amp;Kafka <span id="more"></span></p><h1 id="zookeeper">Zookeeper</h1><h2 id="zookeeper官网"><ahref="http://zookeeper.apache.org/">Zookeeper官网</a></h2><h3 id="什么是zookeeper">1. 什么是Zookeeper?</h3><blockquote><p>Zookeeper是开源<code>分布式</code>的，为分布式应用<code>提供协调服务</code>的Apache项目；<br />Zookeeper是一个基于<code>观察者模式</code>设计的<code>分布式服务管理框架</code>，负责<code>存储和管理</code>数据，接受观察者的注册，数据状态一旦发生变化，Zookeeper负责通知已经在Zookeeper注册的观察者做出相应的反应；<br />应用场景：统一命名服务；统一配置管理；统一集群管理；监控服务器动态上下线；软负载均衡；</p></blockquote><h3 id="zookeeper特点">2. Zookeeper特点</h3><h4 id="zookeeper的设计目标">2.1 Zookeeper的设计目标</h4><img src="/posts/e1f23b16/zkservice.png" class="" title="[zkservice]"><ul><li>一个Leader，多个Follwers；</li><li>集群只要有半数以上节点存活，集群就可以正常服务，适合安装奇数台服务器；</li><li>全局数据一致，每个Server保存一份相同数据副本；</li><li>数据更新<code>原子性</code>，要么成功，要么失败；</li><li><code>实时性</code>：一定时间内，Client能读到最新数据；</li><li><code>顺序性</code>：来自同一个Client的更新请求按其发送顺序一次执行；</li></ul><h4 id="zookeeper数据模型和分层名称">2.2Zookeeper数据模型和分层名称</h4><img src="/posts/e1f23b16/zknamespace.png" class="" title="[zknamespace]"><ul><li>类似于Unix文件系统，每个节点称为ZNode，默认存储1MB的数据，每个节点可以通过其路径唯一表示；</li></ul><h3 id="zookeeper的使用">3. Zookeeper的使用</h3><h4 id="下载地址">3.1 下载地址</h4><p><ahref="http://zookeeper.apache.org/releases.html">Zookeeper下载地址</a></p><h4 id="本地模式安装部署">3.2 本地模式安装部署</h4><ul><li>JDK<ul><li><code>vim /etc/profile</code> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">JAVA_HOME=/opt/jdk1.8<br>JRE_HOME=<span class="hljs-variable">$JAVA_HOME</span>/jre<br>CLASSPATH=.:<span class="hljs-variable">$JAVA_HOME</span>/lib:<span class="hljs-variable">$JRE_HOME</span>/lib<br><span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$JAVA_HOME</span>/bin:<span class="hljs-variable">$PATH</span><br></code></pre></td></tr></table></figure></li></ul></li><li>解压Zookeeper到/opt</li></ul><h4 id="修改配置文件">3.3 修改配置文件</h4><ul><li>路径：/zookeepr-version/conf<ul><li><code>mv ./zoo_sample.cfg ./zoo.cfg &amp;&amp; mkdir zkData</code></li><li><code>vim zoo.cfg</code> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">tickTime=2000 <span class="hljs-comment"># 通信心跳时间 2s，S-C</span><br>initLimit=10  <span class="hljs-comment"># 2sx10=20s，初始Leader与Followed通信时限</span><br>syncLimit=5   <span class="hljs-comment"># LF同步通信时限，5x2s=10s</span><br>clientPort=2181   <span class="hljs-comment"># 监听客户端连接端口号</span><br>dataDir=/opt/zookeeper-version/zkData <span class="hljs-comment"># 数据文件目录和数据持久化路径  </span><br></code></pre></td></tr></table></figure></li></ul></li><li>启动zookeeper服务端&amp;客户端<ul><li><code>./bin/zkServer.sh start</code></li><li><code>jps</code> # Java Virtual Machine Process Status Tool</li><li><code>./bin/zkCli.sh -server IP</code> # Command lineIteraction</li></ul></li></ul><h4 id="测试">3.4 测试</h4><table><thead><tr><th style="text-align: left;">命令</th><th style="text-align: left;">说明</th></tr></thead><tbody><tr><td style="text-align: left;">ls</td><td style="text-align: left;">查看节点</td></tr><tr><td style="text-align: left;">–</td><td style="text-align: left;">watch, 监听节点变化</td></tr><tr><td style="text-align: left;">create</td><td style="text-align: left;">创建节点</td></tr><tr><td style="text-align: left;">–</td><td style="text-align: left;">-s, 自动建立序号</td></tr><tr><td style="text-align: left;">delete</td><td style="text-align: left;">删除节点</td></tr><tr><td style="text-align: left;">set</td><td style="text-align: left;">设置节点值</td></tr><tr><td style="text-align: left;">get</td><td style="text-align: left;">获取节点的值</td></tr><tr><td style="text-align: left;">–</td><td style="text-align: left;">watch, 监听节点值的变化</td></tr><tr><td style="text-align: left;">stat</td><td style="text-align: left;">查看节点状态</td></tr></tbody></table><ul><li><p>连接到Zookeeper：</p></li><li><p><code>$ bin/zkCli.sh -server 127.0.0.1:2181</code> # help查询帮助命令</p></li><li><p>创建znode <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash">[zkshell: 9] create /zk_test <span class="hljs-string">&quot;my_data&quot;</span>    <span class="hljs-comment"># 要有相应的值 </span><br>Created /zk_test<br><br>[zkshell: 11] <span class="hljs-built_in">ls</span> /<br>[zookeeper, zk_test]<br><br>[zkshell: 12] get /zk_test    <span class="hljs-comment"># set /zk_test junk     delete /zk_test</span><br>my_data<br>cZxid = 5<br>...<br>numChildren = 0<br></code></pre></td></tr></table></figure></p></li></ul><h3 id="分布式安装部署建议奇数台">4. 分布式安装部署(建议奇数台)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash">vim conf/zoo.cfg<br>tickTime=2000<br>dataDir=/var/lib/zookeeper<br>clientPort=2181<br>initLimit=5<br>syncLimit=2<br>server.1=zoo1:2888:3888 <span class="hljs-comment"># zoo1建议为主机名； </span><br>server.2=zoo2:2888:3888 <span class="hljs-comment"># 2888：该server与集群leader server交换信息的端口；</span><br>server.3=zoo3:2888:3888 <span class="hljs-comment"># 3888选举端口；</span><br><br><span class="hljs-comment"># 配置myid 在数据目录下</span><br>vim myid<br>1<br></code></pre></td></tr></table></figure><h1 id="kafka">Kafka</h1><h2 id="kafka官网"><a href="http://kafka.apache.org/">Kafka官网</a></h2><h3 id="什么是kafka">1. 什么是Kafka？</h3><blockquote><p>Kafka是一个<code>分布式</code>的<code>基于发布/订阅模式</code>的<code>消息队列</code>(MessageQueue)，主要应用于大数据领域的实时计算以及日志采集。</p></blockquote><h3 id="什么是message-queue">2. 什么是Message Queue？</h3><blockquote><p>消息队列比作是一个<code>存放消息的容器</code>，需要使用消息的时候可以取出消息供自己使用，消息队列是<code>分布式系统</code>中重要的组件，目前使用较多的消息队列有<code>ActiveMQ，RabbitMQ，Kafka，RocketMQ</code>；队列Queue 是一种<code>先进先出</code>的数据结构。</p></blockquote><blockquote><p>消息队列的模式：<br />&gt;点对点模式，消费者<code>主动</code>拉取数据，消息收到后消息清除（阅后即焚）；<br /><img src="/posts/e1f23b16/PP.png" class="" title="[点对点模式]"><br />&gt; 发布-订阅模式，发布到Topic数据不会清除，分为push / pull；<br /><img src="/posts/e1f23b16/PS.png" class="" title="[发布-订阅模式]"></p></blockquote><blockquote><p>优点：<br />&gt; 1）通过异步处理提高系统性能（削峰、减少响应所需时间）；<br />&gt;2）降低系统耦合性，消息队列使利用<code>发布-订阅</code>模式工作，消息发送者（<code>生产者</code>）发布消息，一个或多个消息接受者（<code>消费者</code>）订阅消息；</p></blockquote><h3 id="kafka的4个核心api">3. Kafka的4个核心API</h3><ul><li><p><code>Producer API</code>：允许应用程序发布的记录流至一个或多个Kafkatopics。</p></li><li><p><code>Consumer API</code>：允许应用程序订阅一个或多个主题，并处理所产生的记录流。</p></li><li><p><code>Streams API</code>：允许应用程序扮演流处理器，从一个或多个主题消耗的输入流，并产生一个输出流至一个或多个输出的主题，有效地把输入数据流转变输出流。</p></li><li><p><code>Connector API</code>：允许构建和运行可重复使用的生产者或消费者，将Kafkatopics连接到现有的应用程序或数据系统。例如，关系数据库的连接器可能会捕获对表的所有更改。</p></li><li><p>在Kafka中，客户端和服务器之间的通信是通过简单，高性能，与语言无关的<code>TCP协议</code>完成的。</p></li></ul><img src="/posts/e1f23b16/kafka-apis.png" class="" title="[kafka-apis]"><ul><li>topics：主题是被发布记录的一种类别或者订阅名称，Kafka的主题是通常是多用户的，也即一个主题可以有零个，一个或者多个消费者来订阅写入该主题的数据；对于每个主题，Kafka集群都会维护一个分区日志。</li></ul><img src="/posts/e1f23b16/Topic.png" class="" title="[Topic]"><h3 id="kafka架构">4. kafka架构：</h3><img src="/posts/e1f23b16/kafka.png" class="" title="[kafka架构]"><ul><li><code>Producer</code>：消息生产者，就是向kafkabroker发消息的客户端；</li><li><code>Consumer</code>：消息消费者，向kafkabroker取消息的客户端；</li><li><code>Consumer Group （CG）</code>：kafka用来实现一个topic消息的广播（发给所有的consumer）和单播（发给任意一个consumer）的手段；广播的实现：让每一个Consuner拥有独立的CG；<ul><li>第一：同一个消费者组里面，只能有一个消费者去消费分区的数据；</li><li>第二：同一个消费者组里面是不会重复消费消息的；</li><li>第三：同一个消费者组的一个消费者不是以一条一条数据为单元的，是以<code>分区为单元</code>，就相当于消费者和分区建立某种socket，进行传输数据，所以，一旦建立这个关系，这个分区的数据只能是由这个消费者消费；</li></ul></li><li><code>Broker</code>：一台kafka服务器就是一个broker；一个集群由多个broker组成。一个broker可以容纳多个topic；</li><li><code>Topic</code>：可以理解为一个队列；</li><li><code>Partition</code>：为了实现扩展性，数据量大的topic可以分布到多个broker（即服务器）上，一个topic可以分为多个partition，每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id（offset）。kafka只保证按一个partition中的顺序将消息发给consumer，不保证一个topic的整体（多个partition间）的顺序；</li><li><code>Offset</code>：kafka的存储文件都是按照offset.kafka来命名，用offset做名字的好处是方便查找。例如你想找位于2049的位置，只要找到2048.kafka的文件即可。当然thefirst offset就是00000000000.kafka；</li><li>Zookeeper：存储Kafka集群信息，实现集群的高可用；</li></ul><h3 id="kafka安装部署">5. kafka安装部署：</h3><h4 id="下载地址-1">5.1 <ahref="http://kafka.apache.org/quickstart">下载地址</a></h4><blockquote><p>依赖于Zk</p></blockquote><h4 id="安装部署">5.2 安装部署</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -xzvf kafka_version.tgz -C /opt/<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/e1f23b16.html</id>
    <link href="https://anyu967.github.io/posts/e1f23b16.html"/>
    <published>2019-11-08T14:58:30.000Z</published>
    <summary>
      <![CDATA[<p>2019-11-08-Zookeeper&amp;Kafka]]>
    </summary>
    <title>Zookeeper和Kafka</title>
    <updated>2026-02-22T05:33:39.843Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <content>
      <![CDATA[<p>2019-11-05-五笔和双拼 <span id="more"></span></p>]]>
    </content>
    <id>https://anyu967.github.io/posts/47b7e05b.html</id>
    <link href="https://anyu967.github.io/posts/47b7e05b.html"/>
    <published>2019-11-05T10:46:43.000Z</published>
    <summary>
      <![CDATA[<p>2019-11-05-五笔和双拼]]>
    </summary>
    <title>五笔和双拼</title>
    <updated>2026-02-22T05:33:39.842Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="linux" scheme="https://anyu967.github.io/categories/linux/"/>
    <category term="linux" scheme="https://anyu967.github.io/tags/linux/"/>
    <content>
      <![CDATA[<p>2019-10-31 <span id="more"></span></p><h4 id="用户操作练习">用户操作练习</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建一个用户mandriva，其ID号为2002，基本组为distro（组ID为3003），附加组为linux</span><br>groupadd -g 3003 distro<br>groupadd linux<br>useradd -u 2002 -g distro -G linux mandriva<br><br><span class="hljs-comment"># 创建一个用户fedora，其全名为Fedora Community，默认shell为tcsh</span><br>useradd -c <span class="hljs-string">&quot;Fedora Community&quot;</span> -s /bin/tcsh fedora<br><br><span class="hljs-comment"># 修改mandriva的ID号为4004，基本组为linux，附加组为distro和fedora</span><br>usermod -u 4004 -g linux -G distro,fedora mandriva<br><br><span class="hljs-comment"># 给fedora加密码，并设定其密码最短使用期限2D，最长为50D</span><br>passwd -n 2 -x 50 fedora<br><br><span class="hljs-comment"># 将mandriva的默认shell修改为/bin/bash</span><br>usermod -s /bin/bash mandriva<br><br><span class="hljs-comment"># 添加系统用户hbase，且不允许登录系统</span><br>useradd -r -s /sbin/nologin hbase<br><br><span class="hljs-comment"># 新建一个没有家目录的用户openstack</span><br>useradd -M openstack<br></code></pre></td></tr></table></figure><h4 id="权限练习">权限练习</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 复制/etc/skel 为/home/openstack</span><br><span class="hljs-built_in">cp</span> -r /etc/skel /home/openstack<br><br><span class="hljs-comment"># 改变/home/openstack及其内部文件的属主属组均为openstack</span><br><span class="hljs-built_in">chown</span> -R openstack.openstack /home/openstack<br><br><span class="hljs-comment"># /home/openstack及其内部文件属主与其他用户没有任何访问权限</span><br><span class="hljs-built_in">chmod</span> -R go= /home/openstack<br></code></pre></td></tr></table></figure><h4 id="统计">统计</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 统计/usr/bin目录下的文件个数</span><br><span class="hljs-built_in">ls</span> /usr/bin |<span class="hljs-built_in">wc</span> -l<br><br><span class="hljs-comment"># 取出当前系统上所有用户的shell，每种shell只显示一次，并且按顺序进行显示</span><br><span class="hljs-built_in">cat</span> /etc/passwd |<span class="hljs-built_in">cut</span> -d: -f7 |<span class="hljs-built_in">sort</span> -u<br><br><span class="hljs-comment"># 如何显示/var/log目录下每个文件的内容类型？</span><br>file /var/log/* <br>file $(<span class="hljs-built_in">ls</span> /var/log)<br><br><span class="hljs-comment"># 取出/etc/inittab文件的第六行</span><br><span class="hljs-built_in">head</span> -n6 |<span class="hljs-built_in">tail</span> -n1<br><br><span class="hljs-comment"># 取出/etc/passwd文件中倒数第九个用户的用户名和shell，显示到屏幕并将其保存至/tmp/users文件中</span><br><span class="hljs-built_in">tail</span> -n9 |<span class="hljs-built_in">head</span> -n1 |<span class="hljs-built_in">cut</span> -d: -f1,7 &gt;/tmp/users<br><br><span class="hljs-comment"># 显示/etc目录所有以pa开头的文件，并统计个数</span><br><span class="hljs-built_in">ls</span> -d /etc/pa* |<span class="hljs-built_in">wc</span> -l<br><br><span class="hljs-comment"># 不使用文本编辑器将alias cls=&quot;clear&quot;添加到当前用户的.bashrc文件中</span><br><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;alias cls=clear&quot;</span>&gt;&gt;~/.bashrc<br></code></pre></td></tr></table></figure><h4 id="grepsedawk">grep/sed/awk</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 找出ifconfig命令结果中的1-255之间的整数</span><br>grep -E <span class="hljs-string">&#x27;(\&lt;([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\&gt;\.)&#123;3&#125;\&lt;([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\&gt;&#x27;</span>  <br>  A: 1-127  <br>  B: 128-191  <br>  C: 192-223  <br>grep -E <span class="hljs-string">&#x27;\&lt;[1-9]|1[1-9]&#123;2&#125;|2[01][0-9]|22[0-3]\&gt;(\.\&lt;([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\&gt;)&#123;2&#125;\.\&lt;([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\&gt;&#x27;</span><br><br><span class="hljs-comment"># 删除/etc/grub.conf文件中行首的空白符</span><br>sed <span class="hljs-string">&#x27;s/[[:space:]]+//g&#x27;</span> /etc/grub.conf<br><br><span class="hljs-comment"># 替换/etc/inittab文件中&quot;id:3:initdefault&quot;一行中的数字5</span><br>sed <span class="hljs-string">&#x27;s@\(id:\)[0-9]\(:initdefault:\)@\15\2@g&#x27;</span> /etc/inittab <br><br><span class="hljs-comment"># 删除/etc/inittab文件中的空白行</span><br>sed <span class="hljs-string">&#x27;/^$/d&#x27;</span> /etc/inittab<br><br><span class="hljs-comment"># 删除/etc/inittab文件开头的#号</span><br>sed <span class="hljs-string">&#x27;s/^#//g&#x27;</span> /etc/inittab<br><br><span class="hljs-comment"># 删除某文件中开头的#及后面的空白字符，但要求#后面必须有空白字符</span><br>sed -r <span class="hljs-string">&#x27;s@^#[[:space:]]+@@&#x27;</span> /etc/inittab<br><br><span class="hljs-comment"># 删除某文件以空白字符且后边跟#号的开头的行的空白字符及#</span><br>sed <span class="hljs-string">&#x27;s/^[[:space:]+#//g&#x27;</span> /etc/inittab<br><br><span class="hljs-comment"># 取出一个文件路径的目录名称</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;/etc/rc.d&#x27;</span> |sed -r <span class="hljs-string">&#x27;s@^(/.*/)[^/]+/?@\1@g&#x27;</span>/etc/<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;/etc/rc.d&#x27;</span> |sed -r <span class="hljs-string">&#x27;s@^/.*/([^/]+)/?@\1@g&#x27;</span>rc.d<br></code></pre></td></tr></table></figure><h4 id="find">find</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 查找/var 下属主为root并且属组为mail的所有文件</span><br>find /var -user root -a -group mail<br><br><span class="hljs-comment"># 查找/usr 下不属于root,bin,或student的文件</span><br>find /usr -not \( -user root -o -user bin -o -user student \)<br>find  /usr -not -user root -a -not -user bin -not -user student<br><br><span class="hljs-comment"># 查找/etc 下最近一周内内容修改过的且不属于root及student用户的文件</span><br>find /etc -mtime -7 -not \( -user root -o -user student \)<br>find /etc -mtime -7 -not -user root -a -not -user student<br><br><span class="hljs-comment"># 查找当前系统上没有属主或属组且最近1天内被访问过的文件，并将其属主属组均改为root</span><br>find / \( -nouser -o -nogroup \) -a -atime -1 -<span class="hljs-built_in">exec</span> <span class="hljs-built_in">chown</span> root.root &#123;&#125; \;<br><br><span class="hljs-comment"># 查找/etc下大于1M 的文件，并将其文件名写入/tmp/etc.largefiles文件中</span><br>find /etc -size +1M -<span class="hljs-built_in">exec</span> <span class="hljs-built_in">echo</span> &#123;&#125; &gt;&gt;/tmp/etc.largefiles \;  <br>find /etc -size +1M &gt;&gt;/tmp/etc.largefiles<br><br><span class="hljs-comment"># xargs - build and execute command lines from standford input</span><br>find /etc -size +1M |xargs <span class="hljs-built_in">echo</span> &gt;&gt;/tmp/etc.largefiles <br><br><span class="hljs-comment"># 查找/etc下所有用户都没有写权限的文件，显示出详细信息</span><br>find /etc -not -perm /222 -<span class="hljs-built_in">ls</span><br></code></pre></td></tr></table></figure><h4 id="磁盘">磁盘</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 创建5G的分区，文件系统为ext3，卷标为MYDATA，块大小为1024，预留管理空间为磁盘分区3%，要求开机后自动挂载至/data目录，并且自动挂载的设备要使用卷标进行引导</span><br>mke2fs -t ext3 -L MYDATA -b 1024 -m 3 /dev/sda2<br>blkid<span class="hljs-comment"># 查看磁盘 UUID  TYPE  LABEL等属性  </span><br>tune2fs <span class="hljs-comment"># 调整文件系统属性 -L -m -o</span><br>dumpe2fs<span class="hljs-comment"># 显示文件属性信息  </span><br>fsck / e2fsck<br><br><span class="hljs-comment"># 上述如何操作，让其自动挂载的同时启用ACL功能</span><br>/etc/fstab<br>LABEL=<span class="hljs-string">&#x27;MYDATA&#x27;</span>/dataext3defaults,acl0 0<br><br><span class="hljs-comment"># 创建一个本地回环文件/var/swaptmp/swapfile来用于swap，要求大小为512MB，卷标为SWAP-FILE，且开机自动挂载此交换设备</span><br><br><span class="hljs-built_in">mkdir</span> /var/swaptmp<br><span class="hljs-built_in">dd</span> <span class="hljs-keyword">if</span>=/dev/zero of=/var/swaptmp/swapfile bs=1M count=512<br>mkswap LABLE=SWAP-FILE /var/swaptmp/swapfile<br><br>/var/swaptmp/swapfileswapswapdefaults0 0<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/e511c25d.html</id>
    <link href="https://anyu967.github.io/posts/e511c25d.html"/>
    <published>2019-10-31T09:12:13.000Z</published>
    <summary>
      <![CDATA[<p>2019-10-31]]>
    </summary>
    <title>Linux笔记</title>
    <updated>2026-02-22T05:33:39.842Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="linux, Redis" scheme="https://anyu967.github.io/categories/linux-Redis/"/>
    <category term="Redis" scheme="https://anyu967.github.io/tags/Redis/"/>
    <content>
      <![CDATA[<p>2019-09-14-Redis <span id="more"></span></p><h1 id="redis">Redis</h1><h2 id="介绍">介绍</h2><blockquote><p>Redis是完全开源免费的，遵守BSD协议，是一个高性能的key-value数据库。</p></blockquote><blockquote><p>Redis支持数据的持久化，可以将<code>内存中的数据</code>保存在磁盘中，重启的时候可以再次加载进行使用;Redis不仅仅支持简单的<code>key-value</code>类型的数据，同时还提供<code>list，set，zset，hash</code>等数据结构的存储;Redis支持<code>数据的备份</code>，即master-slave模式的数据备份。</p></blockquote><h2 id="安装">安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@anyue ~]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz<br>[root@anyue redis-5.0.5]# tar -xzf redis-5.0.5.tar.gz<br>[root@anyue redis-5.0.5]# make PREFIX=/usr/local/redis install <br>[root@anyue redis-5.0.5]# <span class="hljs-built_in">mkdir</span> /usr/local/redis/etc<br>[root@anyue redis-5.0.5]# <span class="hljs-built_in">cp</span> ./redis.conf /usr/local/redis/etc/<br>[root@anyue redis-5.0.5]# vim /usr/local/redis/etc/redis.conf   <br>  daemonize <span class="hljs-built_in">yes</span>  <br>[root@anyue redis-5.0.5]# <span class="hljs-built_in">ln</span> -s /usr/local/redis/bin/* /usr/local/bin <br>[root@anyue redis-5.0.5]# <span class="hljs-built_in">cp</span> /utils/redis_init_script /usr/local/redis/etc/  <span class="hljs-comment"># 启动脚本</span><br>[root@anyue redis-5.0.5]# vim /usr/local/redis/etc/redis_init_script  <br><span class="hljs-comment">#!/bin/sh</span><br><span class="hljs-comment"># chkconfig: 2345 80 90</span><br><span class="hljs-comment"># description: source package redis</span><br><br><span class="hljs-comment"># Simple Redis init.d script conceived to work on Linux systems</span><br><span class="hljs-comment"># as it does use of the /proc filesystem.</span><br><span class="hljs-comment">### BEGIN INIT INFO</span><br><span class="hljs-comment"># Provides:     redis_6379</span><br><span class="hljs-comment"># Default-Start:        2 3 4 5</span><br><span class="hljs-comment"># Default-Stop:         0 1 6</span><br><span class="hljs-comment"># Short-Description:    Redis data structure server</span><br><span class="hljs-comment"># Description:          Redis data structure server. See https://redis.io</span><br><span class="hljs-comment">### END INIT INFO</span><br><br>REDISPORT=6379<br>EXEC=/usr/local/redis/bin/redis-server<br>CLIEXEC=/usr/local/redis/bin/redis-cli<br><br>PIDFILE=/var/run/redis_<span class="hljs-variable">$&#123;REDISPORT&#125;</span>.pid<br>CONF=<span class="hljs-string">&quot;/usr/local/redis/etc/<span class="hljs-variable">$&#123;REDISPORT&#125;</span>.conf&quot;</span><br><br><span class="hljs-keyword">case</span> <span class="hljs-string">&quot;<span class="hljs-variable">$1</span>&quot;</span> <span class="hljs-keyword">in</span><br>start)<br><span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">$PIDFILE</span> ]; <span class="hljs-keyword">then</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$PIDFILE</span> exists, process is already running or crashed&quot;</span><br><span class="hljs-keyword">else</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Starting Redis server...&quot;</span><br><span class="hljs-variable">$EXEC</span> <span class="hljs-variable">$CONF</span> &amp;<br><span class="hljs-keyword">fi</span><br>;;<br>stop)<br><span class="hljs-keyword">if</span> [ ! -f <span class="hljs-variable">$PIDFILE</span> ]; <span class="hljs-keyword">then</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$PIDFILE</span> does not exist, process is not running&quot;</span><br><span class="hljs-keyword">else</span><br>PID=$(<span class="hljs-built_in">cat</span> <span class="hljs-variable">$PIDFILE</span>)<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Stopping ...&quot;</span><br><span class="hljs-variable">$CLIEXEC</span> -p <span class="hljs-variable">$REDISPORT</span> shutdown<br><span class="hljs-keyword">while</span> [ -x /proc/<span class="hljs-variable">$&#123;PID&#125;</span> ]<br><span class="hljs-keyword">do</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Waiting for Redis to shutdown ...&quot;</span><br><span class="hljs-built_in">sleep</span> 1<br><span class="hljs-keyword">done</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Redis stopped&quot;</span><br><span class="hljs-keyword">fi</span><br>;;<br>*)<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Please use start or stop as first argument&quot;</span><br>;;<br><span class="hljs-keyword">esac</span><br>[root@anyue redis-5.0.5]# <span class="hljs-built_in">ln</span> -s /usr/local/redis/etc/redis_init_script /etc/init.d/redisd  <br>[root@anyue redis-5.0.5]# chkconfig --add redisd`  <span class="hljs-comment"># 加入开机自启  </span><br></code></pre></td></tr></table></figure><h2 id="使用">使用</h2><h3 id="string-类型及操作">string 类型及操作</h3><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs autoit">[root<span class="hljs-symbol">@anyue</span> redis<span class="hljs-number">-5.0</span><span class="hljs-number">.5</span>]<span class="hljs-meta"># redis-cli -h 127.0.0.1 -p6379 -apasswd  # 远程</span><br></code></pre></td></tr></table></figure><h2 id="待续">待续。。。</h2>]]>
    </content>
    <id>https://anyu967.github.io/posts/bae4ff13.html</id>
    <link href="https://anyu967.github.io/posts/bae4ff13.html"/>
    <published>2019-09-14T01:30:20.000Z</published>
    <summary>
      <![CDATA[<p>2019-09-14-Redis]]>
    </summary>
    <title>Redis</title>
    <updated>2026-02-22T05:33:39.841Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Devops, linux, ES" scheme="https://anyu967.github.io/categories/Devops-linux-ES/"/>
    <category term="linux" scheme="https://anyu967.github.io/tags/linux/"/>
    <category term="Devops" scheme="https://anyu967.github.io/tags/Devops/"/>
    <category term="ES" scheme="https://anyu967.github.io/tags/ES/"/>
    <content>
      <![CDATA[<p>2019-09-14-ElasticSearch <span id="more"></span></p><h2 id="rsync-同步服务">rsync 同步服务：</h2><h3 id="rsync基本使用">rsync基本使用：</h3><table><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td>-a</td><td>归档模式</td></tr><tr><td>-v</td><td>显示同步过程</td></tr><tr><td>-z</td><td>传输时压缩</td></tr></tbody></table><ul><li>下载: rsync -avz 服务器IP:/服务器目录/file /本地目录<br /><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs ruby">  rsync -avz root<span class="hljs-variable">@192</span>.<span class="hljs-number">168.37</span>.<span class="hljs-number">10</span><span class="hljs-symbol">:/filesrc/text</span>.txt /filedst/<br>  <span class="hljs-string">``</span><span class="hljs-string">`  </span><br><span class="hljs-string"></span><br><span class="hljs-string">+ 上传: rsync -avz /本地目录/file 服务器IP:/服务器目录/*  </span><br></code></pre></td></tr></table></figure> rsync -avz /filedst/test.txtroot@192.168.37.10:/filesrc/ <figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs csharp">    <br>*ssh-keygen -t rsa -b <span class="hljs-number">2048</span>*  <br>*ssh-copy-id root@<span class="hljs-number">192.168</span><span class="hljs-number">.37</span><span class="hljs-number">.20</span>*  <br><br><span class="hljs-meta">#### rsync服务端(NFS服务器)</span><br>```bash<br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># vim /etc/rsyncd.conf  </span><br>  address = <span class="hljs-number">192.168</span><span class="hljs-number">.37</span><span class="hljs-number">.10</span> <span class="hljs-meta">#rsync服务绑定IP</span><br>  port = <span class="hljs-number">873</span><br>  log <span class="hljs-keyword">file</span> =/<span class="hljs-keyword">var</span>/log/rsyncd.log <br>  pid <span class="hljs-keyword">file</span> = /<span class="hljs-keyword">var</span>/run/rsyncd.pid<br>  [<span class="hljs-meta">web</span>]<br>      comment = web directory backup<br>      path = /filesrc<br>      read only = no<br>      dont commpress = *.gz *.bz2<br>      auth users =user1   <span class="hljs-meta"># 非系统用户, 自行创建</span><br>      secrets <span class="hljs-keyword">file</span> = /etc/rsyncd_users.db<br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># vim /etc/rsyncd_users.db   </span><br>  user1:<span class="hljs-number">123456</span><br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># chmod 600 /etc/rsyncd_users.db </span><br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># rsync --daemon  </span><br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># netstat -antp |grep :873  </span><br>[<span class="hljs-meta">root@xy ~</span>]<span class="hljs-meta"># setfacl -m u:nobody:rwx /filesrc </span><br></code></pre></td></tr></table></figure></li></ul><h4 id="客户端">客户端</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@xy ~]# rsync -avz rsync://user1@192.168.37.10/filesrc /filedst      <span class="hljs-comment"># 下载 </span><br>[root@xy ~]# rsync -avz /filedst/* rsync://user1@192.168.37.10/filesrc`   <span class="hljs-comment"># 上传    </span><br></code></pre></td></tr></table></figure><h3 id="rsync基于xinetd-inotifywait-实现单向实时同步">rsync(基于xinetd)+ inotifywait 实现单向实时同步：</h3><table><thead><tr><th>inotifywait 命令选项</th><th>说明</th></tr></thead><tbody><tr><td>-m</td><td>始终保持监听</td></tr><tr><td>-r</td><td>递归查询目录</td></tr><tr><td>-q</td><td>只打印监控事件信息</td></tr></tbody></table><h4 id="服务端">服务端</h4><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs perl">[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># yum -y install gcc*  </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># tar -xvf inotify-tools-3.14.tar.gz </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># cd inotify-tools-3.14.tar.gz</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># ./configure &amp;&amp; make make install  </span><br><br><span class="hljs-comment"># 监控动作：modify,create,attrib,move,delete </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># inotifywait -mrq -e 监控动作1,监控动作2 /监控目录 &amp;     </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># inotifywait -mrq -e create,delete,modify /filesrc &amp;   </span><br>  <span class="hljs-comment">#!/bin/bash  </span><br>  Inotfiy = <span class="hljs-string">&quot;inotifywait -mrq -e create,delete,modify /filesrc&quot;</span><br>  Rsync = <span class="hljs-string">&quot;rsync -avz /filesrc/* root<span class="hljs-variable">@192</span>.168.37.20:/filedst&quot;</span><br>  <span class="hljs-variable">$Inotfiy</span> | <span class="hljs-keyword">while</span> <span class="hljs-keyword">read</span> directory event file<br>  <span class="hljs-keyword">do</span><br>     <span class="hljs-variable">$Rsync</span><br>  done  <br></code></pre></td></tr></table></figure><h3id="rsync基于xinetd-unison-inotify-实现双向实时同步">rsync(基于xinetd) +unison + inotify 实现双向实时同步：</h3><h4 id="服务端192.168.37.10">服务端(192.168.37.10)</h4><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs perl">[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># tar -xzvf inotify-tools-3.14.tar.gz  </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># cd inotify-tools-3.14</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># ./configure &amp;&amp; make &amp;&amp; make install  </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># tar -xzvf ocaml-3.10.1.tar.gz </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># cd ocmal-3.10.1</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># ./configure</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># make world opt</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># make install</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># tar -xzvf unison-2.13.16.tar.gz</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># cd unison-2.13.16</span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># make UISTYLE=text THREADS=true STATIC=true  </span><br>[root<span class="hljs-variable">@xy</span> ~]<span class="hljs-comment"># cp unison /usr/local/bin </span><br>  <span class="hljs-comment">#!/bin/bash  </span><br>  Inotfiy = <span class="hljs-string">&quot;inotifywait -mrq -e create,delete,modify /filesrc&quot;</span><br>  Unison = <span class="hljs-string">&quot;/usr/local/bin/unison -batch /filesrc ssh://192.168.37.20/filedst&quot;</span><br>  <span class="hljs-variable">$Inotfiy</span> | <span class="hljs-keyword">while</span> <span class="hljs-keyword">read</span> directory event file<br>  <span class="hljs-keyword">do</span><br>     <span class="hljs-variable">$Unison</span><br>  done<br></code></pre></td></tr></table></figure><h4 id="客户端192.168.37.20">客户端(192.168.37.20)</h4><blockquote><p>安装inotify-tools-3.14.tar.gz，ocaml-3.10.1.tar.gz，unison-2.13.16.tar.gz</p></blockquote><p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash  </span><br>Inotfiy = <span class="hljs-string">&quot;inotifywait -mrq -e create,delete,modify /filesrc&quot;</span><br>Unison = <span class="hljs-string">&quot;/usr/local/bin/unison -batch /filedst ssh://192.168.37.10/filesrc&quot;</span><br><span class="hljs-variable">$Inotfiy</span> | <span class="hljs-keyword">while</span> <span class="hljs-built_in">read</span> directory event file<br><span class="hljs-keyword">do</span><br>  <span class="hljs-variable">$Unison</span><br><span class="hljs-keyword">done</span><br></code></pre></td></tr></table></figure></p><h2 id="linux-日志概述">Linux 日志概述</h2><h3 id="系统常见日志文件">系统常见日志文件</h3><ul><li>syslog服务<ul><li>syslogd：系统</li><li>klogd：内核</li></ul></li></ul><table><thead><tr><th>日志文件</th><th>说明</th></tr></thead><tbody><tr><td>/var/log/cron</td><td>定时任务log</td></tr><tr><td>/var/log/cpus</td><td>打印信息log</td></tr><tr><td>/var/log/dmesg</td><td>内核自检log, <code>dmesg</code></td></tr><tr><td>/var/log/btmp</td><td>错误登录log, 二进制格式, 用<code>lastb</code>查看</td></tr><tr><td>/var/log/lastlog</td><td>最后一次登录时间log, <code>lastlog</code>查看</td></tr><tr><td>/var/log/mailog</td><td>邮件log</td></tr><tr><td><strong>/var/log/messages</strong></td><td>系统重要信息log</td></tr><tr><td>/var/log/secure</td><td>验证与授权log</td></tr><tr><td>/var/log/wtmp</td><td>永久记录所有用户登录, <code>last</code>查看</td></tr><tr><td>/var/run/utmp</td><td>当前已经登录用户信息, <code>w who users</code>查看</td></tr><tr><td>/var/log/httpd</td><td>RPM安装apache服务默认日志目录</td></tr></tbody></table><h3 id="日志格式-syslog-服务">日志格式: syslog 服务</h3><p>配置路径: <code>/etc/syslog.conf</code><br />配置格式: <code>日志服务[链接符号]日志等级   日志记录位置</code><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs basic"><span class="hljs-symbol">35 </span># Include all config <span class="hljs-keyword">files</span> in /etc/rsyslog.d/<br><span class="hljs-symbol">36 </span>$IncludeConfig /etc/rsyslog.d/*.conf<br><span class="hljs-symbol">54 </span>*.info;mail.none;authpriv.none;cron.none      /var/<span class="hljs-keyword">log</span>/messages <br><span class="hljs-symbol">55 </span>authpriv.*                                   /var/<span class="hljs-keyword">log</span>/secure<br><span class="hljs-symbol">56 </span>*.emerg                                      *   # 每个用户<br><span class="hljs-symbol">60 </span>mail.*                                      -/var/<span class="hljs-keyword">log</span>/maillog    # 异步写入<br></code></pre></td></tr></table></figure></p><table><thead><tr><th>日志等级（从低到高）</th><th>说明(级别越低，信息越详细)</th></tr></thead><tbody><tr><td>debug</td><td>一般调试信息</td></tr><tr><td>info</td><td>基本通知信息</td></tr><tr><td>notice</td><td>普通信息</td></tr><tr><td>wraning</td><td>警告信息</td></tr><tr><td>err/error</td><td>错误信息</td></tr><tr><td>crit</td><td>大于err</td></tr><tr><td>alert</td><td>警告,大于crit</td></tr><tr><td>emerg/panic</td><td>会导致系统不可用</td></tr><tr><td>*</td><td>所有日志等级</td></tr><tr><td>none</td><td>和* 相反</td></tr></tbody></table><h3 id="日志轮替-logrotate切割轮替">日志轮替 logrotate(切割,轮替)</h3><blockquote><p>旧日志移动开改名,同时建立新的空日志文件,当旧日志文件超出保存范围,会进行删除,系统自带配置文件<code>/etc/logrotate.conf</code></p></blockquote><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs basic"><span class="hljs-symbol">20 </span># no packages own wtmp <span class="hljs-keyword">and</span> btmp -- we<span class="hljs-comment">&#x27;ll rotate them here</span><br><span class="hljs-symbol">21 </span>/var/<span class="hljs-keyword">log</span>/wtmp &#123;<br><span class="hljs-symbol">22 </span>    monthly<br><span class="hljs-symbol">23 </span>    create <span class="hljs-number">0664</span> root utmp<br><span class="hljs-symbol">24 </span>    minsize <span class="hljs-number">1</span>M<br><span class="hljs-symbol">25 </span>    rotate <span class="hljs-number">1</span><br><span class="hljs-symbol">26 </span>&#125;<br></code></pre></td></tr></table></figure><table><thead><tr><th>配置参数</th><th>说明</th></tr></thead><tbody><tr><td>daily</td><td>日志轮替周期是每天</td></tr><tr><td>weekly</td><td>每周</td></tr><tr><td>monthly</td><td>每月</td></tr><tr><td>compress</td><td>日志轮替时,压缩旧日志</td></tr><tr><td>rotate</td><td>保留日志个数</td></tr><tr><td>create mode owner group</td><td>建立新日志,指定权限与所有者/所属组</td></tr><tr><td>mail address</td><td>发送邮件</td></tr><tr><td>missingok</td><td>日志不存在忽略日志警告信息</td></tr><tr><td>notifempty</td><td>若日志为空,不进行轮替</td></tr><tr><td>minsize</td><td>轮替最小值</td></tr><tr><td>size</td><td>大于size才会轮替</td></tr><tr><td>dateext</td><td>使用日期作为轮替文件后缀</td></tr><tr><td>sharedscripts</td><td>此关键字后脚本只执行一次</td></tr><tr><td>prerotate/endscript</td><td>轮替前执行脚本</td></tr><tr><td>postrotate/endscript</td><td>轮替后执行脚本</td></tr></tbody></table><h2id="elkelasticsearchlogstashkibana">ELK(Elasticsearch+Logstash+Kibana)</h2>### ELK日志分析：<div id="ELK"></div><blockquote><p><strong>ELK</strong>是三个开源软件的缩写，分别表示：<strong>Elasticsearch、Logstash、Kibana</strong>它们都是开源软件,新增了<strong>FileBeat</strong>，轻量级的日志收集处理工具；</p></blockquote><ul><li><strong>Filebeat</strong>：属于Beats<ul><li><strong>Filebeat</strong>：搜集文件数据 √</li><li><strong>Packetbeat</strong>：搜集网络流量数据</li><li><strong>Topbeat</strong>：搜集系统、进程和文件系统级别的CPU和内存使用情况<br /></li><li><strong>Winlogbeat</strong>：搜集Windows事件日志数据</li></ul></li><li><strong>Logstash(5044)</strong>：负责日志的收集、分析、功率，支持大量数据获取方式，C/S架构，client端安装在需要收集日志的主机上，server端负责将收集到的节点日志进行过滤发至Elastiserach上;</li><li><strong>ElastiSearch(9200)</strong>：开源分布式搜索引擎，提供搜集、分析、存储数据三大功能;</li><li><strong>Kibana(5601)</strong>：为 Logstash 和 Elasticserach 提供Web界面;</li></ul><img src="/posts/3eb5a9f1/ELK.jpg" class="" title="[ELK]"><img src="/posts/3eb5a9f1/ELK-Filebeat.jpg" class="" title="[ELK-Filebeat]"><h3 id="数据存储">数据存储</h3><h4 id="索引-分片-副本">索引 分片 副本</h4><ul><li><a href="https://my.oschina.net/kenblog/blog/3009800">参考</a></li><li><code>index索引</code>:就类似于关系型数据库的<code>数据库</code>，数据库建立好，然后就把数据存到index中；<ul><li><code>Mapping</code>:定义文档字段的类型；</li><li><code>Settimt</code>:定义不同数据分布；</li></ul></li><li><code>shard分片</code>:对于分布式的搜索引擎,<strong>索引通常都会分解成不同部分</strong>,而这些分布在不同节点的数据就是分片,<code>一个分片只存储一部分数据</code>，所有分片加起来就是一个完整的索引数据；<ul><li>分片分为primaryshard主分片和replica副本分片,一个索引可以创建多个分片数量，es默认创建的就是5个主分片数量，可以根据自己的实际业务确定主分片数量;</li><li>注意的是主分片数量一旦确定创建就无法进行修改。</li></ul></li><li><code>replica副本</code>:就是对主分片（Primary shard）的备份；<ul><li>每个主分片（primary shard）不会和副本分片（replicashard）存在于同一个节点中，有效的保证es的数据高可用性；</li></ul></li></ul><h3 id="elk-服务端部署192.168.37.10">ELK 服务端部署(192.168.37.10)</h3><ul><li><ahref="https://blog.csdn.net/wo18237095579/article/details/103880397/">Docker部署01</a></li><li><ahref="https://www.cnblogs.com/dalianpai/p/11986481.html">Docker部署02</a></li><li><ahref="https://www.cnblogs.com/cocowool/p/deploy_elk_and_collect_logs_via_filebeat.html">K8S部署</a></li></ul><h4 id="配置java环境">配置JAVA环境</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@xy elk]# <span class="hljs-built_in">mkdir</span> /usr/local/java<br>[root@xy elk]# tar -xzvf  jdk-8u261-linux-x64.tar.gz -C /usr/local/java<br>[root@xy ~]# vim /etc/profile<br>  <span class="hljs-comment"># JAVA ENVIRONMENT</span><br>  <span class="hljs-built_in">export</span> JAVA_HOME=/usr/local/java/jdk1.8.0_261<br>  <span class="hljs-built_in">export</span> CLASSPATH=.:<span class="hljs-variable">$JAVA_HOME</span>/jre/lib/rt.jar:<span class="hljs-variable">$JAVA_HOME</span>/lib/dt.jar:<span class="hljs-variable">$JAVA_HOME</span>/lib/tools.jar<br>  <span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:<span class="hljs-variable">$JAVA_HOME</span>/bin<br>[root@xy ~]# <span class="hljs-built_in">source</span> /etc/profile<br>[root@xy ~]# java -version   <span class="hljs-comment"># 验证</span><br></code></pre></td></tr></table></figure><h4 id="安装包">安装包</h4><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs autoit">[root<span class="hljs-symbol">@xy</span> ~]<span class="hljs-meta"># mkdir /elk<span class="hljs-comment">;cd /elk  </span></span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz</span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.tar.gz</span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.3-linux-x86_64.tar.gz</span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># tar -xzvf elasticsearch-6.2.3.tar.gz </span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># tar -xzvf logstash-6.2.3.tar.gz</span><br>[root<span class="hljs-symbol">@xy</span> elk]<span class="hljs-meta"># tar -xf kibana-6.2.3-linux-x86_64.tar.gz  </span><br></code></pre></td></tr></table></figure><h4 id="配置-elasticserch">配置 elasticserch</h4><figure class="highlight crystal"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs crystal">[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># chown -Rf root:root kibana-6.2.3-linux-x86_64</span><br>[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># cp -a elasticsearch-6.2.3/ logstash-6.2.3/ kibana-6.2.3-linux-x86_64/ /usr/local</span><br>[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># yum install -y java-1.8*   # JAVA 环境</span><br>[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># useradd elasticsearch   </span><br>[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># chown elasticsearch:elasticsearch /usr/local/elasticsearch-6.2.3/</span><br>[root<span class="hljs-variable">@xy</span> elk]<span class="hljs-comment"># su elasticsearch  # 以elasticsearch 用户运行</span><br>[elasticsearch<span class="hljs-variable">@xy</span> elasticsearch-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-variable">$ </span>./bin/elasticsearch -d  <br>[elasticsearch<span class="hljs-variable">@xy</span> elasticsearch-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-variable">$ </span>netstat -antp  <span class="hljs-comment"># 9200端口  </span><br>[elasticsearch<span class="hljs-variable">@xy</span> elasticsearch-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-variable">$ </span>cat /usr/local/elasticserch-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>/logs/elasticsearch.log<br>[elasticsearch<span class="hljs-variable">@xy</span> elasticsearch-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-variable">$ </span>curl <span class="hljs-symbol">localhost:</span><span class="hljs-number">9200</span>  <br></code></pre></td></tr></table></figure><h4 id="配置-logstash">配置 logstash</h4><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs livescript">[root@xy logstash-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-comment"># vim /vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns   </span><br>  <span class="hljs-comment"># Nginx log</span><br>  WZ ([^ ]*)<br>  NGINXACCESS %&#123;IP:remote_ip&#125; <span class="hljs-string">\-</span> <span class="hljs-string">\-</span> <span class="hljs-string">\[%&#123;HTTPDATE:timestamp&#125;\]</span> <span class="hljs-string">&quot;%&#123;WORD:method&#125; %&#123;WZ:request&#125; HTTP/%&#123;NUMBER:httpversion&#125;&quot;</span> %&#123;NUMBER:status&#125; %&#123;NUMBER:bytes&#125; %&#123;QS:referer&#125; %&#123;QS:agent&#125; %&#123;QS:xforward&#125;<br>   <br>[root@xy logstash-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-comment"># vim /usr/local/logstash-6.2.3/default.conf </span><br>  input &#123;<br>      beats&#123;<br>          port =&gt; <span class="hljs-string">&quot;5044&quot;</span><br>      &#125;<br>  &#125;<br>  <span class="hljs-comment"># 数据过滤</span><br>  filter &#123;<br>      grok &#123;<br>          match =&gt; &#123; <span class="hljs-string">&quot;message&quot;</span> =&gt; <span class="hljs-string">&quot;%&#123;NGINXACCESS&#125;&quot;</span> &#125;<br>      &#125;<br>      geoip &#123;<br>          <span class="hljs-comment"># nginx 客户端 ip</span><br>          source =&gt; <span class="hljs-string">&quot;192.168.37.20&quot;</span><br>      &#125;<br>  &#125;<br>  <span class="hljs-comment"># 输出配置为本机的 9200 端口,这是elasticsearch 服务的监听端口</span><br>  output &#123;<br>      elasticsearch &#123;<br>          hosts =&gt; [<span class="hljs-string">&quot;127.0.0.1:9200&quot;</span>]<br>      &#125;<br>  &#125;<br>    <br>[root@xy logstash-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-comment"># nohup ./bin/logstash -f default.conf &amp;</span><br>[root@xy logstash-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-comment"># tail -f nohup.out</span><br>[root@xy logstash-<span class="hljs-number">6.2</span>.<span class="hljs-number">3</span>]<span class="hljs-comment"># netstat -antp | grep 5044    </span><br></code></pre></td></tr></table></figure><h4 id="配置-kibana">配置 Kibana</h4><figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs llvm">[root<span class="hljs-title">@xy</span> kibana<span class="hljs-number">-6.2</span>.<span class="hljs-number">3</span>-linux-<span class="hljs-keyword">x</span><span class="hljs-number">86</span>_<span class="hljs-number">64</span>]# vim /usr/local/kibana<span class="hljs-number">-6.2</span>.<span class="hljs-number">3</span>-linux-<span class="hljs-keyword">x</span><span class="hljs-number">86</span>_<span class="hljs-number">64</span>/config/kibana.yml  <br>  server.host: <span class="hljs-string">&quot;192.168.37.10&quot;</span><br>[root<span class="hljs-title">@xy</span> kibana<span class="hljs-number">-6.2</span>.<span class="hljs-number">3</span>-linux-<span class="hljs-keyword">x</span><span class="hljs-number">86</span>_<span class="hljs-number">64</span>]# nohup ./bin/kibana &amp;<br>[root<span class="hljs-title">@xy</span> kibana<span class="hljs-number">-6.2</span>.<span class="hljs-number">3</span>-linux-<span class="hljs-keyword">x</span><span class="hljs-number">86</span>_<span class="hljs-number">64</span>]# <span class="hljs-keyword">tail</span> -f nohup.out<br>[root<span class="hljs-title">@xy</span> kibana<span class="hljs-number">-6.2</span>.<span class="hljs-number">3</span>-linux-<span class="hljs-keyword">x</span><span class="hljs-number">86</span>_<span class="hljs-number">64</span>]# netstat -antp | grep <span class="hljs-number">5601</span>  <br># 测试：<span class="hljs-number">192.168</span>.<span class="hljs-number">37.10</span>:<span class="hljs-number">5601</span>   # Kibana 测试地址<br></code></pre></td></tr></table></figure><h4 id="问题解决">问题解决：</h4><ul><li><p>max file descriptors [4096] for elasticsearch process is too low,increase to at least [65535] <figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs stata">[elasticsearch@xy ~]$ sudo vim /etc/security/limits.<span class="hljs-keyword">conf</span><br><span class="hljs-comment">  * soft    nofile          65536</span><br><span class="hljs-comment">  *    hard    nofile          65536</span><br></code></pre></td></tr></table></figure></p></li><li><p>dockercompose部署ES遇到 Error opening log file ‘logs/gc.log’:Permission denied</p><ul><li><ahref="https://blog.csdn.net/qq_15256981/article/details/88605824">参考</a><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">- TAKE_FILE_OWNERSHIP=<span class="hljs-literal">true</span>  <span class="hljs-comment">#volumes 挂载权限问题</span><br></code></pre></td></tr></table></figure></li></ul></li></ul><h4 id="nginx部署192.168.37.20">Nginx部署(192.168.37.20)</h4><figure class="highlight coffeescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs coffeescript">[root@xy ~]<span class="hljs-comment"># yum install -y nginx  </span><br>[root@xy ~]<span class="hljs-comment"># wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.3-linux-x86_64.tar.gz  </span><br>[root@xy ~]<span class="hljs-comment"># tar -xzf ./filebeat-6.2.3-linux-x86_64.tar.gz -C /usr/local/  </span><br>[root@xy filebeat<span class="hljs-number">-6.2</span><span class="hljs-number">.3</span>-linux-x86_64]<span class="hljs-comment"># vim filebeat.yml  </span><br>  enable：<span class="hljs-literal">false</span>                 <span class="hljs-comment">#修改为true</span><br>  paths：<span class="hljs-regexp">/var/log/</span>*.log         <span class="hljs-comment">#修改为/var/log/nginx/*.log</span><br>  <span class="hljs-comment">#output.elasticsearch:        #将此行注释掉</span><br>  <span class="hljs-comment">#hosts: [&quot;localhost:9200&quot;]    #将此行注释掉</span><br>  output.logstash:              <span class="hljs-comment">#取消此行注释</span><br>  hosts: [<span class="hljs-string">&quot;192.168.37.10:5044&quot;</span>] <span class="hljs-comment">#取消此行注释并修改IP 地址为ELK 服务器地址</span><br>[root@xy filebeat<span class="hljs-number">-6.2</span><span class="hljs-number">.3</span>-linux-x86_64]<span class="hljs-comment"># nohup ./filebeat -e -c filebeat.yml &amp;  </span><br>[root@xy filebeat<span class="hljs-number">-6.2</span><span class="hljs-number">.3</span>-linux-x86_64]<span class="hljs-comment"># tailf nohup.out  </span><br></code></pre></td></tr></table></figure><img src="/posts/3eb5a9f1/ELK.png" class="" title="[ELK]"><img src="/posts/3eb5a9f1/ELK01.png" class="" title="[ELK配置-01]"><img src="/posts/3eb5a9f1/ELK02.png" class="" title="[ELK配置-02]"><h3 id="设置服务自启动">设置服务自启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment">#!bin/bash</span><br><span class="hljs-comment"># chkconfig: 2345 21  89</span><br><span class="hljs-comment"># description: elasticsearch</span><br><br><span class="hljs-comment"># JAVA_HOME=/usr/local/jdk1.8</span><br>ES_HOME=/usr/local/elasticsearch<br><span class="hljs-keyword">case</span> <span class="hljs-variable">$1</span> <span class="hljs-keyword">in</span><br>    start) <span class="hljs-built_in">sudo</span> -iu elasticsearch <span class="hljs-variable">$ES_HOME</span>/bin/elasticsearch &amp;;;<br>    *)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;require start&quot;</span>;;<br><span class="hljs-keyword">esac</span><br>------------------------------------<br><br><span class="hljs-comment">#!/bin/bash</span><br><span class="hljs-comment"># chkconfig: 2345 50  50</span><br><span class="hljs-comment"># description: logstash</span><br><br>LS_HOME=/usr/local/logstash<br><span class="hljs-keyword">case</span> <span class="hljs-variable">$1</span> <span class="hljs-keyword">in</span><br>    start)<span class="hljs-built_in">sudo</span> -iu elasticsearch <span class="hljs-variable">$LS_HOME</span>/bin/logstash -f <span class="hljs-variable">$LS_HOME</span>/config &amp;;;<br>    *) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;require start&quot;</span>;;<br><span class="hljs-keyword">esac</span><br>-----------------------------------<br><br><span class="hljs-comment">#!/bin/bash</span><br><span class="hljs-comment"># chkconfig: 2345 98  02</span><br><span class="hljs-comment"># description: kibana</span><br><br>KIBANA_HOME=/usr/local/kibana<br><span class="hljs-keyword">case</span> <span class="hljs-variable">$1</span> <span class="hljs-keyword">in</span><br>    start) <span class="hljs-variable">$KIBANA_HOME</span>/bin/kibana &amp;;;<br>    *) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;require start&quot;</span>;;<br><span class="hljs-keyword">esac</span><br></code></pre></td></tr></table></figure><h3 id="tomcat-服务自启动">tomcat 服务自启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-comment"># description: Tomcat8 Start Stop Restart</span><br><span class="hljs-comment"># processname: tomcat8</span><br><span class="hljs-comment"># chkconfig: 234 20 80</span><br><br>CATALINA_HOME=/usr/local/tomcat8/<br><br><span class="hljs-keyword">case</span> <span class="hljs-variable">$1</span> <span class="hljs-keyword">in</span><br>    start)<br>        sh <span class="hljs-variable">$CATALINA_HOME</span>/bin/startup.sh<br>        ;;<br>    stop)<br>        sh <span class="hljs-variable">$CATALINA_HOME</span>/bin/shutdown.sh<br>        ;;<br>    restart)<br>        sh <span class="hljs-variable">$CATALINA_HOME</span>/bin/shutdown.sh<br>        sh <span class="hljs-variable">$CATALINA_HOME</span>/bin/startup.sh<br>        ;;<br>    *)<br>        <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;please use : tomcat &#123;start | stop | restart&#125;&#x27;</span><br>        ;;<br><span class="hljs-keyword">esac</span><br><span class="hljs-built_in">exit</span> 0<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/3eb5a9f1.html</id>
    <link href="https://anyu967.github.io/posts/3eb5a9f1.html"/>
    <published>2019-09-14T00:30:20.000Z</published>
    <summary>
      <![CDATA[<p>2019-09-14-ElasticSearch]]>
    </summary>
    <title>ES</title>
    <updated>2026-02-22T05:33:39.834Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="python" scheme="https://anyu967.github.io/categories/python/"/>
    <category term="python" scheme="https://anyu967.github.io/tags/python/"/>
    <content>
      <![CDATA[<p>2019-09-10-python <span id="more"></span></p><h2 id="python">python</h2><blockquote><p>注释： <code>单行#comment  多行'''comment''' """comment"""</code></p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash">python2 -m pip install --upgrade pip  <br>pip install virtualenv virtualenvwrapper  <br>virtualenv testvir  <br>active.bat 或者 deactive.bat  <br>pip install flask  <br>pip freeze &gt;requirements.txt  <br></code></pre></td></tr></table></figure><h2 id="基础语法">基础语法</h2><img src="/posts/a4d4b8b8/python01.png" class="" title="[python01]"><img src="/posts/a4d4b8b8/python02.png" class="" title="[python02]"><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> package <span class="hljs-keyword">import</span> module  <br><span class="hljs-keyword">import</span> module <span class="hljs-keyword">as</span> alias<br></code></pre></td></tr></table></figure><h3 id="变量和数据类型">变量和数据类型</h3><blockquote><p>对象（object）是内存中专门用来存储数据的一块区域，<code>id</code>&amp;&amp; <code>type</code> &amp;&amp; <code>value</code></p></blockquote><blockquote><p>变量和对象：</p><p>(1)对象并没有直接存储到变量中，Python中<code>变量更像是给对象起了一个别名</code>；</p><p>(2)<code>变量中存储的不是对象的值，而是对象的id（内存地址）</code>，使用变量时，实际上就是在<code>通过对象id在查找对象</code>；</p><p>(3)变量中保存的对象，只有在为变量重新赋值时才会改变；</p><p>(4)变量和变量之间是相互独立的，修改一个变量不会影响另一个变量</p></blockquote><blockquote><p>python中的数据类型: 不可变(<code>Number/String/Tuple</code>) 和可变(<code>list/dict/set</code>)，不可变值得是不允许变量的值发生变化，如果改变变量的值，相当于新建了一个对象，而对于相同值的对象，在内存中只有一个对象。</p></blockquote><blockquote><p>如果改变数字数据类型的值，意味着是一个新的对象，将会重新分配内存空间</p></blockquote><blockquote><p>判断是否引用的是同一个对象: x is y,类似于id(x)===id(y)</p></blockquote><h4 id="数据类型">数据类型</h4><ul><li><p>整数、浮点数(1.23x10^9: 1.23e9)</p></li><li><p>字符串 <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-string">&#x27;abc&#x27;</span>, <span class="hljs-string">&quot;xyz&quot;</span>         &gt;&gt; abc xyz<br><span class="hljs-string">&#x27;I\&#x27;m\&quot;OK\&quot;!&#x27;</span>        &gt;&gt; I<span class="hljs-string">&#x27;m OK！</span><br><span class="hljs-string">r&#x27;</span>\\\t\\<span class="hljs-string">&#x27;            &gt;&gt; &#x27;</span>\\\t\\<span class="hljs-string">&#x27;  # 原始字符串r</span><br><span class="hljs-string">r&#x27;</span><span class="hljs-string">&#x27;&#x27;</span>hello,\nworld<span class="hljs-string">&#x27;&#x27;&#x27; &gt;&gt; &#x27;hello,\\nworld&#x27;</span><br></code></pre></td></tr></table></figure></p></li><li><p>布尔值 <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">and</span>: ture <span class="hljs-keyword">and</span> flase  &gt;&gt; false<br><span class="hljs-keyword">or</span>:  false <span class="hljs-keyword">or</span> true   &gt;&gt; true<br><span class="hljs-keyword">not</span>: <span class="hljs-keyword">not</span> false       &gt;&gt; true<br></code></pre></td></tr></table></figure></p></li></ul><h4 id="变量">变量</h4><blockquote><p>变量名必须是<code>大小写英文、数字和_</code>的组合，且不能用数字开头,Python支持多种数据类型，在计算机内部，可以把任何数据都看成一个<code>“对象”</code>，而<code>变量</code>就是在程序中用来<code>指向这些数据对象</code>的，对变量赋值就是把数据和变量给关联起来.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># -*- coding: utf-8 -*-</span><br>a = <span class="hljs-string">&#x27;ABC&#x27;</span><span class="hljs-comment"># 内存中创建&#x27;ABC&#x27;字符串</span><br>b = a<span class="hljs-comment"># 内存创建变量b指向&#x27;ABC&#x27;</span><br>a = <span class="hljs-string">&#x27;XYZ&#x27;</span>   <span class="hljs-comment"># 创建&#x27;XYZ&#x27;, 将a指向此字符串</span><br><span class="hljs-built_in">print</span>(b)<br><br>&gt;&gt; ABC<br></code></pre></td></tr></table></figure><h3 id="字符串和编码">字符串和编码</h3><h4 id="python-3版本中字符串是以unicode编码">Python3版本中，字符串是以<code>Unicode</code>编码</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">ord</span>(<span class="hljs-string">&#x27;中&#x27;</span>)  &gt;&gt; <span class="hljs-number">20013</span><br><span class="hljs-built_in">chr</span>(<span class="hljs-number">25991</span>) &gt;&gt; <span class="hljs-string">&#x27;文&#x27;</span><br><br><span class="hljs-string">&#x27;中文&#x27;</span>.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>)<br>&gt;&gt; <span class="hljs-string">b&#x27;\xe4\xb8\xad\xe6\x96\x87&#x27;</span><br><br><span class="hljs-string">b&#x27;\xe4\xb8\xad\xff&#x27;</span>.decode(<span class="hljs-string">&#x27;utf-8&#x27;</span>, errors=<span class="hljs-string">&#x27;ignore&#x27;</span>)<br>&gt;&gt; <span class="hljs-string">&#x27;中&#x27;</span><br><br><span class="hljs-built_in">len</span>(<span class="hljs-string">b&#x27;ABC&#x27;</span>)  &gt;&gt; <span class="hljs-number">3</span><span class="hljs-comment"># 字节</span><br><span class="hljs-built_in">len</span>(<span class="hljs-string">&#x27;中文&#x27;</span>.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>))  &gt;&gt; <span class="hljs-number">6</span><br></code></pre></td></tr></table></figure><h4 id="格式化输出">格式化输出(<code>%</code>)</h4><ul><li><p>%s %d %? <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-string">&#x27;Hello, %s&#x27;</span> % <span class="hljs-string">&#x27;world&#x27;</span>    &gt;&gt; <span class="hljs-string">&#x27;Hello, world&#x27;</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;%2d-%02d&#x27;</span> % (<span class="hljs-number">3</span>, <span class="hljs-number">1</span>))  &gt;&gt; 补空格<span class="hljs-number">3</span>-01<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;%.2f&#x27;</span> % <span class="hljs-number">3.1415926</span>)   &gt;&gt; <span class="hljs-number">3.14</span><br></code></pre></td></tr></table></figure></p></li><li><p>format() <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-string">&#x27;Hello, &#123;0&#125;, 成绩提升了&#123;1:.1f&#125;%&#x27;</span>.<span class="hljs-built_in">format</span>(<span class="hljs-string">&#x27;小明&#x27;</span>, <span class="hljs-number">17.125</span>)  &gt;&gt; <span class="hljs-string">&#x27;Hello, 小明, 成绩提升了17.1%&#x27;</span> <br></code></pre></td></tr></table></figure></p></li><li><p>格式化字符串</p><ul><li>格式化字符串，可以通过在字符串前添加一个f来创建一个格式化字符串</li><li>在格式化字符串中可以直接嵌入变量 <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">c = <span class="hljs-string">f&#x27;hello <span class="hljs-subst">&#123;a&#125;</span> <span class="hljs-subst">&#123;b&#125;</span>&#x27;</span> \ <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;a = <span class="hljs-subst">&#123;a&#125;</span>&#x27;</span>)<br></code></pre></td></tr></table></figure></li></ul></li></ul><h3 id="list-tuple-dict-set">list tuple dict set</h3><h4 id="list">list[]</h4><p>Python内置的数据类型列表：<code>list</code>是一种有序的集合，可以随时<code>添加</code>和<code>删除</code>其中的元素</p><table><thead><tr><th>方法</th><th>说明</th></tr></thead><tbody><tr><td>list.append()</td><td>追加元素到末尾</td></tr><tr><td>list.insert()</td><td>插入到指定位置</td></tr><tr><td>list.pop()方法</td><td>删除指定位置元素</td></tr><tr><td>list.len()</td><td>列表元素个数</td></tr></tbody></table><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python">classmates = [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>]  &gt;&gt; [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>]<br><span class="hljs-built_in">len</span>(classmates)  &gt;&gt; <span class="hljs-number">3</span><br>classmates[-<span class="hljs-number">1</span>]   &gt;&gt; <span class="hljs-string">&#x27;Tracy&#x27;</span><br>classmates[-<span class="hljs-number">2</span>]   &gt;&gt; <span class="hljs-string">&#x27;Bob&#x27;</span><br>classmates.append(<span class="hljs-string">&#x27;Adam&#x27;</span>)  &gt;&gt; [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>, <span class="hljs-string">&#x27;Adam&#x27;</span>]<br>classmates.insert(<span class="hljs-number">1</span>, <span class="hljs-string">&#x27;Jack&#x27;</span>)  &gt;&gt; [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Jack&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>, <span class="hljs-string">&#x27;Adam&#x27;</span>]<br>classmates.pop(<span class="hljs-number">3</span>)          &gt;&gt; <span class="hljs-string">&#x27;Tracy&#x27;</span> --&gt;[<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Jack&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Adam&#x27;</span>]<br>classmates[<span class="hljs-number">1</span>] = <span class="hljs-string">&#x27;Sarah&#x27;</span>       &gt;&gt; [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Sarah&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>]<br><br>L = [<span class="hljs-string">&#x27;Apple&#x27;</span>, <span class="hljs-number">123</span>, <span class="hljs-literal">True</span>]<br>s = [<span class="hljs-string">&#x27;python&#x27;</span>, <span class="hljs-string">&#x27;java&#x27;</span>, [<span class="hljs-string">&#x27;asp&#x27;</span>, <span class="hljs-string">&#x27;php&#x27;</span>], <span class="hljs-string">&#x27;scheme&#x27;</span>]<br></code></pre></td></tr></table></figure><h4 id="tuple">tuple()</h4><p>Python内置的数据类型<code>有序列表</code>叫元组：<code>tuple</code>，tuple和list非常类似，但是<code>tuple一旦初始化就不能修改</code><br /><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">classmates = (<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>)<br>t = (<span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;b&#x27;</span>, [<span class="hljs-string">&#x27;X&#x27;</span>, <span class="hljs-string">&#x27;Y&#x27;</span>])<br>&gt;&gt; t[<span class="hljs-number">2</span>][<span class="hljs-number">0</span>] = <span class="hljs-string">&#x27;X&#x27;</span><br>&gt;&gt; t[<span class="hljs-number">2</span>][<span class="hljs-number">1</span>] = <span class="hljs-string">&#x27;Y&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="dict">dict</h4><blockquote><p>字典的<code>键</code>可以是任意的<code>不可变对象</code>(int, str,bool, tuple…), 不能重复；字典的值可以是任何对象<br />{key1:value1,key2:value2,…}</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs python">d = <span class="hljs-built_in">dict</span>(name=<span class="hljs-string">&#x27;Li&#x27;</span>,age=<span class="hljs-string">&#x27;1&#x27;</span>,gender=<span class="hljs-string">&#x27;boy&#x27;</span>)<br>d = <span class="hljs-built_in">dict</span>([(<span class="hljs-string">&#x27;name&#x27;</span>,<span class="hljs-string">&#x27;Li&#x27;</span>),(<span class="hljs-string">&#x27;age&#x27;</span>,<span class="hljs-string">&#x27;1&#x27;</span>)])<br>d = &#123;<span class="hljs-string">&#x27;name&#x27;</span>: <span class="hljs-string">&#x27;Li&#x27;</span>, <span class="hljs-string">&#x27;age&#x27;</span>: <span class="hljs-number">1</span>, <span class="hljs-string">&#x27;gender&#x27;</span>: <span class="hljs-string">&#x27;boy&#x27;</span>&#125;<br><br>d[<span class="hljs-string">&#x27;name&#x27;</span>]&gt;&gt; Li<br>d[<span class="hljs-string">&#x27;name&#x27;</span>] = <span class="hljs-string">&quot;Xing&quot;</span><span class="hljs-comment"># 修改</span><br>d.get(<span class="hljs-string">&#x27;name&#x27;</span>, default)&gt;&gt; Li <span class="hljs-comment"># key存在返回对应值，不存在返回默认值</span><br>d.pop(<span class="hljs-string">&#x27;name&#x27;</span>)&gt;&gt; 删除name对应的值<br><br><span class="hljs-keyword">for</span> k <span class="hljs-keyword">in</span> d.keys():<span class="hljs-comment"># keys()  返回序列，保存由字典所有键</span><br><span class="hljs-built_in">print</span>(k,d[k])<br><br>&gt;&gt; name Li<br>   age <span class="hljs-number">1</span><br>   gender by<br><br><span class="hljs-keyword">for</span> v <span class="hljs-keyword">in</span> d.values():  <span class="hljs-comment"># values()  返回序列，保存由字典所有值</span><br><span class="hljs-built_in">print</span>(v)<br><br><span class="hljs-keyword">for</span> k,v <span class="hljs-keyword">in</span> d.items(): <span class="hljs-comment"># items() dict_item([(&#x27;name&#x27;,&#x27;Li&#x27;), (&#x27;age&#x27;, &#x27;1&#x27;), (&#x27;gender&#x27;, &#x27;boy&#x27;)])</span><br><span class="hljs-built_in">print</span>(k , <span class="hljs-string">&#x27;=&#x27;</span> , v)<br><br>&gt;&gt; name = Li<br>   age = <span class="hljs-number">18</span><br>   gender = boy<br></code></pre></td></tr></table></figure><h4 id="set">set</h4><blockquote><p>集合中只能存储不可变对象，<code>不重复且无序</code>;将字典转为集合只包含字典中键<br />对于不变对象来说，调用对象自身的任意方法，也不会改变该对象自身的内容。相反，这些方法会创建新的对象并返回，这样，就保证了不可变对象本身永远是不可变的</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">s = &#123;<span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;b&#x27;</span>, <span class="hljs-string">&#x27;1,&#x27;</span> <span class="hljs-string">&#x27;2&#x27;</span>, <span class="hljs-string">&#x27;3&#x27;</span>&#125;  &gt;&gt; &#123;<span class="hljs-string">&#x27;a&#x27;</span>, <span class="hljs-string">&#x27;b&#x27;</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>&#125;<br>s = <span class="hljs-built_in">set</span>([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">4</span>])&gt;&gt; &#123;<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>&#125;<br>s.add(<span class="hljs-number">5</span>)<br>s.remove(<span class="hljs-number">4</span>)<br></code></pre></td></tr></table></figure><h3 id="条件判断循环注意缩进">条件判断&amp;&amp;循环(注意缩进)</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 判断水仙花数(n&gt;=3)</span><br>i = <span class="hljs-number">100</span><br><span class="hljs-keyword">while</span> i &lt; <span class="hljs-number">1000</span>:<br>bai = i // <span class="hljs-number">100</span><br><span class="hljs-comment"># shi = (i -a * 100) // 10</span><br>shi = i // <span class="hljs-number">10</span> % <span class="hljs-number">10</span><br>ge = i % <span class="hljs-number">10</span><br><span class="hljs-keyword">if</span> bai**<span class="hljs-number">3</span> + shi**<span class="hljs-number">3</span> + ge**<span class="hljs-number">3</span> == i:<br><span class="hljs-built_in">print</span>(i)<br>i += <span class="hljs-number">1</span><br>----------------------------------------<br><span class="hljs-comment"># 判断质数(只能被1和它自身整除)</span><br><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> *<br>begin = time()<br>num = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;输入大于1的整数：&#x27;</span>))<br>i = <span class="hljs-number">2</span> <br><span class="hljs-keyword">while</span> i &lt;= num: <span class="hljs-comment"># 取出 2-num 所有数</span><br>flag = <span class="hljs-literal">True</span> <span class="hljs-comment"># </span><br>j = <span class="hljs-number">2</span><br><span class="hljs-keyword">while</span> j &lt;= i ** <span class="hljs-number">0.5</span>:<br><span class="hljs-keyword">if</span> i % j == <span class="hljs-number">0</span>:<span class="hljs-comment"># num不是质数 </span><br>flag = <span class="hljs-literal">False</span><br><span class="hljs-keyword">break</span><br>j += <span class="hljs-number">1</span><br><span class="hljs-keyword">if</span> flag:<br><span class="hljs-comment"># pass</span><br><span class="hljs-built_in">print</span>(i)<br>i += <span class="hljs-number">1</span><br>end = time()<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;use time=&quot;</span>,end - begin, <span class="hljs-string">&#x27;秒&#x27;</span>)<br>----------------------------------------------<br><span class="hljs-comment"># 99乘法表(嵌套)</span><br>i = <span class="hljs-number">0</span><br><span class="hljs-keyword">while</span> i &lt; <span class="hljs-number">9</span>:<br>i += <span class="hljs-number">1</span><span class="hljs-comment"># 外层高度</span><br><span class="hljs-keyword">while</span> j &lt; i:<span class="hljs-comment"># 内层宽度</span><br>j += <span class="hljs-number">1</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;<span class="hljs-subst">&#123;j&#125;</span>*<span class="hljs-subst">&#123;i&#125;</span>=<span class="hljs-subst">&#123;i*j&#125;</span> &quot;</span>, end=<span class="hljs-string">&quot;&quot;</span>)<br><span class="hljs-built_in">print</span>()<br>----------------------------------------------<br><span class="hljs-comment"># break &amp;&amp; continue(对就近循环起作用)</span><br>i = <span class="hljs-number">0</span> <br><span class="hljs-keyword">while</span> i &lt; <span class="hljs-number">5</span>:<br>i += <span class="hljs-number">1</span><br><span class="hljs-keyword">if</span> i == <span class="hljs-number">2</span>:<br><span class="hljs-keyword">break</span><span class="hljs-comment"># 结束整个循环</span><br><span class="hljs-keyword">continue</span> <span class="hljs-comment"># 结束当次循环</span><br><span class="hljs-built_in">print</span>(i)<br>i += <span class="hljs-number">1</span><br><span class="hljs-keyword">else</span>:<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;循环结束&#x27;</span>)<br>---------------------------------------------<br>names = [<span class="hljs-string">&#x27;Michael&#x27;</span>, <span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-string">&#x27;Tracy&#x27;</span>]<br><span class="hljs-keyword">for</span> name <span class="hljs-keyword">in</span> names:<br>    <span class="hljs-built_in">print</span>(name)<br></code></pre></td></tr></table></figure><h3 id="迭代器iter和生成器yield">迭代器：iter和生成器：yield</h3><blockquote><p>迭代器是访问集合元素的一种方式，是可以记住遍历的位置的对象，从集合第一个元素开始到所有元素被访问完结束，只能往前不会后退；基本方法<code>iter()和next()</code>，字符串、列表和元组均可用于创建迭代器</p></blockquote><blockquote><p><code>生成器</code>是一个<code>返回迭代器的函数</code>，只能用于迭代操作，更简单点理解生成器就是一个迭代器，调用一个<code>生成器函数</code>，返回的是一个<code>迭代器对象</code>，在调用生成器运行的过程中，每次遇到yield 时函数<code>会暂停并保存当前所有的运行信息</code>，返回 yield的值, 并在下一次执行 next() 方法时从当前位置继续运行。</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> sys<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">fibonaci</span>(<span class="hljs-params">n,w=<span class="hljs-number">0</span></span>):<span class="hljs-comment"># 生成器函数:斐波那契</span><br>    a, b, counter = <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span><br>    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>    <span class="hljs-keyword">if</span>(counter &gt;n):<br>    <span class="hljs-keyword">return</span> <br>    <span class="hljs-keyword">yield</span> a<br>    a, b = b, a + b<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;%d,%d&#x27;</span> % (a,b))<br>    counter +=<span class="hljs-number">1</span><br><br>f = fibonaci(<span class="hljs-number">3</span>,<span class="hljs-number">0</span>) <span class="hljs-comment"># f 是一个迭代器，由生成器返回生成</span><br><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br><span class="hljs-keyword">try</span>:<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(f), enf=<span class="hljs-string">&quot; &quot;</span>)<br><span class="hljs-keyword">except</span>:<br>sys.exit()<br>------------<br>Output:<br><span class="hljs-number">0</span> <span class="hljs-number">1</span>,<span class="hljs-number">1</span><br><span class="hljs-number">1</span> <span class="hljs-number">1</span>,<span class="hljs-number">2</span><br><span class="hljs-number">1</span> <span class="hljs-number">2</span>,<span class="hljs-number">3</span><br><span class="hljs-number">2</span> <span class="hljs-number">3</span>,<span class="hljs-number">5</span><br></code></pre></td></tr></table></figure><h3 id="函数">函数</h3><h4 id="概念">概念</h4><ul><li>函数是一个对象，在内存中专门用来存储数据的一块区域；如果形参执行的是一个对象，当通过形参去改对象时，会影响到所有指向该对象的变量；<em>print(fn)，fn是函数对象，实际是打印函数对象；而print(fn())，则是在打印fn()函数的返回值</em><br /></li><li>定义:<br /><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">functionName</span>(<span class="hljs-params">argu1, argu2, ...</span>):<br>  code block<br></code></pre></td></tr></table></figure></li></ul><h4 id="函数的参数">函数的参数:</h4><ul><li><p>位置参数，调用函数时，传入的两个值按照位置顺序依次赋给参数x和n<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">power</span>(<span class="hljs-params">x,n</span>):<br>  s = <span class="hljs-number">1</span><br>  <span class="hljs-keyword">while</span> n &gt; <span class="hljs-number">0</span>:<br>  n = n -<span class="hljs-number">1</span><br>  s = s * x<br>  <span class="hljs-keyword">return</span> s<br></code></pre></td></tr></table></figure></p></li><li><p>默认参数，必须指向不变对象 <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_end</span>(<span class="hljs-params">L=<span class="hljs-literal">None</span></span>):<br>  <span class="hljs-keyword">if</span> L <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:<br>     L = []<br>     L.append(<span class="hljs-string">&#x27;END&#x27;</span>)<br>  <span class="hljs-keyword">return</span> L<br></code></pre></td></tr></table></figure></p></li><li><p>可变参数，允许传入0个或任意个参数，这些可变参数在函数调用时自动组装为一个<code>tuple</code><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">calc</span>(<span class="hljs-params">*numbers</span>):<span class="hljs-comment"># *nums表示把nums这个list的所有元素作为可变参数传进去</span><br>  <span class="hljs-built_in">sum</span> = <span class="hljs-number">0</span><br>  <span class="hljs-keyword">for</span> n <span class="hljs-keyword">in</span> numbers:<br>    <span class="hljs-built_in">sum</span> = <span class="hljs-built_in">sum</span> + n * n<br>  <span class="hljs-keyword">return</span> <span class="hljs-built_in">sum</span><br><span class="hljs-meta">&gt;&gt;&gt; </span>nums = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]<br><span class="hljs-meta">&gt;&gt;&gt; </span>calc(*nums)<br>    <span class="hljs-number">14</span><br></code></pre></td></tr></table></figure></p></li><li><p>关键字参数，允许传入0个或任意个含参数名的参数，这些关键字参数在函数内部自动组装为一个<code>dict</code><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">person</span>(<span class="hljs-params">name, age, **kw</span>):<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;name:&#x27;</span>, name, <span class="hljs-string">&#x27;age:&#x27;</span>, age, <span class="hljs-string">&#x27;other:&#x27;</span>, kw)<br><br><span class="hljs-meta">&gt;&gt;&gt; </span>person(<span class="hljs-string">&#x27;Bob&#x27;</span>, <span class="hljs-number">35</span>, city=<span class="hljs-string">&#x27;Beijing&#x27;</span>)<br>    name: Bob age: <span class="hljs-number">35</span> other: &#123;<span class="hljs-string">&#x27;city&#x27;</span>: <span class="hljs-string">&#x27;Beijing&#x27;</span>&#125;<br></code></pre></td></tr></table></figure></p></li></ul><h4 id="递归">递归：</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">factorial</span>(<span class="hljs-params">n</span>):<br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br><span class="hljs-string">求任意数的阶乘</span><br><span class="hljs-string">参数: </span><br><span class="hljs-string">n: 要求阶乘的数字</span><br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br>  <span class="hljs-keyword">if</span> n == <span class="hljs-number">1</span>:<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span><br>    <span class="hljs-keyword">return</span> n * factorial(n-<span class="hljs-number">1</span>)<br>------------------------------<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">huiWen</span>(<span class="hljs-params">s</span>):<br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br><span class="hljs-string">判断是否为回文字符串</span><br><span class="hljs-string">参数：</span><br><span class="hljs-string">s：要检查的字符串</span><br><span class="hljs-string">&#x27;&#x27;&#x27;</span><br><span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(s) == <span class="hljs-number">2</span>:<br>  <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><span class="hljs-keyword">elif</span> s[<span class="hljs-number">0</span>] != s[-<span class="hljs-number">1</span>]:<br>  <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span><br><span class="hljs-keyword">return</span> huiWen(s[<span class="hljs-number">1</span>:-<span class="hljs-number">1</span>])<br></code></pre></td></tr></table></figure><h4 id="filter匿名函数-lambda-与-map">filter、匿名函数: lambda 与map</h4><ul><li><p><code>filter(function,iterable)</code>:可以从序列中过滤出符合条件的元素，保存到一个新的序列对象中，<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">a = <span class="hljs-built_in">filter</span>(<span class="hljs-keyword">lambda</span> x: x % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>, <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>))<br><span class="hljs-meta">&gt;&gt;&gt; </span>&lt;<span class="hljs-built_in">filter</span> <span class="hljs-built_in">object</span> at <span class="hljs-number">0x0000027939040390</span>&gt;<br></code></pre></td></tr></table></figure></p></li><li><p><code>lambda 参数列表 : 返回值</code>: <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">filter</span>(<span class="hljs-keyword">lambda</span> i:i&gt;<span class="hljs-number">5</span>,l)<br></code></pre></td></tr></table></figure></p></li><li><p><code>map(function, iterable, ...)</code>:可以对可迭代对象中的所有元素做指定操作，然后将其添加到一个新的对象中返回，<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">map</span>(<span class="hljs-keyword">lambda</span> x, y: x + y, [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">9</span>], [<span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">6</span>, <span class="hljs-number">8</span>, <span class="hljs-number">10</span>]) <br><span class="hljs-meta">&gt;&gt;&gt; </span>&lt;<span class="hljs-built_in">map</span> <span class="hljs-built_in">object</span> at <span class="hljs-number">0x0000027939040CF8</span>&gt;<br></code></pre></td></tr></table></figure></p></li></ul><h4id="闭包函数嵌套-将内部函数作为返回值返回-内部函数必须使用到外部函数的变量">闭包：<code>函数嵌套</code>&amp;&amp; <code>将内部函数作为返回值返回</code> &amp;&amp;<code>内部函数必须使用到外部函数的变量</code></h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">makeAverager</span>():<br>  nums = []<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">averager</span>(<span class="hljs-params">n</span>):<br>  nums.append(n)<br>  <span class="hljs-keyword">return</span> <span class="hljs-built_in">sum</span>(nums)/<span class="hljs-built_in">len</span>(nums)<br><span class="hljs-keyword">return</span> averager<br><br>averager = makeAverager()<br></code></pre></td></tr></table></figure><h4 id="装饰器-在不改变函数代码的情况下扩展函数功能">装饰器:在不改变函数代码的情况下，扩展函数功能</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">log</span>(<span class="hljs-params">old</span>):<br>  <span class="hljs-keyword">def</span> <span class="hljs-title function_">wrapper</span>(<span class="hljs-params">*args, **kw</span>):<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;call %s():&#x27;</span> % func.__name__)<br>    <span class="hljs-keyword">return</span> func(*args, **kw)<br><span class="hljs-keyword">return</span> wrapper<br><br><span class="hljs-meta">@log</span><span class="hljs-comment"># now = log(now)</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">now</span>():<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;2015-3-25&#x27;</span>)<br><br><span class="hljs-meta">&gt;&gt;&gt; </span>now()<br>  call now():<br>  <span class="hljs-number">2015</span>-<span class="hljs-number">3</span>-<span class="hljs-number">25</span><br></code></pre></td></tr></table></figure><h3 id="面向对象编程">面向对象编程</h3><h4 id="基础">基础</h4><ul><li><p>类：对<code>对象</code>的抽象，是创建对象的模板；属性&amp;&amp;方法</p></li><li><p>对象：则是由类创建的一个<code>实例</code>，而变量是指向对象的内容，如：<code>a='abc'</code>，经常说的对象a的内容是’abc’，其实是指，a本身是一个变量，它指向的对象的内容才是’abc’</p></li><li><p>定义类: <code>p1 = Person('an')</code>执行流程</p><ul><li>(1)创建一个变量；</li><li>(2)在内存中创建新对象；</li><li>(3)<code>__init__(self)</code>方法执行，init在对象创建以后执行，用来初始化新创建的对象</li><li>(4)将对象的id赋值给变量</li><li>(5)self指的是类实例对象本身(注意：不是类本身)</li><li><ahref="https://www.cnblogs.com/chownjy/p/8663024.html">self参考</a><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs python"> <span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name</span>):<span class="hljs-comment"># 在对象初始化时执行</span><br>     <span class="hljs-variable language_">self</span>.name = name    <span class="hljs-comment"># self为调用该属性/方法实例对象自身 </span><br>  <span class="hljs-comment"># self.__name = name    # 隐藏属性 __name ==&gt; _Person__name</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">sayHello</span>(<span class="hljs-params">self</span>):<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;我是：%s&#x27;</span> %<span class="hljs-variable language_">self</span>.name)<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_name</span>(<span class="hljs-params">self</span>):<br>  <span class="hljs-comment"># print(&#x27;读取属性&#x27;)</span><br>  <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.name<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">set_name</span>(<span class="hljs-params">self, name</span>):<br>     <span class="hljs-comment"># print(&#x27;设置属性&#x27;)</span><br>  <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.name = name<br><br>p1 = Person(<span class="hljs-string">&#x27;an&#x27;</span>)<br></code></pre></td></tr></table></figure></li></ul></li></ul><h4 id="特征">特征：</h4><ul><li><p>封装:隐藏对象中一些不希望被外部所访问到的属性或方法，确保对象中的数据安全</p><ul><li>getter 获取对象中的指定属性（get_属性名）</li><li>setter 用来设置对象的指定属性（set_属性名） <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>  <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,name</span>):<br>    <span class="hljs-variable language_">self</span>._name = name<br>  <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_name</span>(<span class="hljs-params">self</span>):<br>    <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>._name<br><br>  <span class="hljs-keyword">def</span> <span class="hljs-title function_">set_name</span>(<span class="hljs-params">self , name</span>):<br>    <span class="hljs-variable language_">self</span>._name = name   <br><br> p = Person(<span class="hljs-string">&#x27;孙悟空&#x27;</span>)<br> <span class="hljs-built_in">print</span>(p._name)<br></code></pre></td></tr></table></figure></li></ul></li><li><p>继承：实现子类的属性和方法的功能扩展，保证了对象的可扩展性<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><code class="hljs python"> <span class="hljs-keyword">class</span> <span class="hljs-title class_">Animal</span>:<br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>(<span class="hljs-params">self</span>):<br>     <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;动物会跑~~~&#x27;</span>)<br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">sleep</span>(<span class="hljs-params">self</span>):<br>     <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;动物睡觉~~~&#x27;</span>)<br><span class="hljs-meta">   @property</span><br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">name</span>(<span class="hljs-params">self</span>):<br>     <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>._name<br><span class="hljs-meta">   @name.setter    </span><br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">name</span>(<span class="hljs-params">self,name</span>):<br>     <span class="hljs-variable language_">self</span>._name = name<br><br> <span class="hljs-keyword">class</span> <span class="hljs-title class_">Dog</span>(<span class="hljs-title class_ inherited__">Animal</span>):<br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,name,age</span>):<br>       <span class="hljs-comment"># 调用父类的__init__来初始化父类中定义的属性</span><br>       <span class="hljs-comment"># super() 可以用来获取当前类的父类，</span><br>       <span class="hljs-comment"># 并且通过super()返回对象调用父类方法时，不需要传递self</span><br>     <span class="hljs-built_in">super</span>().__init__(name)<br>     <span class="hljs-variable language_">self</span>._age = age<br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">bark</span>(<span class="hljs-params">self</span>):<br>     <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;汪汪汪~~~&#x27;</span>) <br>   <span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>(<span class="hljs-params">self</span>):<br>     <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;狗跑~~~~&#x27;</span>) <br><span class="hljs-meta">   @property</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">age</span>(<span class="hljs-params">self</span>):<br>  <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>._age<br><span class="hljs-meta">@age.setter    </span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">age</span>(<span class="hljs-params">self,age</span>):<br>  <span class="hljs-variable language_">self</span>._age = name<br><br> d = Dog(<span class="hljs-string">&#x27;旺财&#x27;</span>,<span class="hljs-number">18</span>) <br> <span class="hljs-built_in">print</span>(d.name)       <br> <span class="hljs-built_in">print</span>(d.age)<br></code></pre></td></tr></table></figure></p></li><li><p>多态：一个对象可以以不同的形态去呈现，保证了程序的灵活性</p></li></ul><h3 id="模块python文件-包文件">模块(python文件) 包(文件)</h3><ul><li>导入模块: <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> 模块名 <br><span class="hljs-keyword">import</span> 模块名 <span class="hljs-keyword">as</span> 模块别名<br></code></pre></td></tr></table></figure></li><li>访问模块变量：模块名.变量名</li><li>导入模块部分内容: <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> 模块名 <span class="hljs-keyword">import</span> 变量 <span class="hljs-keyword">as</span> 别名<br></code></pre></td></tr></table></figure></li></ul><h3 id="异常">异常</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;异常出现前&#x27;</span>)<br>l = []<br><span class="hljs-keyword">try</span>:<br>  <span class="hljs-built_in">print</span>(<span class="hljs-number">10</span>/<span class="hljs-number">0</span>)<br><span class="hljs-keyword">except</span> NameError:<br>  <span class="hljs-comment"># 如果except后不跟任何的内容，则此时它会捕获到所有的异常</span><br>  <span class="hljs-comment"># 如果在except后跟着一个异常的类型，那么此时它只会捕获该类型的异常</span><br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;出现 NameError 异常&#x27;</span>)<br><span class="hljs-keyword">except</span> ZeroDivisionError:<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;出现 ZeroDivisionError 异常&#x27;</span>)<br><span class="hljs-keyword">except</span> IndexError:<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;出现 IndexError 异常&#x27;</span>)<br><br><span class="hljs-comment"># Exception 是所有异常类的父类，所以如果except后跟的是Exception，他也会捕获到所有的异常</span><br><span class="hljs-comment"># 可以在异常类后边跟着一个 as xx 此时xx就是异常对象</span><br><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e :<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;未知异常&#x27;</span>,e,<span class="hljs-built_in">type</span>(e))<br><span class="hljs-keyword">finally</span> :<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;无论是否出现异常，该子句都会执行&#x27;</span>)<br><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;异常出现后&#x27;</span>)<br>----------------------------------------------------------------------------------<br><span class="hljs-comment"># 自定义异常类，创建一个类继承Exception</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyError</span>(<span class="hljs-title class_ inherited__">Exception</span>):<br>  <span class="hljs-keyword">pass</span><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">a,b</span>):<br><span class="hljs-comment"># 如果a和b中有负数，就向调用处抛出异常</span><br>  <span class="hljs-keyword">if</span> a &lt; <span class="hljs-number">0</span> <span class="hljs-keyword">or</span> b &lt; <span class="hljs-number">0</span>:<br>  <span class="hljs-comment"># raise用于向外部抛出异常，后边可以跟一个异常类，或异常类的实例</span><br>  <span class="hljs-comment"># raise Exception    </span><br>  <span class="hljs-comment"># 抛出异常的目的</span><br>  <span class="hljs-comment"># raise Exception(&#x27;两个参数中不能有负数！&#x27;)  </span><br>  <span class="hljs-keyword">raise</span> MyError(<span class="hljs-string">&#x27;自定义的异常&#x27;</span>)<br><br>  <span class="hljs-comment"># 也可以通过if else来代替异常的处理</span><br>  <span class="hljs-comment"># return None</span><br>  r = a + b<br>  <span class="hljs-keyword">return</span> r<br><br><span class="hljs-built_in">print</span>(add(-<span class="hljs-number">123</span>,<span class="hljs-number">456</span>))<br></code></pre></td></tr></table></figure><h3 id="文件">文件</h3><blockquote><p>文件打开 –&gt;操作文件(读/写) –&gt;关闭文件</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs python">file_name = <span class="hljs-string">&#x27;demo.txt&#x27;</span><br>file_obj = <span class="hljs-built_in">open</span>(file_name)<br>content = file_obj.read()<br>file_obj.close()<br><br><span class="hljs-comment"># with ... as 语句</span><br><span class="hljs-comment"># with open(file_name) as file_obj :</span><br><span class="hljs-comment"># 在with语句中可以直接使用file_obj来做文件操作</span><br><span class="hljs-comment"># 此时这个文件只能在with中使用，一旦with结束则文件会自动close()</span><br><span class="hljs-comment"># print(file_obj.read())</span><br><br>file_name = <span class="hljs-string">&#x27;demo.txt&#x27;</span><br><span class="hljs-keyword">try</span>: <br>  <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(file_name,encoding=<span class="hljs-string">&#x27;utf-8&#x27;</span>) <span class="hljs-keyword">as</span> file_obj:<br>    file_content = <span class="hljs-string">&#x27;&#x27;</span><br>    chunk = <span class="hljs-number">100</span><br>    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>      content = file_obj.read(chunk)<br>      <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> content:<br>        <span class="hljs-keyword">break</span><br>      <span class="hljs-comment"># print(content,end=&#x27;&#x27;)</span><br>      file_content += content<br><br><span class="hljs-keyword">except</span> FileNotFoundError :<br>  <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;file_name&#125;</span> 这个文件不存在！&#x27;</span>)<br><span class="hljs-built_in">print</span>(file_content)<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/a4d4b8b8.html</id>
    <link href="https://anyu967.github.io/posts/a4d4b8b8.html"/>
    <published>2019-09-10T15:25:10.000Z</published>
    <summary>
      <![CDATA[<p>2019-09-10-python]]>
    </summary>
    <title>python</title>
    <updated>2026-02-22T05:33:39.827Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="apache" scheme="https://anyu967.github.io/categories/apache/"/>
    <category term="nginx" scheme="https://anyu967.github.io/categories/apache/nginx/"/>
    <category term="tomcat" scheme="https://anyu967.github.io/categories/apache/nginx/tomcat/"/>
    <category term="devops" scheme="https://anyu967.github.io/tags/devops/"/>
    <content>
      <![CDATA[<p>2019-09-09-ANT <span id="more"></span></p><h2 id="进程与线程">进程与线程</h2><blockquote><p><a href="https://www.zhihu.com/question/25532384">参考文章</a><br />进程是<code>资源分配</code>的最小单位，线程是<code>CPU调度</code>的最小单位；</p></blockquote><h3 id="二者关系">二者关系</h3><blockquote><p>一个线程只能属于一个进程，而一个进程可以有多个线程，但至少有一个线程（通常说的主线程）;<br />资源分配给进程，<code>同一进程的所有线程共享该进程的所有资源</code>;<br />线程在执行过程中，需要协作同步。不同进程的线程间要利用<code>消息通信</code>的办法实现同步;<br />处理任务分给线程，即真正在处理任务上运行的是线程;<br />线程是指进程内的一个执行单元，也是进程内的可调度实体;</p></blockquote><img src="/posts/c9dd20a7/%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B.png" class="" title="[进程与线程]"><img src="/posts/c9dd20a7/%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B01.png" class="" title="[进程与线程01]"><h2 id="同步异步-阻塞非阻塞">同步/异步 &amp;&amp; 阻塞/非阻塞</h2><h3 id="同步异步被调用者">同步/异步（被调用者）</h3><ul><li><code>描述网络通信模式，适用于请求-响应模型</code></li><li>同步：发送方发送请求后，需要等待接收响应，否则将一直等待</li><li>异步：发送方发送请求后，不需要等待响应，可以继续发送下一个请求，或者主动挂起线程并释放CPU</li></ul><h3 id="阻塞非阻塞调用者-应用程序">阻塞/非阻塞（调用者-应用程序）</h3><ul><li><code>描述进程的函数调用方式</code><br /></li><li>阻塞：IO 调用会一直阻塞，直至结果返回才能继续执行</li><li>非阻塞：IO 调用会立即返回，不需要等待结果，并可以执行下一个 I/O调用</li></ul><h2id="io多路复用的三种模型selectpollepoll">IO多路复用的三种模型:Select，Poll，Epoll</h2><ul><li><ahref="https://www.cnblogs.com/javalyy/p/8882066.html">参考文章</a><br /></li><li>IO有<code>内存IO</code>、<code>网络IO</code>和<code>磁盘IO</code>三种，通常说的IO指的是后两者;以文件IO为例,一个IO读过程是文件数据从<code>磁盘→内核缓冲区→用户内存</code>的过程。同步与异步的区别主要在于数据从内<code>核缓冲区→用户内存</code>这个过程需不需要用户进程等待，即实际的IO读写是否阻塞请求进程。(网络IO把磁盘换做网卡即可)</li></ul><table><thead><tr><th>项目</th><th>select</th><th>poll</th><th>epoll</th></tr></thead><tbody><tr><td>操作方式</td><td>遍历</td><td>遍历</td><td>回调</td></tr><tr><td>底层实现</td><td>数组</td><td>链表</td><td>哈希表</td></tr><tr><td>IO效率</td><td>线性遍历,时间复杂度O(n)</td><td>线性遍历, O(n)</td><td>事件通知方式,O(1)</td></tr><tr><td>最大连接数</td><td>1024(x86)/2048(x64)</td><td>无上限</td><td>无上限</td></tr><tr><td>fd拷贝</td><td>每次调用,fd集合从用户态拷贝到内核态</td><td>同select</td><td>拷贝进内核保存</td></tr></tbody></table><h2 id="apachenginx与tomcat区别">apache、nginx与tomcat区别</h2><blockquote><p>Apache和nginx应该叫做<code>HTTP Server</code>，而tomcat是一个<code>Application Server</code>，JSP/Servlet容器应用的容器;Apache HTTPServer和Nginx都能够将某一个<code>静态资源</code>的内容通过HTTP协议返回到客户端，但是这个文本文件的内容是固定的——也就是说无论何时、任何人访问它得到的内容都是完全相同的;Tomcat能够<code>动态的生成资源</code>并返回到客户端;</p></blockquote><h2 id="apache">apache</h2><h3 id="官方网站"><a href="http://httpd.apache.org/">官方网站</a></h3><img src="/posts/c9dd20a7/httpd_logo.png" class="" title="[https_logo]"><h3 id="原理浅析">原理浅析</h3><ul><li>Apache基于<code>多进程的HTTP服务器</code>，它需要对每个用户请求创建一个子进程进行响应，并发的请求量大就会需要非常多的进程，从而占用极多的cpu资源和内存;</li><li>Apache是基于<code>模块化</code>设计的，<code>MPM</code>（Multi-ProcessingModules，多重处理模块）是Apache的核心组件之一，Apache通过MPM来使用操作系统的资源，对进程和线程池进行管理;</li><li>MPM有三种工作方式：<ul><li><a href="http://httpd.apache.org/docs/2.4/mod/prefork.html">PreforkMPM</a></li><li><a href="http://httpd.apache.org/docs/2.4/mod/worker.html">WorkerMPM</a></li><li><a href="http://httpd.apache.org/docs/2.4/mod/event.html">EventMPM</a></li></ul></li></ul><h4 id="prefork-模式预派生子进程">prefork 模式(预派生子进程)</h4><ul><li><code>prefork</code>是一个<code>非线程型的、预派生的MPM</code>，使用多个进程彼此独立，且<code>每个进程只有一个线程</code>，每个进程在某个确定的时间只单独处理一个连接，<code>效率高</code>，但<code>内存使用比较大</code>。</li><li>优点：适合于没有线程安全库，需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM，这样若一个请求出现问题就不会影响到其他请求。</li><li>缺点：一个进程相对占用更多的系统资源，消耗更多的内存。而且，它并不擅长处理高并发请求，在这种场景下，它会将请求放进队列中，一直等到有可用进程，请求才会被处理。</li></ul><h4 id="worker-模式">worker 模式</h4><ul><li><code>worker</code>基于多进程,但是使用了<code>多进程和多线程</code>的混合模式，worker模式也同样会先预派生一些子进程，然后<code>每个子进程创建一些线程</code>，同时包括一个监听线程，每个请求过来会被分配到一个线程来服务。</li><li>优点：线程比起进程会更轻量，因为<code>线程是通过共享父进程的内存空间</code>，因此，内存的占用会减少一些，在高并发，高流量的场景下会比prefork有更多可用的线程，表现会更优秀一些；</li><li>缺点：如果一个线程出现了问题也会导致同一进程下的线程出现问题，如果是多个线程出现问题，也只是影响Apache的一部分，而不是全部。由于用到多进程多线程，需要考虑到线程的安全了，在使用keep-alive长连接的时候，某个线程会一直被占用，即使中间没有请求，需要等待到超时才会被释放（该问题在prefork模式下也存在）。</li></ul><h4 id="event-模式">event 模式</h4><ul><li>Apache最新的工作模式，它和worker模式很像</li><li>优点：不同的是在于它解决了<code>keep-alive长连接</code>的时候占用线程资源被浪费的问题（HTTP的Keepalive方式能减少TCP连接数量和网络负载），在event工作模式中，会有一些专门的线程用来管理这些keep-alive类型的线程，当有真实请求过来的时候，将请求传递给服务器的线程，执行完毕后，又允许它释放。这增强了在高并发场景下的请求处理；</li></ul><h2 id="nginx">nginx</h2><h3 id="参考文章"><ahref="https://www.cnblogs.com/strick/p/9336948.html">参考文章</a></h3><h3 id="官方网站-1"><ahref="http://nginx.org/en/docs/">官方网站</a></h3><h3 id="原理浅析-1">原理浅析</h3><h4 id="组成">组成</h4><blockquote><p>Nginx由一个<code>master进程和多个worker进程</code>组成，主进程接收客户端请求，再转交给工作进程处理，从而很好地利用多核心CPU的计算能力。</p></blockquote><img src="/posts/c9dd20a7/nginx.png" class="" title="[nginx_logo]"><h4 id="编译安装">编译安装</h4><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs livescript"><span class="hljs-comment"># ./configure --prefix=/srv/nginx \</span><br>  --<span class="hljs-keyword">with</span>-file-aio <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_auth_request_module <span class="hljs-string">\</span>  <br>  --<span class="hljs-keyword">with</span>-http_ssl_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_v2_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_realip_module <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_addition_module <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_xslt_module=dynamic <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_geoip_module=dynamic <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_sub_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_dav_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_flv_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_mp4_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_gunzip_module <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_gzip_static_module <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_random_index_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_secure_link_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_degradation_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_slice_module <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-http_stub_status_module <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-http_perl_module=dynamic <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-pcre <span class="hljs-string">\</span><br>  --<span class="hljs-keyword">with</span>-pcre-jit <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-stream=dynamic <span class="hljs-string">\</span> <br>  --<span class="hljs-keyword">with</span>-stream_ssl_module <span class="hljs-string">\</span><br></code></pre></td></tr></table></figure><h4 id="配置">配置</h4><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">sed</span> -i <span class="hljs-string">&#x27;/^[[:space:]]*#/d&#x27;</span> nginx.conf <br>  user nginx;<br>  <span class="hljs-attribute">worker_process</span> auto; <br>  <span class="hljs-attribute">error_log</span> /var/log/nginx/<span class="hljs-literal">error</span>.log;<br>  <span class="hljs-attribute">pid</span> /run/nginx.pid;<br>  <span class="hljs-attribute">include</span> /usr/share/nginx/modules/<span class="hljs-regexp">*.conf</span>;<br><br>  <span class="hljs-section">event</span> &#123;<br>      <span class="hljs-attribute">worker_connections</span> <span class="hljs-number">1024</span>;<br>  &#125;<br>  <span class="hljs-section">http</span> &#123;<br>      <span class="hljs-attribute">include</span>         mime.types;<br>      <span class="hljs-attribute">default_type</span>    application/octet-stream;<br><br>      <span class="hljs-attribute">sendfile</span>         <span class="hljs-literal">on</span>;<br>      <span class="hljs-attribute">keepalived</span>       <span class="hljs-number">65</span>;<br>      <br>      <span class="hljs-attribute">include</span> /etc/nginx/conf.d/<span class="hljs-regexp">*.conf</span>;<br>      <span class="hljs-attribute">include</span> /etc/nginx/conf.d/vhosts/<span class="hljs-regexp">*.conf</span>;    <span class="hljs-comment"># </span><br><br>      <span class="hljs-section">server</span> &#123;<br>          <span class="hljs-attribute">listen</span>       <span class="hljs-number">80</span>;<br>          <span class="hljs-attribute">server_name</span>  localhost;<br><br>          <span class="hljs-section">location</span> / &#123;                <span class="hljs-comment"># localhost:80/ </span><br>              <span class="hljs-attribute">root</span>     html;          <span class="hljs-comment"># 路径</span><br>              <span class="hljs-attribute">index</span>    index.html index.htm;<br>          &#125;<br>          <br>          <span class="hljs-section">location</span> /demo &#123;        <span class="hljs-comment"># localhost:80/demo/</span><br>              <span class="hljs-attribute">root</span> /opt/test;     <span class="hljs-comment"># 实际访问 /opt/test/demo</span><br>              <span class="hljs-attribute">alias</span> /opt/test;    <span class="hljs-comment"># 实际访问 /opt/test</span><br>          &#125;<br><br>          <span class="hljs-attribute">error_page</span>   <span class="hljs-number">500</span> <span class="hljs-number">502</span> <span class="hljs-number">503</span> <span class="hljs-number">504</span>  /50x.html;<br>          <span class="hljs-section">location</span> = /50x.html &#123;<br>              <span class="hljs-attribute">root</span> html;<br>          &#125;<br>      &#125;<br>  &#125;<br></code></pre></td></tr></table></figure><h3 id="cgifastcgiphp-fpm">CGI、FastCGI、PHP-FPM</h3><ul><li>CGI（CommonInterface，公共网关接口）是<strong>Web服务器与外部程序之间</strong>的接口标准，用于<code>两种不同程序之间的信息传递</code>。CGI规范允许Web服务器根据浏览器请求调用CGI程序，并将其输出结果通过响应发送给浏览器，从而使Web服务器支持处理复杂的网站业务需求;</li><li><code>FastCGI</code>主要用于解决CGI性能上的缺陷。传统CGI方式是每当客户端请求CGI时，Web服务器就通过操作系统创建一个新的CGI进程，一个CGI进程完成一个请求处理后就退出，下次请求再创建一个新CGI进程。由于这种方式需要不断为每个请求创建进程，因此在网站并发量很大时显得非常低效。FastCGI优化了这种工作方式，它由一个<code>常驻的CGI进程管理器</code>，通过管理<code>一个进程池</code>来处理Web服务器的请求，由此提高了性能;</li><li>PHP提供的<code>PHP-FPM</code>（FastCGI ProcessManager）就是一个<code>FastCGI进程管理器</code>，其可执行文件位于PHP安装的目录中;</li></ul><h2 id="tomcat">tomcat</h2><h3 id="参考文章-1"><ahref="https://www.cnblogs.com/hggen/p/6264475.html">参考文章</a></h3><h3 id="官方网站-2"><ahref="http://tomcat.apache.org/">官方网站</a></h3><img src="/posts/c9dd20a7/tomcat.png" class="" title="[tomcat_logo]">]]>
    </content>
    <id>https://anyu967.github.io/posts/c9dd20a7.html</id>
    <link href="https://anyu967.github.io/posts/c9dd20a7.html"/>
    <published>2019-09-09T15:25:10.000Z</published>
    <summary>
      <![CDATA[<p>2019-09-09-ANT]]>
    </summary>
    <title>apache-nginx-tomcat</title>
    <updated>2026-02-22T05:33:39.813Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Ansible" scheme="https://anyu967.github.io/categories/Ansible/"/>
    <category term="Linux" scheme="https://anyu967.github.io/tags/Linux/"/>
    <category term="Ansible" scheme="https://anyu967.github.io/tags/Ansible/"/>
    <content>
      <![CDATA[<p>2019-08-28-Ansible <span id="more"></span></p><h1 id="ansible">Ansible</h1><h2 id="前话">前话</h2><ul><li><code>IAAS</code>(Infrastucture as a Service)‘’基础设施即服务’’<br /></li><li><code>PAAS</code>(Platform as a Service) ‘’平台即服务’’<br /></li><li><code>SAAS</code>(Service as a Service) ‘’软件即服务’’</li></ul><h2 id="简介">简介</h2><blockquote><p>ansible是新出现的<code>自动化运维工具</code>，<code>基于Python</code>开发，集合了众多运维工具（puppet、cfengine、chef、func、fabric）的优点，实现了<code>批量系统配置、批量程序部署、批量运行命令</code>等功能。</p></blockquote><blockquote><p>ansible是<code>基于模块</code>工作的，本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块，ansible只是提供一种框架。主要包括：<br />(1)<code>connection plugins</code>：负责和被监控端实现通信；<br />(2)<code>host inventory</code>：指定操作的主机，是一个配置文件里面定义监控的主机；<br />(3)各种模块核心模块、command模块、自定义模块；(4)借助于插件完成记录日志邮件等功能；<br />(5)<code>playbook</code>：剧本执行多个任务时，非必需可以让节点一次性运行多个任务。</p></blockquote><h2 id="架构与原理">架构与原理</h2><blockquote><p>ansible通过<code>ssh实现</code>配置管理、应用部署、任务执行等功能</p></blockquote><img src="/posts/a71433d/ansible%E6%9E%B6%E6%9E%84.png" class="" title="[ansible架构]"><img src="/posts/a71433d/ansible%E5%8E%9F%E7%90%86.png" class="" title="[ansible原理]"><h2 id="安装">安装:</h2><h3 id="rpm-方式">RPM 方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mv</span> /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup<br><span class="hljs-built_in">mv</span> /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup<br>wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo<br><br>yum install ansible<br></code></pre></td></tr></table></figure><h3 id="git-方式">Git 方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">git <span class="hljs-built_in">clone</span> git://github.com/ansible.git --recursive<br><span class="hljs-built_in">cd</span> ./ansible<br><span class="hljs-built_in">source</span> ./hacking/env-setup<br></code></pre></td></tr></table></figure><h3 id="相关文件">相关文件</h3><ul><li><p>配置文件 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">/etc/ansible/ansible.cfg <span class="hljs-comment"># 主配置文件</span><br>/etc/ansible/hosts <span class="hljs-comment"># 主机清单</span><br>/etc/ansible/roles <span class="hljs-comment"># 存放角色</span><br></code></pre></td></tr></table></figure></p></li><li><p>程序 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">/usr/bin/ansible <span class="hljs-comment"># 主程序</span><br>/usr/bin/ansible-doc  <span class="hljs-comment"># 帮助文档</span><br>/usr/bin/ansible-galaxy <span class="hljs-comment"># Download/Upload Role Module</span><br>/usr/bin/ansible-playbook <span class="hljs-comment"># 定制自动化任务编排剧本工具</span><br>/usr/bin/ansible-pull <span class="hljs-comment"># 远程执行命令工具</span><br>/usr/bin/ansible-vault<span class="hljs-comment"># 文件加密tool</span><br>/usr/bin/ansible-console     <span class="hljs-comment"># Terminal Tool</span><br></code></pre></td></tr></table></figure></p></li></ul><h2 id="基本使用">基本使用</h2><h3 id="ansible-options">ansible <host-pattern> [options]</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@anyue ~]# /etc/ansible/ansible.cfg  <br>  61 host_key_checking = False         <span class="hljs-comment"># 启用  </span><br>  101 log_path = /var/log/ansible.log  <span class="hljs-comment"># 启用日志  </span><br>[root@anyue ~]# /etc/ansible/hosts<br>  [group1]  <br>  hostIP1  <br>  hostIP2  <br><br>  [group2]  <br>  hostIP1  <br><br>  [group:children]  <br>  group1   <br>  group2<br></code></pre></td></tr></table></figure><h3 id="命令">命令</h3><table><thead><tr><th>命令</th><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>ansible-doc</code></td><td>-a</td><td>显示所有模块文档</td></tr><tr><td>–</td><td><code>-l,--list</code></td><td>列出可用模块,也可以指定模块</td></tr><tr><td>–</td><td><code>-s,--snippet</code></td><td>指定模块playbook片段</td></tr><tr><td><code>ansible</code></td><td>-m</td><td>指定模块,默认command模块</td></tr><tr><td>–</td><td>-a</td><td>传递命令</td></tr><tr><td>–</td><td><code>-k,--ask-pass</code></td><td>提示输入ssh密码,默认Key验证</td></tr><tr><td>–</td><td>–list</td><td>显示主机</td></tr><tr><td>–</td><td><code>-C,--check</code></td><td>测试执行过程</td></tr><tr><td><code>ansible-galaxy</code></td><td>list</td><td>列出所装角色</td></tr><tr><td>–</td><td>info</td><td>角色信息</td></tr><tr><td>–</td><td>remove</td><td>删除角色</td></tr><tr><td><code>ansible-pull</code></td><td>–</td><td>推送命令至远程</td></tr><tr><td><code>ansible-playbook</code></td><td>-C</td><td>检查,不执行</td></tr><tr><td>–</td><td><code>--limit hosts</code></td><td>在指定主机执行</td></tr><tr><td>–</td><td><code>--list-hosts</code></td><td>列出运行任务的主机</td></tr><tr><td><code>ansible-vault</code></td><td>encrypt</td><td>加密playbook</td></tr><tr><td>–</td><td>decrypt</td><td></td></tr><tr><td><code>ansible-console</code></td><td>–</td><td>–</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">[root@anyue ansible]# ansible dbser --list<br>[root@anyue ansible]# ansible dbser -m ping -u root -k  <br>[root@anyue ansible]# ansible dbser -m <span class="hljs-built_in">command</span> -u xy -k -a <span class="hljs-string">&#x27;ls/root&#x27;</span> -b -K <span class="hljs-comment"># 默认为command   </span><br></code></pre></td></tr></table></figure><h3 id="host-pattern">Host-pattern</h3><ul><li><p>all: <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible all -m ping<br></code></pre></td></tr></table></figure></p></li><li><p><code>*</code>: <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible <span class="hljs-string">&quot;*&quot;</span> -m ping<br></code></pre></td></tr></table></figure></p></li><li><p>与或非关系: <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible <span class="hljs-string">&#x27;dbser:webser&#x27;</span> -m ping  <span class="hljs-comment"># 或</span><br>ansible <span class="hljs-string">&#x27;dbser:&amp;webser&#x27;</span> -m ping <span class="hljs-comment"># 与</span><br>ansible <span class="hljs-string">&#x27;dbser:!webser&#x27;</span> -m ping <span class="hljs-comment"># 非</span><br></code></pre></td></tr></table></figure></p></li></ul><h2 id="常见模块">常见模块</h2><h3 id="文件类操作模块">文件类操作模块</h3><blockquote><p>copy file blockinline lineinfile find replace fetch</p></blockquote><h4 id="copy">1.copy</h4><p>选项: src dest force backup owner group mode <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible all -m copy -a <span class="hljs-string">&#x27;src=/root/ansible/selinux dest=/etc/selinux/config backup=yes&#x27;</span><br>ansible all -m copy -a <span class="hljs-string">&#x27;src=/etc/shadow dest=/data/ mode=000 owner=xy&#x27;</span> <br>ansible all -m copy -a <span class="hljs-string">&#x27;content=&quot;hello\world\n&quot; dest=/data/f2 backup=yes mode=755 owner=root&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="filepathdestname">2.file(path,dest,name)</h4><p>选项: path state src force owner group mode recurse<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsrv -m file <span class="hljs-string">&#x27;path=/root/a.sh owner=xy mode=755&#x27;</span>  <br>ansible dbsrv -m file <span class="hljs-string">&#x27;src=/etc/fstab dest=/data/fstab-link state=link&#x27;</span>  <br>ansible dbsrv -m file <span class="hljs-string">&#x27;path=/home/state/test te=directory owner=xy group=xy recuser=yes&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="blockinfile-在指定的文件中插入一段文本">3.blockinfile:在指定的文件中插入”一段文本”</h4><p>选项: path block marker state insertafter insertbefore backupcreate<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m blockfile -a <span class="hljs-string">&#x27;path=/test/rc.local block=&quot;systemctl start mariadb\nsystemctl start httpd&quot; marker=&quot;#&#123;mark&#125; service to start&quot;&#x27;</span><br>ansible dbsvr -m blockfile -a <span class="hljs-string">&#x27;path=/test/rc.local marker=&quot;#&#123;mark&#125; service to start&quot; state=absent&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="lineinfile">4.lineinfile:</h4><p>选项: path line regexp state backrefs inserafter insertbefore backupcreate <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 确保某一行文本存在指定的文件中，若存在不做任何操作，默认在文件的末尾插入这行文本  </span><br>ansible dbsvr -m lineinfile -a <span class="hljs-string">&#x27;path=/test/test.txt regexp=&quot;^line&quot; line=&quot;test text&quot;&#x27;</span>  <br>ansible dbsvr -m -m lineinfile -a <span class="hljs-string">&#x27;path=/test/test.txt regexp=&quot;(H.&#123;4&#125;).*(H.&#123;4&#125;)&quot; line=&quot;\2&quot; backrefs=yes&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="find">5.find</h4><p>选项: path recurse hidden file_type patterns<br />use_regex contains age(s m h d w)<br />age_stamp(atime ctime mtime) size(t g m k b) get_checksum<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m find -a <span class="hljs-string">&#x27;path=/test patterns=&quot;*.sh&quot; file_type=any hidden=yes&#x27;</span> <br>ansible dbsvr -m find -a <span class="hljs-string">&#x27;path=/test age=-4d age_stamp=atime recurse=yes&#x27;</span>  <span class="hljs-comment"># 4天以内</span><br></code></pre></td></tr></table></figure></p><h4 id="replace">6.replace</h4><p>选项: path regexp replace backup <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m replace -a <span class="hljs-string">&#x27;path=/test regexp=&quot;ASM&quot; replace=asm backup=yes&#x27;</span>  <br></code></pre></td></tr></table></figure></p><h4 id="fetch远程单个文件可以先tar">7.fetch(远程单个文件,可以先tar)</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible all -m fetch -a <span class="hljs-string">&#x27;src=/var/log/message dest=/data&#x27;</span><br></code></pre></td></tr></table></figure><h3 id="命令类操作模块">命令类操作模块</h3><blockquote><p>command shell script</p></blockquote><h4 id="command默认">1.command(默认)</h4><p>选项: free_form chdir creates removes <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 该模块不支持`$、&lt;、&gt;、|、;、&amp;`等</span><br>ansible dbser -m <span class="hljs-built_in">command</span> -a <span class="hljs-string">&#x27;chdir=/data/f1.sh&#x27;</span><br>ansible dbser -a <span class="hljs-string">&#x27;echo 123456 |passwd --stdin user1&#x27;</span> <span class="hljs-comment"># fail</span><br>ansible dbuser -k all -m <span class="hljs-built_in">command</span> -a <span class="hljs-string">&quot;ping -c 1 www.baidu.com&quot;</span><br></code></pre></td></tr></table></figure></p><h4 id="shell">2.shell</h4><p>选项: free_form chdir creates removes executable<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbser -m shell -a <span class="hljs-string">&#x27;cat /etc/passwd |awk -F: &#123;print $1,$2&#125;&#x27;</span> &amp;&gt;/tmp/test.txt  <br></code></pre></td></tr></table></figure></p><h4 id="script">3.script</h4><p>选项: free_form chdir creates removes<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;hostname is <span class="hljs-variable">$HOSTNAME</span>&quot;</span><br>ansible all -m script -a <span class="hljs-string">&#x27;/root/ansible/host.sh&#x27;</span><br></code></pre></td></tr></table></figure></p><h3 id="系统类模块">系统类模块</h3><blockquote><p>cron service user group hostname yum setup synchronize debugyum_repository</p></blockquote><h4 id="cron">1.cron</h4><p>选项: minute hour day month weekday<br />special_time user job name<br />state disabled backup<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible all -m cron -a <span class="hljs-string">&#x27;minute=* weekday=1,3,5 job=&quot;/usr/bin/wall FBI warnning&quot; name=broadcast&#x27;</span>  <br>ansible all -m cron -a <span class="hljs-string">&#x27;disabled=true job=&quot;/usr/bin/wall FBI warnning&quot; name=broadcast&#x27;</span>  <br>ansible all -m cron -a <span class="hljs-string">&#x27;job=&quot;/usr/bin/wall FBI warnning&quot; name=broadcast state=absent&#x27;</span> <br></code></pre></td></tr></table></figure></p><h4 id="service">2.service</h4><p>选项: name state enabled <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m service -a <span class="hljs-string">&#x27;name=vsftpd state=started/stopped/reloaded/restarted enabled=true&#x27;</span> <br></code></pre></td></tr></table></figure></p><h4 id="user">3.user</h4><p>选项: name group gourps append shell uid<br />expires(指定用户过期时间) comment state<br />remove password update_passowrd(always on_create)<br />generate_ssh_key ssh_key_file ssh_key_passphrase ssh_key_type<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m user -a <span class="hljs-string">&#x27;name=nginx shell=/sbin/nologin system=true home=/usr/local/nginx groups=root,bin uid=80 comment=&quot;nginx service&quot;&#x27;</span><br>ansible dbsvr -m user -a <span class="hljs-string">&#x27;name=nginx state=absent remove=true&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="group">4.group</h4><p>选项: name state gid<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m group -a <span class="hljs-string">&#x27;name=nginx system=true gid=80&#x27;</span><br>ansible dbsvr -m  -a <span class="hljs-string">&#x27;getent group nginx&#x27;</span><br>ansible dbsvr -m group -a <span class="hljs-string">&#x27;name=nginx state=absent&#x27;</span><br></code></pre></td></tr></table></figure></p><h4 id="hostname">5.hostname</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible 192.168.30.103 -m hostname -a <span class="hljs-string">&#x27;name=node1&#x27;</span><br></code></pre></td></tr></table></figure><h4 id="yum_repository-yum">6.yum_repository &amp;&amp; yum</h4><p>选项: name baseurl description file enabled gpgcheck gpgcakeystate<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m yum_repository -a <span class="hljs-string">&#x27;name=AliEpel description=&quot;alibaba EPEL&quot; baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/&#x27;</span><br>ansible dbsvr -m yum_repository -a <span class="hljs-string">&#x27;name=local baseurl=file://media description=&quot;local cd yum&quot; enabled=no&#x27;</span>  <br></code></pre></td></tr></table></figure></p><p>选项: name state disable_gpg_check enablerepo disablerepo<br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible dbsvr -m yum -a <span class="hljs-string">&#x27;name=vsftpd,httpd state=installed&#x27;</span>  <br>ansible dbsvr -m yum -a <span class="hljs-string">&#x27;name=vsftpd,httpd state=removed&#x27;</span><br>ansible dbsvr -m yum -a <span class="hljs-string">&#x27;list=installed&#x27;</span>  <br>ansible dbsvr -m yum -a <span class="hljs-string">&#x27;name=dstat update_cache=yes&#x27;</span>  <br></code></pre></td></tr></table></figure></p><h4 id="setup内部变量">7.setup(内部变量)</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible all -m setup -a <span class="hljs-string">&quot;filter=*memtotal*&quot;</span>  <span class="hljs-comment"># 查看 内部变量</span><br>ansible_memetotal_mb<span class="hljs-comment"># 4  </span><br>ansible all -m -a <span class="hljs-string">&#x27;filter=ansible_memory_mb&#x27;</span><br></code></pre></td></tr></table></figure><h4id="synchronize目录文件同步基于rsync命令工具">8.synchronize(目录文件同步,基于rsync命令工具)</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible -k all -m synchronize -a <span class="hljs-string">&#x27;src=/tmp/ dest=/tmp compress=yes rsync_opts=--no-motd,--exclude=.txt&#x27;</span><br></code></pre></td></tr></table></figure><h4 id="debug">9.debug</h4><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-string">ansible</span> <span class="hljs-string">dbsvr</span> <span class="hljs-string">-m</span> <span class="hljs-string">debug</span> <span class="hljs-string">-a</span> <span class="hljs-string">&quot;msg=<span class="hljs-template-variable">&#123;&#123;ansible_version&#125;&#125;</span>&quot;</span><br><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">host:</span> <span class="hljs-string">test01</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars:</span> <br>    <span class="hljs-attr">testvar:</span> <span class="hljs-string">value</span> <span class="hljs-string">of</span> <span class="hljs-string">test</span> <span class="hljs-string">variable</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">debug</span> <span class="hljs-string">demo</span><br>      <span class="hljs-attr">debug:</span> <br>        <span class="hljs-attr">var:</span> <span class="hljs-string">testvar</span><br>        <span class="hljs-attr">msg:</span> <span class="hljs-string">&quot;value of testvar is: <span class="hljs-template-variable">&#123;&#123;testvar&#125;&#125;</span>&quot;</span><br><br><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">test02</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars_prompt:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;Your_name&quot;</span><br>      <span class="hljs-attr">prompt:</span> <span class="hljs-string">&quot;What is your name&quot;</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">&quot;Your_age&quot;</span><br>      <span class="hljs-attr">prompt:</span> <span class="hljs-string">&quot;How old are you&quot;</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">output</span> <span class="hljs-string">vars</span><br>      <span class="hljs-attr">debug:</span><br>        <span class="hljs-attr">msg:</span> <span class="hljs-string">Your</span> <span class="hljs-string">name</span> <span class="hljs-string">is</span> &#123;&#123;<span class="hljs-string">Your_name</span>&#125;&#125;<span class="hljs-string">,You</span> <span class="hljs-string">are</span> &#123;&#123;<span class="hljs-string">Your_age</span>&#125;&#125; <span class="hljs-string">years</span> <span class="hljs-string">old.</span><br></code></pre></td></tr></table></figure><h2 id="ansible-playbook">ansible-playbook</h2><blockquote><p>PlayBook是由一个或多个”play”组成的列表，play的主要功能是为Ansible中的task定义好角色–指定剧本对应的服务器组；task是一个任务，调用Ansible各种模块，将多个play组织在一个PlayBook剧本中，组成非常完整的流程控制集合。</p></blockquote><blockquote><p>剧本 &lt;–task &lt;–modules</p></blockquote><h3 id="usage">Usage</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">ansible-playbook [options] playbook.yml [playbook2 ...]<br>ansible-playbook --syntax-check sample.yml<span class="hljs-comment"># 测试是否由语法错误  </span><br></code></pre></td></tr></table></figure><h3 id="语法">语法</h3><blockquote><p>在YAML语法中，<code>---</code>表示文档开始，<code>-</code>作为开头也表示一个块序列的节点；列表 - 字典 key: value 或者 { key1: value1, key2: value2, …}</p></blockquote><blockquote><p>Ansible的幂等性:幂等性能够<code>保持重复执行一项操作</code>时，<code>得到的结果是相同的</code>，ansible是以<code>“结果为导向的”</code>，指定一个状态，ansible会自动判断，“当前状态”是否一致，如果一致，则不进行任何操作，不一致将当前状态变为目标指定状态。</p></blockquote><blockquote><p>key: value 可同行写也可换行写, 值可是字符串，也可是列表；</p></blockquote><h4 id="基础">基础</h4><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-comment"># test yml</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrv</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">create</span> <span class="hljs-string">new</span> <span class="hljs-string">file</span>  <span class="hljs-comment"># describe</span><br>      <span class="hljs-attr">file:</span> <span class="hljs-string">name=/data/newfile</span> <br>            <span class="hljs-string">state=touch</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">create</span> <span class="hljs-string">new</span> <span class="hljs-string">user</span><br>      <span class="hljs-attr">user:</span> <br>        <span class="hljs-string">name=test2</span> <br>        <span class="hljs-string">system=yes</span> <br>        <span class="hljs-string">shell=/sbin/nologin</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">install</span> <span class="hljs-string">package</span><br>      <span class="hljs-attr">yum:</span> <span class="hljs-string">name=httpd</span><br></code></pre></td></tr></table></figure><h4 id="handler-notify-tags">handler &amp;&amp; notify || tags</h4><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-comment"># apache service</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrvs</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">install</span> <span class="hljs-string">httpd</span> <span class="hljs-string">package</span><br>      <span class="hljs-attr">yum:</span> <span class="hljs-string">name=httpd</span><br>      <span class="hljs-attr">tags:</span> <span class="hljs-string">inshttpd</span>            <span class="hljs-comment"># 标签，指定执行哪些任务</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">copy</span> <span class="hljs-string">conf</span> <span class="hljs-string">file</span><br>      <span class="hljs-attr">copy:</span> <span class="hljs-string">src=files/httpd.conf</span> <span class="hljs-string">dest=/etc/httpd/conf</span> <span class="hljs-string">backup=yes</span><br>      <span class="hljs-attr">notify:</span> <span class="hljs-string">restart</span> <span class="hljs-string">service</span>   <span class="hljs-comment"># 触发特性条件，跳过以下命令，执行指定handlers任务</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">start</span> <span class="hljs-string">service</span><br>      <span class="hljs-attr">service:</span> <span class="hljs-string">name=httpd</span> <span class="hljs-string">state=started</span> <span class="hljs-string">enabled=true</span><br>      <span class="hljs-attr">tags:</span> <span class="hljs-string">reshttpd</span>     <span class="hljs-comment"># 标签</span><br>  <span class="hljs-attr">handlers:</span>         <span class="hljs-comment"># 触发器，另一种形式的task</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">restart</span> <span class="hljs-string">service</span><br>      <span class="hljs-attr">service:</span> <span class="hljs-string">name=httpd</span> <span class="hljs-string">state=restarted</span><br> <br><span class="hljs-string">ansible-playbook</span> <span class="hljs-string">-t</span> <span class="hljs-string">inshttpd,reshttpd</span> <span class="hljs-string">httpd.yml</span>  <span class="hljs-comment"># -t,--tags 指定执行标签  </span><br></code></pre></td></tr></table></figure><h4 id="var-变量">var 变量</h4><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-comment"># var</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">appserv</span><br>  <span class="hljs-attr">remote:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars:</span>  <span class="hljs-comment"># 变量</span><br>    <span class="hljs-attr">nginx:</span><br>    <span class="hljs-attr">conf80:</span> <span class="hljs-string">/etc/nginx/conf.d/80.conf</span><br>    <span class="hljs-attr">conf8080:</span> <span class="hljs-string">/etc/nginx/conf.d/8080.conf</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">task1</span><br>      <span class="hljs-attr">file:</span> <br>        <span class="hljs-string">path=&quot;&#123;&#123;nginx.conf80&#125;&#125;&quot;</span> <br>        <span class="hljs-string">state=touch</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">task2</span><br>      <span class="hljs-attr">file:</span> <br>        <span class="hljs-string">path=&quot;&#123;&#123;nginx[&#x27;conf8080&#x27;]&#125;&#125;&quot;</span><br>        <span class="hljs-string">state=touch</span><br><span class="hljs-comment">#############################</span><br><span class="hljs-string">cat</span> <span class="hljs-string">vars.yml</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">var1:</span> <span class="hljs-string">httpd</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">var2:</span> <span class="hljs-string">nginx</span><br><span class="hljs-comment">######</span><br><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">web</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars_files:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">vars.yml</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">vreate</span> <span class="hljs-string">httpd</span> <span class="hljs-string">log</span><br>      <span class="hljs-attr">file:</span> <span class="hljs-string">name=/app/&#123;&#123;</span> <span class="hljs-string">var1</span> <span class="hljs-string">&#125;&#125;.log</span> <span class="hljs-string">state=touch</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">vreate</span> <span class="hljs-string">httpd</span> <span class="hljs-string">log</span><br>      <span class="hljs-attr">file:</span> <span class="hljs-string">name=/app/&#123;&#123;</span> <span class="hljs-string">var2</span> <span class="hljs-string">&#125;&#125;.log</span> <span class="hljs-string">state=touch</span> <br></code></pre></td></tr></table></figure><h2 id="templatejinja2">Template(Jinja2)</h2><h3 id="when">when</h3><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-comment"># test template</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrvs</span><br>  <span class="hljs-attr">remove_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">http_port:</span> <span class="hljs-number">88</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">install</span> <span class="hljs-string">package</span><br>      <span class="hljs-attr">yum:</span> <span class="hljs-string">name=nginx</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">copy</span> <span class="hljs-string">template</span><br>      <span class="hljs-attr">template:</span> <span class="hljs-string">src=nginx.conf.j2</span> <span class="hljs-string">dest=/etc/nginx/nginx.conf</span>  <span class="hljs-comment"># 模板</span><br>      <span class="hljs-attr">when:</span> <span class="hljs-string">ansible_distribution_major_version</span> <span class="hljs-string">==</span> <span class="hljs-string">&quot;7&quot;</span>   <span class="hljs-comment"># 判断</span><br>      <span class="hljs-attr">notify:</span> <span class="hljs-string">restart</span> <span class="hljs-string">service</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">copy</span> <span class="hljs-string">template</span><br>      <span class="hljs-attr">template:</span> <span class="hljs-string">src=nginx.conf.j2</span> <span class="hljs-string">dest=/etc/nginx/nginx.conf</span>  <span class="hljs-comment"># 模板</span><br>      <span class="hljs-attr">when:</span> <span class="hljs-string">ansible_distribution_major_version</span> <span class="hljs-string">==</span> <span class="hljs-string">&quot;6&quot;</span> <br>      <span class="hljs-attr">notify:</span> <span class="hljs-string">restart</span> <span class="hljs-string">service</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">start</span> <span class="hljs-string">service</span><br>      <span class="hljs-attr">service:</span> <span class="hljs-string">name=nginx</span> <span class="hljs-string">state=started</span> <span class="hljs-string">enables=true</span><br>  <span class="hljs-attr">handlers:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">restart</span> <span class="hljs-string">service</span><br>      <span class="hljs-attr">service:</span> <span class="hljs-string">name=nginx</span> <span class="hljs-string">state=restarted</span> <br><br><span class="hljs-comment"># 查看内置变量, 修改 nginx 模板, 其它配置不变</span><br><span class="hljs-string">ansible</span> <span class="hljs-string">websrvs/all</span> <span class="hljs-string">-m</span> <span class="hljs-string">setup</span> <span class="hljs-string">|grep</span> <span class="hljs-string">cpu</span>    <br><br><span class="hljs-string">vim</span> <span class="hljs-string">templates/nginx.conf.j2</span><br>  <span class="hljs-string">user</span> <span class="hljs-string">nginx;</span>  <br>  <span class="hljs-string">worker_processes</span> &#123;&#123; <span class="hljs-string">ansible_processor_vcpu**2</span> &#125;&#125;<span class="hljs-string">;</span>  <span class="hljs-comment">#</span><br>  <span class="hljs-string">server</span> &#123; <span class="hljs-string">listen</span>[<span class="hljs-string">::</span>]<span class="hljs-string">:<span class="hljs-template-variable">&#123;&#123; http_port &#125;&#125;</span></span> <span class="hljs-string">default_server;</span> &#125;<br><br><span class="hljs-comment"># vim /etc/ansible/hosts  </span><br>[<span class="hljs-string">websrvs</span>]  <br><span class="hljs-number">192.168</span><span class="hljs-number">.30</span><span class="hljs-number">.101</span> <span class="hljs-string">http_port=81</span>  <br><span class="hljs-number">192.168</span><span class="hljs-number">.30</span><span class="hljs-number">.102</span> <span class="hljs-string">http_port=82</span>    <br><br><span class="hljs-string">ansible-playbook</span> <span class="hljs-string">-e</span> <span class="hljs-string">&quot;http_port=99&quot;</span> <span class="hljs-string">testtempl.yml</span><br></code></pre></td></tr></table></figure><h3 id="循环">循环</h3><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrvs</span> <br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">tasks:</span><br>  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">create</span> <span class="hljs-string">groups</span><br>    <span class="hljs-comment"># item 用的是with_item的内容</span><br>    <span class="hljs-attr">group:</span> <span class="hljs-string">name=&#123;&#123;</span> <span class="hljs-string">item</span> <span class="hljs-string">&#125;&#125;</span> <span class="hljs-string">state=present</span> <br>    <span class="hljs-attr">with_items:</span> <span class="hljs-comment"># 列表循环 [], with_items: [1, 2, 3]</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">group1</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">group2</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-string">group3</span><br>  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">create</span> <span class="hljs-string">users</span><br>    <span class="hljs-attr">user:</span> <span class="hljs-string">name=&#123;&#123;</span> <span class="hljs-string">item.name</span> <span class="hljs-string">&#125;&#125;</span> <span class="hljs-string">group=&#123;&#123;</span> <span class="hljs-string">item.group</span> <span class="hljs-string">&#125;&#125;</span> <span class="hljs-string">state=present</span><br>    <span class="hljs-attr">with_items:</span>  <span class="hljs-comment"># 字典&#123;key.value&#125;</span><br>      <span class="hljs-bullet">-</span> &#123; <span class="hljs-attr">name:</span> <span class="hljs-string">&#x27;user1&#x27;</span>, <span class="hljs-attr">group:</span> <span class="hljs-string">&#x27;group1&#x27;</span> &#125; <br>      <span class="hljs-bullet">-</span> &#123; <span class="hljs-attr">name:</span> <span class="hljs-string">&#x27;user2&#x27;</span>, <span class="hljs-attr">group:</span> <span class="hljs-string">&#x27;group2&#x27;</span> &#125; <br>      <span class="hljs-bullet">-</span> &#123; <span class="hljs-attr">name:</span> <span class="hljs-string">&#x27;user3&#x27;</span>, <span class="hljs-attr">group:</span> <span class="hljs-string">&#x27;group3&#x27;</span> &#125;  <br></code></pre></td></tr></table></figure><h3 id="for">for</h3><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrvs</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars:</span><br>    <span class="hljs-attr">ports:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">web1:</span><br>        <span class="hljs-attr">port:</span> <span class="hljs-number">81</span><br>        <span class="hljs-comment"># name: web1.xy.com</span><br>        <span class="hljs-attr">rootdir:</span> <span class="hljs-string">/data/website1</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">web2:</span><br>        <span class="hljs-attr">port:</span> <span class="hljs-number">82</span><br>        <span class="hljs-attr">name:</span> <span class="hljs-string">web2.xy.com</span><br>        <span class="hljs-attr">rootdir:</span> <span class="hljs-string">/data/website2</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-attr">web1:</span><br>        <span class="hljs-attr">port:</span> <span class="hljs-number">83</span><br>        <span class="hljs-comment"># name: web3.xy.com</span><br>        <span class="hljs-attr">rootdir:</span> <span class="hljs-string">/data/website2</span><br>  <span class="hljs-attr">tasks:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">copy</span> <span class="hljs-string">conf</span><br>      <span class="hljs-attr">templte:</span> <span class="hljs-string">src=for1.conf.j2</span> <span class="hljs-string">dest=/data/for1.conf</span><br><span class="hljs-comment">###########</span><br><span class="hljs-string">vim</span> <span class="hljs-string">for1.conf.j2</span><br>    &#123;<span class="hljs-string">%</span> <span class="hljs-string">for</span> <span class="hljs-string">i</span> <span class="hljs-string">in</span> <span class="hljs-string">ports</span> <span class="hljs-string">%</span>&#125;<br>      <span class="hljs-string">server</span> &#123;<br>          <span class="hljs-string">listen</span> &#123;&#123; <span class="hljs-string">i.port</span> &#125;&#125;<br>          <span class="hljs-string">servername</span> &#123;&#123; <span class="hljs-string">i.name</span> &#125;&#125;<br>          <span class="hljs-string">documemtroot</span> &#123;&#123; <span class="hljs-string">i.rootdir</span> &#125;&#125;<br>      &#125;<br>    &#123;<span class="hljs-string">%</span> <span class="hljs-string">endfor</span> <span class="hljs-string">%</span>&#125;<br><br><span class="hljs-string">vim</span> <span class="hljs-string">testfor.yml</span><br><span class="hljs-meta">---</span><br><span class="hljs-bullet">-</span> <span class="hljs-attr">hosts:</span> <span class="hljs-string">websrvs</span><br>  <span class="hljs-attr">remote_user:</span> <span class="hljs-string">root</span><br>  <span class="hljs-attr">vars:</span><br>    <span class="hljs-attr">ports:</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-number">81</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-number">82</span><br>      <span class="hljs-bullet">-</span> <span class="hljs-number">83</span><br>  <span class="hljs-attr">task:</span><br>    <span class="hljs-bullet">-</span> <span class="hljs-string">name:copy</span> <span class="hljs-string">conf</span><br>      <span class="hljs-attr">templtate:</span> <span class="hljs-string">src=for1.conf.j2</span> <span class="hljs-string">dest=/data/for1.conf</span><br></code></pre></td></tr></table></figure><h3 id="if">if</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs yaml"><span class="hljs-string">vim</span> <span class="hljs-string">for4.conf.j2</span><br>  &#123;<span class="hljs-string">%</span> <span class="hljs-string">for</span> <span class="hljs-string">i</span> <span class="hljs-string">in</span> <span class="hljs-string">ports</span> <span class="hljs-string">%</span>&#125;<br>    <span class="hljs-string">server</span> &#123;<br>      <span class="hljs-string">listen</span> &#123;&#123; <span class="hljs-string">i.port</span> &#125;&#125;<br>    &#123;<span class="hljs-string">%</span> <span class="hljs-string">if</span> <span class="hljs-string">i.name</span> <span class="hljs-string">defined</span> <span class="hljs-string">%</span>&#125;<br>        <span class="hljs-string">servername</span> &#123;&#123; <span class="hljs-string">i.name</span> &#125;&#125;<br>      &#123;<span class="hljs-string">%</span> <span class="hljs-string">endif</span> <span class="hljs-string">%</span>&#125;<br>      <span class="hljs-string">documemtroot</span> &#123;&#123; <span class="hljs-string">i.rootdir</span> &#125;&#125;<br>    &#125;<br>  &#123;<span class="hljs-string">%</span> <span class="hljs-string">endfor</span> <span class="hljs-string">%</span>&#125;<br></code></pre></td></tr></table></figure><h3 id="roles-角色">Roles 角色</h3><p><a href="https://www.freesion.com/article/5487161337/">参考</a></p>]]>
    </content>
    <id>https://anyu967.github.io/posts/a71433d.html</id>
    <link href="https://anyu967.github.io/posts/a71433d.html"/>
    <published>2019-08-28T01:22:57.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-28-Ansible]]>
    </summary>
    <title>Ansible</title>
    <updated>2026-02-22T05:33:39.809Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Js" scheme="https://anyu967.github.io/categories/Js/"/>
    <category term="HTML" scheme="https://anyu967.github.io/tags/HTML/"/>
    <category term="JavaScript" scheme="https://anyu967.github.io/tags/JavaScript/"/>
    <content>
      <![CDATA[<p>2019-08-21-JS <span id="more"></span></p><h2 id="js相关知识点">Js相关知识点</h2><h3 id="js代码运行阶段">Js代码运行阶段:</h3><ol type="1"><li>解析阶段: 检查是否由语法错误及变量、函数的声明<br /></li><li>运行阶段: 变量的赋值，代码流程的执行</li></ol><h3 id="数据类型">数据类型</h3><blockquote><p>Number String Boolen undefined null Objec(function, 数组)</p></blockquote><h3 id="关于this">关于this：</h3><ul><li>指的是调用当前方法 / 函数 的那个对象 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn1</span> (<span class="hljs-params"></span>) &#123;<br>    <span class="hljs-variable language_">this</span>;<br>&#125;<br><span class="hljs-title function_">fn1</span>();<span class="hljs-comment">// this =&gt; window</span><br>------------------------------------------------------<br>oDiv.<span class="hljs-property">onclick</span> = fn1;  <span class="hljs-comment">// this =&gt; oDiv, 事件调用不加 ();</span><br>------------------------------------------------------    <br>oDiv.<span class="hljs-property">onclick</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) &#123;<br>    <span class="hljs-title function_">fn1</span>();<span class="hljs-comment">// fn1() 里的this =&gt; window</span><br>&#125;<br>------------------------------------------------------<br><span class="hljs-keyword">var</span> obj = &#123;<br>    <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;Li&#x27;</span>,<br>    <span class="hljs-attr">age</span>: <span class="hljs-number">18</span>,<br>    <span class="hljs-attr">fun</span>: <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<br>        <span class="hljs-keyword">var</span> s = <span class="hljs-variable language_">this</span>.<span class="hljs-property">age</span>;   <span class="hljs-comment">// this =&gt;obj</span><br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(s);<br>    &#125;<br>&#125;<br>obj.<span class="hljs-title function_">fun</span>();      <br></code></pre></td></tr></table></figure></li><li>1.以<code>函数</code>的形式调用时, this永远都是window, 比如fun();相当于window.fun();</li><li>2.以<code>方法</code>的形式调用时, this是调用方法的那个对象</li><li>3.以<code>构造函数</code>的形式调用时, this是新创建的那个对象</li><li>4.以<code>使用call和apply</code>调用时, this是指定的那个对象</li></ul><h3 id="关于函数返回值">关于函数返回值：</h3><ul><li><p>函数名+括号: fn1() ==&gt; return 后面的的值，函数返回值</p></li><li><p>仅仅 是函数名调用：fn1==&gt;函数体对象为参数，即整个函数代码</p></li><li><p>所有函数默认返回值：未定义</p></li><li><p>return 之后任何代码都不执行</p></li><li><p>函数声明：</p><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs javascript">    <span class="hljs-keyword">function</span> 函数名(形参<span class="hljs-number">1</span>,形参<span class="hljs-number">2</span>,...)&#123;         <br>        code;                                        <br>        <span class="hljs-keyword">return</span> 返回值;                           <br>&#125; <br>    <br>    <span class="hljs-keyword">var</span> fun = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<br>        code;<br>&#125;  <br>    <br>    (<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<br>        code;<br>    &#125;)();        匿名函数(立即执行函数,自调用匿名函数) <br></code></pre></td></tr></table></figure></p></li></ul><h3 id="关于定时器">关于定时器：</h3><ul><li>var timer = setInterval(函数名， 毫秒);<ul><li>clearInterval(timer); // 重复执行</li><li>clearTimout(timer); // 执行一次</li></ul></li></ul><h3 id="关于oop">关于OOP：</h3><ul><li>特点：<ul><li>抽象：抓问题核心</li><li>封装：不考虑内部实现原理，只考虑功能使用</li><li>继承：从已有对象，继承出新的对象，多重继承，多态</li></ul></li><li>组成：<ul><li>方法：函数(过程、动态的)</li><li>属性：变量(状态、静态的) <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">People</span> (<span class="hljs-params">name</span>) &#123;  <span class="hljs-comment">// 构造</span><br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span> = name;<span class="hljs-comment">//  属性</span><br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">showName</span> = showName;<br>&#125;<br><span class="hljs-keyword">function</span> <span class="hljs-title function_">showName</span> (<span class="hljs-params"></span>) &#123;<span class="hljs-comment">// 方法</span><br>    <span class="hljs-title function_">alert</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span>);<br>&#125;<br><span class="hljs-keyword">var</span> p1 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">People</span>(<span class="hljs-string">&#x27;Jhon&#x27;</span>);<br>p1.<span class="hljs-title function_">showName</span>();<br>=========================================<br><span class="hljs-keyword">function</span> <span class="hljs-title function_">People</span> (<span class="hljs-params">name</span>) &#123;<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span> = name;<br>&#125;<br><span class="hljs-title class_">People</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">showName</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) &#123;<br>    <span class="hljs-title function_">alert</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span>);<br>&#125;<br><span class="hljs-keyword">var</span> p1 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">People</span>(<span class="hljs-string">&#x27;Jhon&#x27;</span>);<br>p1.<span class="hljs-title function_">showName</span>();<br>=========================================<br><span class="hljs-keyword">var</span> obj = &#123;<span class="hljs-attr">name</span>:<span class="hljs-string">&#x27;Li&#x27;</span>, <span class="hljs-attr">age</span>:<span class="hljs-number">12</span>, <span class="hljs-attr">fly</span>:<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;&#125;&#125;;<br><span class="hljs-keyword">var</span> obj = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Object</span>();<br></code></pre></td></tr></table></figure></li></ul></li></ul><h3 id="关于-dom-对像.属性-操作的各种尺寸宽高">关于 DOM 对像.属性操作的各种尺寸宽高：</h3><ul><li><strong>offset</strong><ul><li><code>offsetWidth[Height]</code> –&gt; 元素(盒子)的 <ahref="">宽高+padding+borde</a></li><li><code>offsetLeft[Top]</code> –&gt; 元素(盒子)的<ahref="">父级带有定位属性，左侧(顶部)距离数字</a>，<strong>从父亲的padding 开始算，父亲的 border不算</strong>；若没有定位，则以body为准<br /></li></ul></li><li><strong>offsetParent</strong><ul><li>带有定位的父级元素节点，若<ahref="">没有定位，返回结果为body</a>；若有<ahref="">返回最近的父级元素</a></li><li>本身定位为<code>fixed</code><ul><li>offsetParent:null (非火狐)</li><li>offsetParent:body（火狐）</li></ul></li><li>本身定位不为<code>fixed</code><ul><li>父级没有定位：offsetParent:body</li><li>父级有定位：offsetParent:定位父级</li></ul></li></ul></li><li><strong>scroll</strong><ul><li><p><code>scrollWidth[Height]</code> –&gt; 元素(盒子)的宽高，<ahref="">不包括border+margin</a>，<code>scrollWidth[Height]=width[Height]+padding</code></p><blockquote><p>scrollHeight有一个特点：如果文字超出了盒子，高度为内容的高（包括超出的内容）；不超出，则是盒子本身高度。</p></blockquote></li><li><p><code>scrollTop[Left]</code> –&gt;网页被卷去的头部与左部的距离，<a href="">兼容写法：</a><code>window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop</code></p></li></ul></li><li><strong>client</strong><ul><li><code>clientWidth[Height]</code> –&gt; 元素(盒子)的宽高，<ahref="">padding + width[height]</a>，调用body / html为获取网页可视区的宽高</li><li><code>clientX[]Y]</code> –&gt; 鼠标距离可视区<a href="">左侧 /上侧的距离</a></li><li><code>clientTop[Left]</code> –&gt; 元素(盒子)的<a href="">上 /左border</a></li></ul></li><li>总结：<ul><li><p>区别：宽高 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs javascript">offsetWidth = width + padding + border  <span class="hljs-comment">//  占位宽</span><br>offsetHeight = height + padding + border     <span class="hljs-comment">//  占位高</span><br><br>scrollWidth = 内容宽度（不包含border） <span class="hljs-comment">//  内容宽</span><br>scrollHeight = 内容高度（不包含border） <span class="hljs-comment">// 内容高</span><br><br>clientWidth = width + padding   <span class="hljs-comment">//  可视区宽</span><br>clientHeight = height + padding <span class="hljs-comment">//  可视区高</span><br></code></pre></td></tr></table></figure></p></li><li><p>区别：上左<br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs javascript">offsetTop/offsetLeft：<br>调用者：任意元素。(盒子为主)<br>作用：距离父系盒子中带有定位的距离。<br><br>scrollTop/scrollLeft：<br>调用者：<span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-property">scrollTop</span>（<span class="hljs-variable language_">window</span>调用）(盒子也可以调用，但必须有滚动条)<br>作用：浏览器无法显示的部分（被卷去的部分）。<br><br>clientY/clientX：<br>调用者：event   <span class="hljs-comment">// 重要</span><br>作用：鼠标距离浏览器可视区域的距离（左、上）<br></code></pre></td></tr></table></figure></p></li><li><img src="/posts/824395f6/BOM.png" class="" title="[BOM]"></li></ul></li></ul><h3 id="获取元素的样式">获取元素的样式：</h3><ul><li><p>currentStyle –&gt;该属性获取当前元素的样式，只有IE支持</p><ul><li>box1.currentStyle.width</li></ul></li><li><p>getComputerStyle() –&gt;该方法获取当前元素样式，</p><ul><li>getComputerStyle((box1, null).width);</li></ul></li><li><p><ahref="https://blog.csdn.net/qq_20069429/article/details/83267887">参看{}、[]、()区别</a></p></li><li><p><code>&#123;&#125;</code>–&gt;表示对象;<code>[]</code>–&gt;表示对象的属性、方法;<code>()</code>–&gt;如果用在方法名后面</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">getStyle</span>(<span class="hljs-params">obj, attr</span>) &#123;<br><span class="hljs-keyword">return</span> obj.<span class="hljs-property">currentStyle</span>?obj.<span class="hljs-property">currentStyle</span>[attr]:obj.<span class="hljs-property">getComputerStyle</span>[attr];<br>&#125;<br>showMsg.<span class="hljs-property">innerHTML</span> = <span class="hljs-string">&quot;x = &quot;</span>+x + <span class="hljs-string">&quot;, y = &quot;</span>+y; <span class="hljs-comment">// x, 均为变量</span><br></code></pre></td></tr></table></figure></li></ul><h3 id="关于闭包">关于闭包：</h3><ul><li>嵌套的内部函数引用了嵌套的外部函数的变量，就产生了闭包</li><li>闭包 存在于嵌套的内部函数中 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn1</span>(<span class="hljs-params"></span>)&#123;<br>  <span class="hljs-keyword">var</span> a = <span class="hljs-number">2</span>;<br>  <span class="hljs-keyword">var</span> b = <span class="hljs-string">&#x27;abc&#x27;</span>;<br>  <span class="hljs-keyword">function</span> <span class="hljs-title function_">fn2</span>(<span class="hljs-params"></span>)&#123; <span class="hljs-comment">// 执行函数定义产生闭包(不用调用内部函数)</span><br>  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(a);<br>  &#125; <br>&#125;<br><span class="hljs-title function_">fn1</span>();  <span class="hljs-comment">//</span><br></code></pre></td></tr></table></figure></li></ul><h3 id="关于es6">关于ES6</h3><blockquote><p>变量的解构赋值, 给多个形参赋值</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs javascript">对象的解构赋值: <br><span class="hljs-keyword">let</span> obj = &#123;<span class="hljs-attr">username</span>: <span class="hljs-string">&#x27;anyue&#x27;</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">39</span>&#125;;<br><span class="hljs-comment">// let username = obj.username;</span><br><span class="hljs-keyword">let</span> &#123;username, age&#125; = obj;<br><br>数组的解构赋值:<br><span class="hljs-keyword">let</span> arr = [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>, <span class="hljs-string">&#x27;abc&#x27;</span>, <span class="hljs-literal">true</span>];<br><span class="hljs-keyword">let</span> [, , c, d, e] =arr;<br><br><span class="hljs-keyword">function</span> <span class="hljs-title function_">foo</span>(<span class="hljs-params">&#123;username, age&#125;</span>) &#123;<br>    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(username, age);<br>&#125;<br></code></pre></td></tr></table></figure><h3 id="模版字符串">模版字符串</h3><p><strong>必须用 `` 包含</strong><br /><strong>变化的部分使用 {xxx} 定义</strong> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">let</span> obj = &#123;<span class="hljs-attr">username</span>: <span class="hljs-string">&#x27;anyue&#x27;</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">39</span>&#125;;<br><span class="hljs-keyword">let</span> str = <span class="hljs-string">&#x27;我的名字是: &#x27;</span> + obj.<span class="hljs-property">username</span> + <span class="hljs-string">&#x27;, 我今年的年龄是: &#x27;</span> + obj.<span class="hljs-property">age</span>;<br>str = <span class="hljs-string">`我的名字是: $(obj.username), 我今年的年龄是: &#123;obj.age&#125;`</span>;<br><br></code></pre></td></tr></table></figure></p><h3 id="对象的简写方式">对象的简写方式</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">let</span> username = <span class="hljs-string">&#x27;anyue&#x27;</span>;<br><span class="hljs-keyword">let</span> age = <span class="hljs-number">39</span>;<br><span class="hljs-keyword">let</span> obj = &#123;<br>    <span class="hljs-comment">// username: username,</span><br>    <span class="hljs-comment">// age: age,</span><br>    <span class="hljs-comment">// getName: function()&#123;&#125;</span><br><br>    username,   <span class="hljs-comment">// 省略同名的属性值</span><br>    age,<br>    <span class="hljs-title function_">getName</span>(<span class="hljs-params"></span>) &#123; <span class="hljs-comment">// 省略方法的 function</span><br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">username</span>;<br>    &#125;<br>&#125;;<br></code></pre></td></tr></table></figure><h3 id="箭头函数">箭头函数</h3><p>不是调用的时候决定的, 而是在定义的时候处在的对像就是 它的this,常规函数则相反 箭头函数的<code>this</code>确定: 外层有函数,则外层函数的this就是内部箭头函数的this, 若没有, 则this是window 参数=&gt; 语句/表达式 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// let fun = function() &#123;&#125;;</span><br><span class="hljs-keyword">let</span> <span class="hljs-title function_">fun</span> = (<span class="hljs-params"></span>) =&gt; <span class="hljs-title function_">console</span>(<span class="hljs-string">&#x27;我是箭头函数&#x27;</span>);<br><span class="hljs-title function_">fun</span>();<br>形参:<br>  <span class="hljs-number">1.</span>没有形参:<br>    <span class="hljs-keyword">let</span> <span class="hljs-title function_">fun1</span> = (<span class="hljs-params"></span>) =&gt; <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;我是箭头函数&#x27;</span>);<br>    fun1;<br>  <span class="hljs-number">2.</span>只有一个形参:<br>    <span class="hljs-keyword">let</span> <span class="hljs-title function_">fun2</span> = a =&gt; <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(a); <span class="hljs-comment">// 形参的()可以省略</span><br>    <span class="hljs-title function_">fun2</span>(aaa);<br>  <span class="hljs-number">3.</span>两个及以上:<br>    <span class="hljs-keyword">let</span> <span class="hljs-title function_">fun3</span> = (<span class="hljs-params">x, y</span>) =&gt; <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(x, y); <br>    <span class="hljs-title function_">fun3</span>(<span class="hljs-number">25</span>, <span class="hljs-number">36</span>);<br>函数体:<br>  <span class="hljs-number">1.</span>函数体只有一条执行语句/表达式, &#123;&#125;可以省略, 会自动返回执行的结果:<br>    <span class="hljs-keyword">let</span> <span class="hljs-title function_">fun4</span> = (<span class="hljs-params">x, y</span>) =&gt; x+y; <span class="hljs-comment">// let fun1 = (x, y) =&gt; &#123;return x+y&#125;;</span><br>    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">fun4</span>(<span class="hljs-number">25</span>, <span class="hljs-number">36</span>));<br>  <span class="hljs-number">2.</span>函数体不只一条执行语句/表达式:<br>    <span class="hljs-keyword">let</span> <span class="hljs-title function_">fun5</span> = (<span class="hljs-params">x, y</span>) =&gt; &#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(x, y);<br>        <span class="hljs-keyword">return</span> x + y;<br>    &#125;<br>    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">fun5</span>(<span class="hljs-number">25</span>, <span class="hljs-number">36</span>));<br>测试箭头函数的<span class="hljs-attr">this</span>:<br><span class="hljs-keyword">let</span> btn1 = doucument.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;btn1&#x27;</span>);<br><span class="hljs-keyword">let</span> btn2 = doucument.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;btn2&#x27;</span>);<br><br>btn1.<span class="hljs-property">onclick</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) &#123;<span class="hljs-title function_">alert</span>(<span class="hljs-variable language_">this</span>)&#125;;    <span class="hljs-comment">// this = btn1</span><br>btn2.<span class="hljs-property">onclick</span> = <span class="hljs-function">() =&gt;</span> &#123;<span class="hljs-title function_">alert</span>(<span class="hljs-variable language_">this</span>)&#125;  <span class="hljs-comment">// this = Window</span><br><br><span class="hljs-keyword">let</span> obj = &#123;<br>    <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;箭头函数&#x27;</span>,<br>    <span class="hljs-attr">getName</span>: <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<br>        btn2.<span class="hljs-property">onclick</span> = <span class="hljs-function">() =&gt;</span> &#123;<span class="hljs-title function_">alert</span>(<span class="hljs-variable language_">this</span>)&#125;;<br>    &#125;<br>&#125;<br>obj.<span class="hljs-title function_">getName</span>();  <span class="hljs-comment">// this = obj</span><br></code></pre></td></tr></table></figure></p><h3 id="三点运算符-数组扩展方法">三点运算符 &amp;&amp; 数组扩展方法</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">foo</span>(<span class="hljs-params">...value</span>)&#123;<br>    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(value);<br>    value.<span class="hljs-title function_">foreach</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">item, index</span>)&#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(item, index);<br>    &#125;)<br>&#125;<br><br><span class="hljs-keyword">var</span> arr = [<span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">6</span>, <span class="hljs-number">5</span>, <span class="hljs-number">4</span>];<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arr.<span class="hljs-title function_">indexOf</span>(<span class="hljs-number">4</span>));    <span class="hljs-comment">// 1 得到值在数组中的第一个下标</span><br><br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arr.<span class="hljs-title function_">lastIndexOf</span>(<span class="hljs-number">4</span>));    <span class="hljs-comment">// 7 </span><br><br>arr.<span class="hljs-title function_">forEach</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">item, index</span>) &#123;<br>    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(item, index);   <span class="hljs-comment">// 遍历数组</span><br>&#125;);<br><br><span class="hljs-keyword">var</span> arr1 = arr.<span class="hljs-title function_">map</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">item, index</span>) &#123;<br>    <span class="hljs-keyword">return</span> item+<span class="hljs-number">10</span>;<br>&#125;);<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arr1, arr);  <span class="hljs-comment">// 遍历数组返回新的数组, 返回加工之后的值</span><br><br><span class="hljs-keyword">var</span> arr2 = arr.<span class="hljs-title function_">filter</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">item, index</span>) &#123;<br>    <span class="hljs-keyword">return</span> item &gt; <span class="hljs-number">3</span>;<br>&#125;)<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arr2, arr); <span class="hljs-comment">// 4, 6, 5, 4</span><br></code></pre></td></tr></table></figure><h3 id="promise-对象">Promise 对象</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">getNews</span>(<span class="hljs-params">url</span>) &#123;<br>    <span class="hljs-keyword">let</span> promise = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> &#123;<br>        <span class="hljs-comment">// 状态: 初始化</span><br><br>        <span class="hljs-comment">// 执行异步任务</span><br>        <span class="hljs-keyword">let</span> xmlHttp = <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLHttpRequest</span>();<br>        xmlHttp.<span class="hljs-property">onreadystatechange</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) &#123;<br>            <span class="hljs-keyword">if</span>(xmlHttp.<span class="hljs-property">readyState</span> ===<span class="hljs-number">4</span>)&#123;<br>                <span class="hljs-keyword">if</span>(xmlHttp.<span class="hljs-property">status</span> == <span class="hljs-number">200</span>)&#123;<br>                    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(xmlHttp.<span class="hljs-property">reponseText</span>);<br>                    <span class="hljs-title function_">resolve</span>(xmlHttp.<span class="hljs-property">reponseText</span>);  <span class="hljs-comment">// 修改</span><br>            &#125;<span class="hljs-keyword">else</span>&#123;<br>                <span class="hljs-title function_">reject</span>(<span class="hljs-string">&#x27;暂时没有数据&#x27;</span>);<br>                &#125;<br>            &#125;<br>        &#125;;<br>        xmlHttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&#x27;GET&#x27;</span>, url);<br>        xmlHttp.<span class="hljs-title function_">send</span>();<br>    &#125;)<br>    <span class="hljs-keyword">return</span> promise;<br>&#125;<br><span class="hljs-title function_">getNews</span>(<span class="hljs-string">&#x27;http://localhost:1080/news?id=2&#x27;</span>)<br>    .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">data</span>) =&gt;</span> &#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(data);<br>        <span class="hljs-keyword">let</span> commentsUrl = <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(data).<span class="hljs-property">commentsUrl</span>;<br>        <span class="hljs-keyword">let</span> url = <span class="hljs-string">&#x27;http://localhost:1080&#x27;</span> + commentsUrl;<br>        <span class="hljs-keyword">return</span> <span class="hljs-title function_">getNews</span>(url);<br>    &#125;, <span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span>&#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);<br>    &#125;)<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/824395f6.html</id>
    <link href="https://anyu967.github.io/posts/824395f6.html"/>
    <published>2019-08-21T04:49:26.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-21-JS]]>
    </summary>
    <title>Js</title>
    <updated>2026-02-22T05:33:39.807Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Shell" scheme="https://anyu967.github.io/categories/Shell/"/>
    <category term="Linux" scheme="https://anyu967.github.io/tags/Linux/"/>
    <category term="Shell" scheme="https://anyu967.github.io/tags/Shell/"/>
    <content>
      <![CDATA[<p>2019-08-12-Shell <span id="more"></span></p><h1 id="shell">Shell</h1><h2 id="第一个shell">第一个Shell</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Hello World!&quot;</span><br></code></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">bash -x file.sh        <span class="hljs-comment">#单步执行  </span><br>/etc/motd &amp;&amp; /etc/issue  <br><span class="hljs-built_in">printenv</span> <span class="hljs-built_in">env</span> <span class="hljs-built_in">export</span>    <span class="hljs-comment"># 查看当前shell中的环境变量</span><br><span class="hljs-built_in">set</span>                    <span class="hljs-comment"># 查看shell中的变量</span><br><span class="hljs-built_in">unset</span>                  <span class="hljs-comment"># 撤销变量</span><br></code></pre></td></tr></table></figure><table><thead><tr><th style="text-align: left;">选项</th><th style="text-align: left;">说明</th></tr></thead><tbody><tr><td style="text-align: left;">-e</td><td style="text-align: left;">支持</td></tr><tr><td style="text-align: left;">-n</td><td style="text-align: left;">输出不换行</td></tr></tbody></table><h2 id="变量">变量</h2><h3 id="定义变量">定义变量</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">your_name=<span class="hljs-string">&quot;anyue967&quot;</span>,  <span class="hljs-comment"># 变量名前不加$，不能有空格  </span><br><br><span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> `<span class="hljs-built_in">ls</span> /etc`<span class="hljs-comment"># 显示直接俄赋值/语句赋值</span><br><span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> $(<span class="hljs-built_in">ls</span> /etc)  <br></code></pre></td></tr></table></figure><table><thead><tr><th style="text-align: left;">特殊符号</th><th style="text-align: left;">说明</th></tr></thead><tbody><tr><td style="text-align: left;">()</td><td style="text-align: left;">重新开子shell中执行<code>$( ls;cd /etc/ )</code></td></tr><tr><td style="text-align: left;">{}</td><tdstyle="text-align: left;">当前shell中执行<code>$&#123; ls;cd /etc/; &#125;</code></td></tr><tr><td style="text-align: left;">“”</td><td style="text-align: left;">–</td></tr><tr><td style="text-align: left;">’’</td><td style="text-align: left;">–</td></tr><tr><td style="text-align: left;">`` / $()</td><td style="text-align: left;">执行命令</td></tr><tr><td style="text-align: left;">[]</td><td style="text-align: left;">变量测试</td></tr><tr><td style="text-align: left;">#</td><td style="text-align: left;">注释</td></tr><tr><td style="text-align: left;">$</td><td style="text-align: left;">引用变量</td></tr><tr><td style="text-align: left;">\</td><td style="text-align: left;">转义符</td></tr></tbody></table><h3 id="使用变量">使用变量</h3><p><strong>引用变量时, 变量名前要加<code>$</code></strong>,建议变量名外加<code>&#123;&#125;</code>, 一种习惯 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-keyword">for</span> skill <span class="hljs-keyword">in</span> Ada Coffe Action Java Shell; <span class="hljs-keyword">do</span><br>    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;I am good at <span class="hljs-variable">$&#123;skill&#125;</span>Script&quot;</span><br><span class="hljs-keyword">done</span><br></code></pre></td></tr></table></figure></p><h3 id="变量类型-局部环境shell变量三种">变量类型:局部、环境、Shell变量三种</h3><ul><li><p><strong>local 局部变量</strong> 在脚本或命令中定义,仅在当前shell实例中有效, 其他shell启动的程序不能访问局部变量；</p></li><li><p><strong>export 环境变量</strong>作用范围：当前shell及子shell；<br /></p></li><li><p><strong>shell变量</strong> shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量，有一部分是局部变量，这些变量保证了shell的正常运行；</p></li><li><p><strong>只读变量</strong><code>readonly name 或 declare -r name  readonly -p</code>；</p></li><li><p>各个环境变量配置文件(<code>source &lt;==&gt; .</code>)</p><ul><li>profile: <code>设定环境变量，运行命令/脚本</code></li><li>bashrc: <code>设定本地变量，定义命令别名</code> #### 配置文件<img src="/posts/4592b2fd/bash.png" class="" title="[bash 配置]"><br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">登录shell：/etc/profile --&gt;/etc/profile.d/*.sh --&gt;~/.bash_profile --&gt;~/.bashrc --&gt;/etc/bashrc<br>非登录shell：~/.bashrc --&gt;/etc/bashrc --&gt;/etc/profile.d/*.sh   <br></code></pre></td></tr></table></figure></li></ul></li><li><p>位置变量 | 符号 | 说明 | | :——– | :———————————— | | $1,$2,… |对应位置参数 | | $0 | 脚本名称 | | $* |传递所有参数,全部参数合为一个字符串 | | $@ |传递所有参数,每个参数表现为独立字符串 | | $# | 参数个数 | | $? |返回最后一条命令执行的状态 | | $$ | 当前进程PID | | $! |后台运行最后一个进程的PID | | set | 清空所有位置变量 | | shift n |移动参数,前n位参数被销毁 |</p></li><li><p>关于<code>()、(())、[]、[[]]、&#123;&#125;</code></p></li><li><p><ahref="https://www.cnblogs.com/splendid/p/11201733.html">参考</a> | 类型| 说明 | | :—— | :——————————————————– | | () |用于<code>多个命令组</code>、命令替换<code>cmd</code>、初始化数组<code>$(cmd)</code>| | (()) |<code>算数</code>:整数扩展、运算符、重定义变量值、算数运算比较 | | [[]]| 支持数学运算，支持逻辑测试: <code>&amp;&amp; || !</code> | | []/test |不支持数学运算，比较运算:<code>== !=</code>，逻辑测试使用:<code>-a -o !</code> | | {} | 用于命令合集或者范围，mkdir -p/data/201{7,8} |</p></li></ul><h2 id="字符串">字符串</h2><h3 id="字符串-可以用-也可以用"><strong>字符串, 可以用<code>''</code>,也可以用<code>""</code></strong></h3><ul><li><p><strong>单引号</strong>里的任何字符都会原样输出,单引号字符串中的变量是无效的;</p></li><li><p><strong>单引号</strong>字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现，作为字符串拼接使用</p></li><li><p><strong>双引号</strong>里可以有变量, 可以出现转义字符</p></li><li><p><strong>获取字串长度</strong><br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">string=<span class="hljs-string">&quot;abcd&quot;</span><br><span class="hljs-built_in">echo</span> <span class="hljs-variable">$&#123;#string&#125;</span><span class="hljs-comment"># 4</span><br></code></pre></td></tr></table></figure></p></li><li><p><strong>提取字符串</strong> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">string=<span class="hljs-string">&quot;anyue967 is a good website&quot;</span><br><span class="hljs-built_in">echo</span> <span class="hljs-variable">$&#123;string:1:4&#125;</span><span class="hljs-comment"># nyue</span><br></code></pre></td></tr></table></figure></p></li><li><p><strong><code># ##</code>表示去掉左边,<code>#</code>表示从左边删除到第一个指定的字符;<code>##</code>表示从左边删除到最后一个指定的字符</strong><br /></p></li><li><p><strong><code>% %%</code>表示去掉右边,<code>%</code>表示从右边删除到第一个指定的字符;<code>%%</code>表示从右边删除到最后一个指定的字符</strong><br /><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment">#!bin/bash</span><br>var=<span class="hljs-string">&quot;http://www.runoob.com/linux/linux-shell-variable.html&quot;</span><br><br>s1=<span class="hljs-variable">$&#123;var%%t*&#125;</span>     <span class="hljs-comment"># h</span><br>s2=<span class="hljs-variable">$&#123;var%t*&#125;</span>      <span class="hljs-comment"># http://www.runoob.com/linux/linux-shell-variable.h</span><br>s3=<span class="hljs-variable">$&#123;var%%.*&#125;</span>     <span class="hljs-comment"># http://www</span><br>s4=<span class="hljs-variable">$&#123;var#*/&#125;</span>      <span class="hljs-comment"># /www.runoob.com/linux/linux-shell-variable.html</span><br>s5=<span class="hljs-variable">$&#123;var##*/&#125;</span>     <span class="hljs-comment"># 空</span><br></code></pre></td></tr></table></figure></p></li></ul><h2 id="数组">数组</h2><h3id="bash支持一维数组不支持多维数组并且没有限定数组的大小">bash支持一维数组(不支持多维数组),并且没有限定数组的大小</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs bash">定义: arrName=(value1 value2 ... n)<br><br>array_name=(<br>  value0<br>  value1<br>  value2<br>)<br>array_name[0]=value0  <span class="hljs-comment"># 引用数组  </span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;数组元素: <span class="hljs-variable">$&#123;array_name[@]&#125;</span>&quot;</span>  <br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;数组元素: <span class="hljs-variable">$&#123;array_name[*]&#125;</span>&quot;</span>  <br><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;数组元素个数为: <span class="hljs-variable">$&#123;#array_name[*]&#125;</span>&quot;</span><br></code></pre></td></tr></table></figure><h2 id="注释">注释</h2><p><code>#</code>开头单行注释 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">:&lt;&lt;<span class="hljs-string">EOF</span><br><span class="hljs-string">comment...</span><br><span class="hljs-string">comment...</span><br><span class="hljs-string">EOF</span><br></code></pre></td></tr></table></figure></p><h2 id="read命令-用于获取键盘输入信息">read命令,用于获取键盘输入信息</h2><p><code>read [-option] [variable ...]</code></p><table><thead><tr><th style="text-align: left;">选项</th><th style="text-align: left;">说明</th></tr></thead><tbody><tr><td style="text-align: left;">-p</td><td style="text-align: left;">“提示信息”</td></tr><tr><td style="text-align: left;">-t</td><td style="text-align: left;">时间</td></tr><tr><td style="text-align: left;">-s</td><td style="text-align: left;">隐藏输入</td></tr><tr><td style="text-align: left;">-n</td><td style="text-align: left;">只接收一个输入字符就会执行</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">read</span> -p <span class="hljs-string">&quot;input a val:&quot;</span> a<br><span class="hljs-built_in">read</span> -p <span class="hljs-string">&quot;input a val:&quot;</span> b<br><br>c=$((<span class="hljs-variable">$a</span>+<span class="hljs-variable">$b</span>))          <span class="hljs-comment"># $((exp))</span><br>c=$[<span class="hljs-variable">$a</span>+<span class="hljs-variable">$b</span>]            <span class="hljs-comment"># $[exp]</span><br><span class="hljs-built_in">let</span> c=<span class="hljs-variable">$a</span>+<span class="hljs-variable">$b</span>           <span class="hljs-comment"># let exp</span><br>c=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$a</span> + <span class="hljs-variable">$b</span>        <span class="hljs-comment"># expr 算数表达式  </span><br><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;result=<span class="hljs-variable">$&#123;r&#125;</span>&quot;</span><br></code></pre></td></tr></table></figure><h2 id="传递参数">传递参数</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Shell 传递参数实例！&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;执行的文件名：<span class="hljs-variable">$0</span>&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第一个参数为：<span class="hljs-variable">$1</span>&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第二个参数为：<span class="hljs-variable">$2</span>&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第三个参数为：<span class="hljs-variable">$3</span>&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;参数个数：<span class="hljs-variable">$#</span>&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;进程号：$$&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;后台运行的最后一个进程号：$!&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;传递参数作为字串显示：$*&quot;</span>;<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;命令推出状态：$?&quot;</span>;<br></code></pre></td></tr></table></figure><h2 id="shell基本运算符">Shell基本运算符</h2><h3 id="let-命令用于指定算术运算-即let-expretion">let命令用于指定算术运算, 即let expretion</h3><ul><li>let var=$[exp] 算数表达式 $((exp))</li><li><code>echo $[$RANDOM%50]</code>: 0-49之间随机数<ul><li><code>COLOR=$[$RANDOM%7+31]; echo -e "\e[1;$&#123;COLOR&#125;mcolor\e[0m"</code></li></ul></li></ul><h3 id="declare">declare</h3><ul><li>declare -i I=1 # 整型变量声明</li></ul><h3 id="算数运算-用">算数运算, 用<code>(())</code></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>a=10<br>b=20<br><br>val=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$a</span> + <span class="hljs-variable">$b</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;a + b : <span class="hljs-variable">$val</span>&quot;</span><br><br>val=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$a</span> - <span class="hljs-variable">$b</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;a - b : <span class="hljs-variable">$val</span>&quot;</span><br><br>val=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$a</span> \* <span class="hljs-variable">$b</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;a * b : <span class="hljs-variable">$val</span>&quot;</span><br><br>val=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$b</span> / <span class="hljs-variable">$a</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;b / a : <span class="hljs-variable">$val</span>&quot;</span><br><br>val=<span class="hljs-built_in">expr</span> <span class="hljs-variable">$b</span> % <span class="hljs-variable">$a</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;b % a : <span class="hljs-variable">$val</span>&quot;</span><br><br><span class="hljs-keyword">if</span> [<span class="hljs-variable">$a</span> == <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;a 等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;a 不等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h3 id="关系运算-eq--ne--gt--lt--le">关系运算(-eq -ne -gt -lt -le)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>a=10<br>b=20<br><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -eq <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -eq <span class="hljs-variable">$b</span> : a 等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -eq <span class="hljs-variable">$b</span>: a 不等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -ne <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -ne <span class="hljs-variable">$b</span>: a 不等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -ne <span class="hljs-variable">$b</span> : a 等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -gt <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -gt <span class="hljs-variable">$b</span>: a 大于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -gt <span class="hljs-variable">$b</span>: a 不大于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -lt <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -lt <span class="hljs-variable">$b</span>: a 小于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -lt <span class="hljs-variable">$b</span>: a 不小于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -ge <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -ge <span class="hljs-variable">$b</span>: a 大于或等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -ge <span class="hljs-variable">$b</span>: a 小于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -le <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -le <span class="hljs-variable">$b</span>: a 小于或等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> -le <span class="hljs-variable">$b</span>: a 大于 b&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h3 id="布尔运算--a--o">布尔运算(!= -a -o)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>a=10<br>b=20<br><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span> : a 不等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> == <span class="hljs-variable">$b</span>: a 等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -lt 100 -a <span class="hljs-variable">$b</span> -gt 15 ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 100 且 <span class="hljs-variable">$b</span> 大于 15 : 返回 true&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 100 且 <span class="hljs-variable">$b</span> 大于 15 : 返回 false&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -lt 100 -o <span class="hljs-variable">$b</span> -gt 100 ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 100 或 <span class="hljs-variable">$b</span> 大于 100 : 返回 true&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 100 或 <span class="hljs-variable">$b</span> 大于 100 : 返回 false&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> -lt 5 -o <span class="hljs-variable">$b</span> -gt 100 ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 5 或 <span class="hljs-variable">$b</span> 大于 100 : 返回 true&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> 小于 5 或 <span class="hljs-variable">$b</span> 大于 100 : 返回 false&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h3 id="逻辑运算">逻辑运算(&amp;&amp; || )</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>a=10<br>b=20<br><br><span class="hljs-keyword">if</span> [[ <span class="hljs-variable">$a</span> -lt 100 &amp;&amp; <span class="hljs-variable">$b</span> -gt 100 ]]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;返回 true&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;返回 false&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [[ <span class="hljs-variable">$a</span> -lt 100 || <span class="hljs-variable">$b</span> -gt 100 ]]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;返回 true&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;返回 false&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h3 id="文件测试-r--w--x--f--d--s--e">文件测试(-r -w -x -f -d -s-e)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>file=<span class="hljs-string">&quot;/var/www/runoob/test.sh&quot;</span><br><br><span class="hljs-keyword">if</span> [ -r <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件可读&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不可读&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -w <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件可写&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不可写&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -x <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件可执行&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不可执行&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件为普通文件&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件为特殊文件&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -d <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件是个目录&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不是个目录&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -s <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不为空&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件为空&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -e <span class="hljs-variable">$file</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件存在&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;文件不存在&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h3 id="字符串运算--z--n">字符串运算(= != -z -n)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>a=<span class="hljs-string">&quot;abc&quot;</span><br>b=<span class="hljs-string">&quot;efg&quot;</span><br><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> = <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> = <span class="hljs-variable">$b</span> : a 等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> = <span class="hljs-variable">$b</span>: a 不等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span> : a 不等于 b&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> != <span class="hljs-variable">$b</span>: a 等于 b&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -z <span class="hljs-variable">$a</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;-z <span class="hljs-variable">$a</span> : 字符串长度为 0&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;-z <span class="hljs-variable">$a</span> : 字符串长度不为 0&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ -n <span class="hljs-string">&quot;<span class="hljs-variable">$a</span>&quot;</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;-n <span class="hljs-variable">$a</span> : 字符串长度不为 0&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;-n <span class="hljs-variable">$a</span> : 字符串长度为 0&quot;</span><br><span class="hljs-keyword">fi</span><br><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$a</span> ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> : 字符串不为空&quot;</span><br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$a</span> : 字符串为空&quot;</span><br><span class="hljs-keyword">fi</span><br></code></pre></td></tr></table></figure><h2 id="shell-printf">Shell printf</h2><h3id="print-format-str-arguments..."><code>print format-str [arguments...]</code></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;%-10s %-8s %-4s\n&quot;</span> 姓名 性别 体重kg  <br><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;%-10s %-8s %-4.2f\n&quot;</span> 郭靖 男 66.1234 <br><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;%-10s %-8s %-4.2f\n&quot;</span> 杨过 男 48.6543 <br><span class="hljs-built_in">printf</span> <span class="hljs-string">&quot;%-10s %-8s %-4.2f\n&quot;</span> 郭芙 女 47.9876 <br><br>姓名     性别   体重kg<br>郭靖     男      66.12<br>杨过     男      48.65<br>郭芙     女      47.99<br></code></pre></td></tr></table></figure><h2 id="流程控制">流程控制</h2><h3 id="if-elif-else-fi">if-elif-else-fi</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>ratio = $(<span class="hljs-built_in">df</span> -h |grep /dev/sda3 |awk <span class="hljs-string">&#x27;&#123;print $5&#125;&#x27;</span> |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&quot;%&quot;</span> -f1)<br><span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$ratio</span>&quot;</span> -ge 80 ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;钉钉报警!&quot;</span> <br><span class="hljs-keyword">fi</span><br>----------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br>ntpdate asia.pool.ntp.org &amp;&gt;/dev/null<br><span class="hljs-built_in">date</span> = $(<span class="hljs-built_in">date</span> +%Y%m%d)<br>size = $(<span class="hljs-built_in">du</span> -sh /var/lib/mysql)<br><span class="hljs-keyword">if</span> [ -d /tmp/dbbak ]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Date: <span class="hljs-variable">$date</span>!&quot;</span> &gt;/tmp/dbbak/dbinfo.txt<br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Date: <span class="hljs-variable">$size</span>!&quot;</span> &gt;&gt;/tmp/dbbak/dbinfo.txt<br>  <span class="hljs-built_in">cd</span> /tmp/dbbak<br>  tar -czf mysql-lib-<span class="hljs-variable">$date</span>.tar.gz /var/lib/mysql dbinfo.txt &amp;&gt;/dev/null<br>  <span class="hljs-built_in">rm</span> -rf /tmp/dbbak/dbinfo.txt<br><span class="hljs-keyword">else</span><br>  <span class="hljs-built_in">mkdir</span> /tmp/dbbak<br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Date: <span class="hljs-variable">$date</span>!&quot;</span> &gt;/tmp/dbbak/dbinfo.txt<br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Date: <span class="hljs-variable">$size</span>!&quot;</span> &gt;&gt;/tmp/dbbak/dbinfo.txt<br><span class="hljs-keyword">fi</span><br>-----------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br>port = `nmap -sT 192.168.137.129 |grep tcp |grep http |awk <span class="hljs-string">&#x27;&#123;print $2&#125;&#x27;</span>`<br><span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$port</span>&quot;</span> == <span class="hljs-string">&quot;open&quot;</span>]; <span class="hljs-keyword">then</span><br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-subst">$(date)</span> httpd is ok!&quot;</span> &gt;&gt;/tmp/autostart-acc.log<br>  <span class="hljs-keyword">else</span><br>    /etc/init.d/httpd start &amp;&gt;/dev/null<br>    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-subst">$(date)</span> restart ok!&quot;</span> &gt;&gt;/tmp/autostart-acc.log<br><span class="hljs-keyword">fi</span><br>-----------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br><span class="hljs-built_in">read</span> -t 30 -p <span class="hljs-string">&quot;Input num1:&quot;</span> num1<br><span class="hljs-built_in">read</span> -t 30 -p <span class="hljs-string">&quot;Input num2:&quot;</span> num2<br><span class="hljs-keyword">if</span> [ -n <span class="hljs-string">&quot;<span class="hljs-variable">$num1</span>&quot;</span> -a -n <span class="hljs-string">&quot;<span class="hljs-variable">$num2</span>&quot;</span> -a -n <span class="hljs-string">&quot;<span class="hljs-variable">$opt</span>&quot;</span> ]; <span class="hljs-keyword">then</span> <br>  test1 = $(<span class="hljs-built_in">echo</span> num1 |sed <span class="hljs-string">&#x27;s/[0-9]//g&#x27;</span>)<br>  test2 = $(<span class="hljs-built_in">echo</span> num2 |sed <span class="hljs-string">&#x27;s/[0-9]//g&#x27;</span>)<br>  <span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$test1</span>&quot;</span> -a -z <span class="hljs-string">&quot;<span class="hljs-variable">$test2</span>&quot;</span> ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$opt</span>&quot;</span> == <span class="hljs-string">&#x27;+&#x27;</span> ]; <span class="hljs-keyword">then</span><br>      value = $(( <span class="hljs-variable">$num1</span> + <span class="hljs-variable">$num2</span> ))<br>    <span class="hljs-keyword">elif</span> [ <span class="hljs-string">&quot;opt&quot;</span> == <span class="hljs-string">&#x27;-&#x27;</span> ]; <span class="hljs-keyword">then</span> <br>      value = $(( <span class="hljs-variable">$num1</span> - <span class="hljs-variable">$num2</span> ))<br>    <span class="hljs-keyword">elif</span> [ <span class="hljs-string">&quot;opt&quot;</span> == <span class="hljs-string">&#x27;*&#x27;</span> ]; <span class="hljs-keyword">then</span> <br>      value = $(( <span class="hljs-variable">$num1</span> * <span class="hljs-variable">$num2</span> ))<br>    <span class="hljs-keyword">elif</span> [ <span class="hljs-string">&quot;opt&quot;</span> == <span class="hljs-string">&#x27;/&#x27;</span> ]; <span class="hljs-keyword">then</span><br>      value = $(( <span class="hljs-variable">$num1</span> / <span class="hljs-variable">$num2</span> ))<br>    <span class="hljs-keyword">else</span><br>      <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Please enter a valid symbol&quot;</span><br>      <span class="hljs-built_in">exit</span> 10<br>  <span class="hljs-keyword">fi</span><br><span class="hljs-keyword">else</span> <br>  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Please input content&quot;</span><br>  <span class="hljs-built_in">exit</span> 12<br><span class="hljs-keyword">fi</span> <br></code></pre></td></tr></table></figure><h3 id="for-do-done">for-do-done</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">cd</span> /root/tar<br><span class="hljs-built_in">ls</span> *.tar.gz &gt;tar.log<br><span class="hljs-built_in">ls</span> *.tgz &gt;&gt;tar.log &amp;&gt;/dev/null<br>line = $(<span class="hljs-built_in">cat</span> tar.log |<span class="hljs-built_in">wc</span> -l)<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$line</span><br><span class="hljs-keyword">do</span> <br>  tar -xzvf <span class="hljs-variable">$i</span> -C /root/tar<br><span class="hljs-keyword">done</span><br><span class="hljs-built_in">rm</span> -rf tar.log<br><br><span class="hljs-keyword">for</span> (( i=<span class="hljs-number">1</span>; i&lt;&quot;<span class="hljs-variable">$line</span>&quot;; i++))<br><span class="hljs-keyword">do</span><br>  num = $(<span class="hljs-built_in">cat</span> tar.log |awk <span class="hljs-string">&#x27;NR==&#x27;</span><span class="hljs-variable">$i</span><span class="hljs-string">&#x27; &#123;print $1&#125;&#x27;</span>)<br>  tar -xzvf <span class="hljs-variable">$num</span> -C /root/tar<br><span class="hljs-keyword">done</span><br><span class="hljs-built_in">rm</span> -rf tar.log<br>---------------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br>grep <span class="hljs-string">&quot;&lt;\([0-9]\&#123;1,3\&#125;\.\)\&#123;3\&#125;[0-9]\&#123;1,3\&#125;\&gt;&quot;</span> /root/ip.txt &gt;/root/iptest_1.txt<br>grep <span class="hljs-string">&quot;^[0-9]\&#123;1,3\&#125;\.[0-9]\&#123;1,3\&#125;\.[0-9]\&#123;1,3\&#125;\.[0-9]\&#123;1,3\&#125;$&quot;</span> /root/ip.txt &gt;/root/iptest_1.txt<br>line = $(<span class="hljs-built_in">wc</span> -l /root/iptest_1.txt awk <span class="hljs-string">&#x27;&#123;print $1&#125;&#x27;</span>)<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;&quot;</span> &gt;/root/iptest.txt<br><span class="hljs-keyword">for</span> (( i=<span class="hljs-number">1</span>; i&lt;=<span class="hljs-variable">$line</span>; i++))<br><span class="hljs-keyword">do</span><br>  <span class="hljs-built_in">cat</span> /root/iptest_1.txt |awk <span class="hljs-string">&#x27;NR==&#x27;</span><span class="hljs-variable">$i</span><span class="hljs-string">&#x27; &#123;print&#125;&#x27;</span> &gt;/root/iptest_2.txt<br>  a = $(<span class="hljs-built_in">cat</span> /root/iptest_2.txt |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&#x27;.&#x27;</span> -f1)<br>  b = $(<span class="hljs-built_in">cat</span> /root/iptest_2.txt |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&#x27;.&#x27;</span> -f2)<br>  c = $(<span class="hljs-built_in">cat</span> /root/iptest_2.txt |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&#x27;.&#x27;</span> -f3)<br>  d = $(<span class="hljs-built_in">cat</span> /root/iptest_2.txt |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&#x27;.&#x27;</span> -f4)<br>  <span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$a</span>&quot;</span> -lt 1 -o <span class="hljs-string">&quot;<span class="hljs-variable">$a</span>&quot;</span> -gt 255 ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-built_in">continue</span><br>  <span class="hljs-keyword">fi</span><br>  <span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$b</span>&quot;</span> -lt 0 -o <span class="hljs-string">&quot;<span class="hljs-variable">$b</span>&quot;</span> -gt 255 ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-built_in">continue</span><br>  <span class="hljs-keyword">fi</span><br>  <span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$c</span>&quot;</span> -lt 0 -o <span class="hljs-string">&quot;<span class="hljs-variable">$c</span>&quot;</span> -gt 255 ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-built_in">continue</span><br>  <span class="hljs-keyword">fi</span><br>  <span class="hljs-keyword">if</span> [ <span class="hljs-string">&quot;<span class="hljs-variable">$d</span>&quot;</span> -lt 0 -o <span class="hljs-string">&quot;<span class="hljs-variable">$d</span>&quot;</span> -gt 255 ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-built_in">continue</span><br>  <span class="hljs-keyword">fi</span><br>  <span class="hljs-built_in">cat</span> /root/iptest_2.txt &gt;&gt;/root/iptest.txt<br><span class="hljs-keyword">done</span><br><span class="hljs-built_in">rm</span> -rf /root/iptest_1.txt<br>---------------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br><span class="hljs-built_in">read</span> -t 30 -p <span class="hljs-string">&quot;Please input users name:&quot;</span> NAME<br><span class="hljs-built_in">read</span> -t 30 -p <span class="hljs-string">&quot;Please input the number of users:&quot;</span> NUM<br><span class="hljs-built_in">read</span> -t 30 -p <span class="hljs-string">&quot;Please input the password of users name:&quot;</span> PASS<br><span class="hljs-keyword">if</span> [ ! -z <span class="hljs-string">&quot;<span class="hljs-variable">$NAME</span>&quot;</span> -a ! -z <span class="hljs-string">&quot;<span class="hljs-variable">$NUM</span>&quot;</span> -a ! -z <span class="hljs-string">&quot;<span class="hljs-variable">$PASS</span>&quot;</span>]; <span class="hljs-keyword">then</span><br>  TMP = $(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$NUM</span> |sed <span class="hljs-string">&#x27;s/[0-9]//g&#x27;</span>)<br>  <span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$TMP</span>&quot;</span> ]; <span class="hljs-keyword">then</span><br>    <span class="hljs-keyword">for</span>(( i=<span class="hljs-number">1</span>; i&lt;<span class="hljs-variable">$NUM</span>; i=i+<span class="hljs-number">1</span>))<br>    <span class="hljs-keyword">do</span><br>      /usr/sbin/useradd $NAME<span class="hljs-variable">$i</span> &amp;&gt;/dev/null<br>      <span class="hljs-built_in">echo</span> <span class="hljs-variable">$PASS</span> |/usr/bin/passwd --stdin $NAME<span class="hljs-variable">$i</span> &amp;&gt;/dev/null<br>      chage -d 0 $NAME<span class="hljs-variable">$i</span> &amp;&gt;/dev/null<br>    <span class="hljs-keyword">done</span> <br>  <span class="hljs-keyword">fi</span><br><span class="hljs-keyword">fi</span><br>---------------------------------------------------------<br><span class="hljs-comment">#！/bin/bash</span><br>user = $(<span class="hljs-built_in">cat</span> /etc/passwd |grep <span class="hljs-string">&quot;/bin/bash&quot;</span> |grep -v <span class="hljs-string">&quot;root&quot;</span> |<span class="hljs-built_in">cut</span> -d <span class="hljs-string">&quot;:&quot;</span> -f1)<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$user</span><br><span class="hljs-keyword">do</span> <br>  userdel -r <span class="hljs-variable">$i</span><br><span class="hljs-keyword">done</span><br></code></pre></td></tr></table></figure><h3 id="while-do-done">while-do-done</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br>i = 1<br>s = 0<br><span class="hljs-keyword">while</span> [ <span class="hljs-variable">$i</span> -le 100 ]<br><span class="hljs-keyword">do</span><br>  s = $(( <span class="hljs-variable">$s</span> + <span class="hljs-variable">$i</span> ))<br>  i = $(( <span class="hljs-variable">$i</span> + <span class="hljs-variable">$1</span> ))<br><span class="hljs-keyword">done</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;The sum is: <span class="hljs-variable">$s</span>&quot;</span><br><br><span class="hljs-keyword">while</span>    <span class="hljs-keyword">while</span> <span class="hljs-literal">true</span><span class="hljs-keyword">for</span>(( ; ; ))<br><span class="hljs-keyword">do</span>         <span class="hljs-keyword">do</span><br><span class="hljs-keyword">done</span>       <span class="hljs-keyword">done</span> <br></code></pre></td></tr></table></figure><h3 id="case-in-esac">case-in-esac</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;输入 1 到 4 之间的数字:&#x27;</span><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你输入的数字为:&#x27;</span><br><span class="hljs-built_in">read</span> aNum<br><span class="hljs-keyword">case</span> <span class="hljs-variable">$aNum</span> <span class="hljs-keyword">in</span><br>  1)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你选择了 1&#x27;</span><br>  ;;<br>  1)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你选择了 2&#x27;</span><br>  ;;<br>  1)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你选择了 3&#x27;</span><br>  ;;<br>  1)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你选择了 4&#x27;</span><br>  ;;<br>  *)  <span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;你没有输入 1 到 4 之间的数字&#x27;</span><br>  ;;<br><span class="hljs-keyword">esac</span><br></code></pre></td></tr></table></figure><h3 id="关于-break-与-continue">关于 <code>break</code> 与<code>continue</code></h3><ul><li><strong>break命令允许跳出所有循环（终止执行后面的所有循环）</strong></li><li><strong>continue命令与break命令类似，只有一点差别，它不会跳出所有循环，仅仅跳出当前循环</strong><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><span class="hljs-keyword">while</span> :<br><span class="hljs-keyword">do</span><br>   <span class="hljs-built_in">echo</span> -n <span class="hljs-string">&quot;输入 1 到 5 之间的数字:&quot;</span><br>   <span class="hljs-built_in">read</span> aNum<br><span class="hljs-keyword">case</span> <span class="hljs-variable">$aNum</span> <span class="hljs-keyword">in</span><br>   1|2|3|4|5) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;你输入的数字为 <span class="hljs-variable">$aNum</span>!&quot;</span><br>   ;;<br>   *) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;你输入的数字不是 1 到 5 之间的! 游戏结束&quot;</span><br>      <span class="hljs-built_in">break</span><br>   ;;<br><span class="hljs-keyword">esac</span><br><span class="hljs-keyword">done</span><br><br>输入 1 到 5 之间的数字:3<br>你输入的数字为 3!<br>输入 1 到 5 之间的数字:7<br>你输入的数字不是 1 到 5 之间的! 游戏结束<br>------------------------------------------------<br><span class="hljs-comment">#!/bin/bash</span><br><span class="hljs-keyword">while</span> :<br><span class="hljs-keyword">do</span><br>   <span class="hljs-built_in">echo</span> -n <span class="hljs-string">&quot;输入 1 到 5 之间的数字: &quot;</span><br>   <span class="hljs-built_in">read</span> aNum<br>   <span class="hljs-keyword">case</span> <span class="hljs-variable">$aNum</span> <span class="hljs-keyword">in</span><br>      1|2|3|4|5) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;你输入的数字为 <span class="hljs-variable">$aNum</span>!&quot;</span><br>      ;;<br>      *) <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;你输入的数字不是 1 到 5 之间的!&quot;</span><br>            <span class="hljs-built_in">continue</span><br>            <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;游戏结束&quot;</span><br>      ;;<br>   <span class="hljs-keyword">esac</span><br><span class="hljs-keyword">done</span><br></code></pre></td></tr></table></figure></li></ul><h2 id="shell-function">Shell function</h2><h3 id="定义函数">定义函数</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-function"><span class="hljs-title">funWithReturn</span></span>()&#123;<br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;这个函数会对输入的两个数字进行相加运算...&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;输入第一个数字: &quot;</span><br>   <span class="hljs-built_in">read</span> aNum<br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;输入第二个数字: &quot;</span><br>   <span class="hljs-built_in">read</span> anotherNum<br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;两个数字分别为 <span class="hljs-variable">$aNum</span> 和 <span class="hljs-variable">$anotherNum</span> !&quot;</span><br>   <span class="hljs-built_in">return</span> $((<span class="hljs-variable">$aNum</span>+<span class="hljs-variable">$anotherNum</span>))<br>&#125;<br>funWithReturn<br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;输入的两个数字之和为 $? !&quot;</span><br><br><br><span class="hljs-function"><span class="hljs-title">funWithParam</span></span>()&#123;<br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第一个参数为 <span class="hljs-variable">$1</span> !&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第二个参数为 <span class="hljs-variable">$2</span> !&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第十个参数为 <span class="hljs-variable">$10</span> !&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第十个参数为 <span class="hljs-variable">$&#123;10&#125;</span> !&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;第十一个参数为 <span class="hljs-variable">$&#123;11&#125;</span> !&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;参数总数有 <span class="hljs-variable">$#</span> 个!&quot;</span><br>   <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;作为一个字符串输出所有参数 $* !&quot;</span><br>&#125;<br>funWithParam 1 2 3 4 5 6 7 8 9 34 73<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://anyu967.github.io/posts/4592b2fd.html</id>
    <link href="https://anyu967.github.io/posts/4592b2fd.html"/>
    <published>2019-08-12T14:37:07.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-12-Shell]]>
    </summary>
    <title>shell</title>
    <updated>2026-02-22T05:33:39.805Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="CSS" scheme="https://anyu967.github.io/categories/CSS/"/>
    <category term="CSS" scheme="https://anyu967.github.io/tags/CSS/"/>
    <content>
      <![CDATA[<p>2019-08-08-CSS <span id="more"></span></p><h1 id="css">CSS</h1><h2 id="概念">概念:</h2><p><strong>CSS 指层叠样式表 (Cascading Style Sheets),样式定义以何种方式显示 HTML 元素, 外部样式表通常存储在 CSS文件中</strong><br /><img src="/posts/ee69e452/CSS%E8%AF%AD%E6%B3%95.jpg" class="" title="[CSS语法]"></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">h1</span> &#123;<span class="hljs-attribute">color</span>:blue; <span class="hljs-attribute">font-size</span>:<span class="hljs-number">12px</span>;&#125;<br>选择器 属性:属性值 <br>注释:<br><span class="hljs-comment">/* ... */</span><br></code></pre></td></tr></table></figure><h2 id="选择器">选择器:</h2><ul><li><p>id 选择器(#) <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-id">#para</span>&#123;<br> <span class="hljs-attribute">text-align</span>: center;<br> <span class="hljs-attribute">color</span>: red;<br>&#125;<br></code></pre></td></tr></table></figure></p></li><li><p>class 选择器(.) <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-class">.center</span>&#123; <span class="hljs-attribute">text-align</span>: center;&#125;<br></code></pre></td></tr></table></figure></p></li><li><p>子选择器(SS) <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs css"> &lt;style&gt;<br><span class="hljs-selector-tag">div</span> &gt; <span class="hljs-selector-tag">p</span>&#123;   <span class="hljs-comment">/*只能选择作为某元素子元素的元素*/</span><br><span class="hljs-attribute">color</span>:red;<br> &#125;<br> &lt;/style&gt;<br> &lt;<span class="hljs-selector-tag">div</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;  &lt;!--文字是红色的--&gt;<br> &lt;<span class="hljs-selector-tag">table</span>&gt;<br> <span class="hljs-comment">/*文字是非红色的*/</span><br>&lt;<span class="hljs-selector-tag">tr</span>&gt;&lt;<span class="hljs-selector-tag">td</span>&gt;&lt;<span class="hljs-selector-tag">p</span>&gt;no red <span class="hljs-selector-tag">text</span>;&lt;/<span class="hljs-selector-tag">td</span>&gt;&lt;/<span class="hljs-selector-tag">p</span>&gt;&lt;/<span class="hljs-selector-tag">tr</span>&gt;<br> &lt;/<span class="hljs-selector-tag">table</span>&gt;<br> &lt;/<span class="hljs-selector-tag">div</span>&gt;<br></code></pre></td></tr></table></figure></p></li><li><p>相邻兄弟选择器 <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;style&gt;<br><span class="hljs-selector-tag">div</span> + <span class="hljs-selector-tag">p</span>&#123;<br>  <span class="hljs-attribute">color</span>: red;<br>&#125;<br>&lt;/style&gt;<br>&lt;<span class="hljs-selector-tag">div</span>&gt;<br>  &lt;<span class="hljs-selector-tag">p</span>&gt;not red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;<br>  &lt;<span class="hljs-selector-tag">p</span>&gt;not red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;<br>&lt;/<span class="hljs-selector-tag">div</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;    <br>&lt;<span class="hljs-selector-tag">p</span>&gt;not red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;<br></code></pre></td></tr></table></figure></p></li><li><p>后续兄弟选择器(BS) <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs css"> &lt;style&gt;<br><span class="hljs-selector-tag">div</span> ~ <span class="hljs-selector-tag">p</span>&#123;    <span class="hljs-comment">/*选取所有指定元素之后的相邻兄弟元素*/</span><br><span class="hljs-attribute">color</span>:red;<br> &#125;<br> &lt;/style&gt;<br> &lt;<span class="hljs-selector-tag">div</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;no red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;  <span class="hljs-comment">/*文字是非红色的*/</span><br>&lt;<span class="hljs-selector-tag">div</span>&gt;no red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">div</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;red <span class="hljs-selector-tag">text</span>&lt;/<span class="hljs-selector-tag">p</span>&gt;  <span class="hljs-comment">/*文字是红色的*/</span><br> &lt;/<span class="hljs-selector-tag">div</span>&gt;<br></code></pre></td></tr></table></figure></p></li></ul><h2 id="伪类">伪类:</h2><ul><li>语法:<br /><code>选择器.CSS类:伪类&#123;属性:属性值&#125;</code> /<code>选择器:伪类&#123;属性:属性值&#125;</code> <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;style&gt;<br>  <span class="hljs-selector-tag">p</span><span class="hljs-selector-pseudo">:after</span>&#123; <span class="hljs-comment">/* p::before &amp;&amp; p::after */</span><br>    <span class="hljs-attribute">content</span>:<span class="hljs-string">&quot;- 注意我&quot;</span>;<br>  &#125;<br>&lt;/style&gt;<br>&lt;<span class="hljs-selector-tag">body</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;我的名字是 Donald&lt;/<span class="hljs-selector-tag">p</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;我住在 Ducksburg&lt;/<span class="hljs-selector-tag">p</span>&gt;<br>&lt;<span class="hljs-selector-tag">p</span>&gt;&lt;<span class="hljs-selector-tag">b</span>&gt;注意：&lt;/<span class="hljs-selector-tag">b</span>&gt; <span class="hljs-selector-pseudo">:after</span>在IE8中运行，必须声明 !DOCTYPE &lt;/<span class="hljs-selector-tag">p</span>&gt;<br></code></pre></td></tr></table></figure></li></ul><img src="/posts/ee69e452/jieGouWeilei.jpg" class="" title="[结构伪类]"><h2 id="多重样式优先级">多重样式优先级</h2><p><strong><ahref="www.runoob.com/w3cnote/css-style-priority.html">参考文章</a></strong><br /><strong>插入样式表的方法有三种:</strong><br />+ <code>外部样式表</code>(External style sheet) +<code>内部样式表</code>(Internal style sheet) +<code>内联样式</code>(Inline style)<br />+ <strong>行内样式(1000)&gt; id选择器(100)&gt; 类选择器(10)&gt;标签选择器(1)</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;head&gt;<span class="hljs-comment">/*外部*/</span><br>&lt;link rel=&quot;stylesheet&quot; type=&quot;<span class="hljs-selector-tag">text</span>/css&quot; href=&quot;mystyle<span class="hljs-selector-class">.css</span>&quot;&gt;<br>&lt;/head&gt;<br><br>&lt;head&gt;<span class="hljs-comment">/*内部*/</span><br>&lt;style&gt;<br>  hr &#123;<span class="hljs-attribute">color</span>:sienna;&#125;<br>  <span class="hljs-selector-tag">p</span> &#123;<span class="hljs-attribute">margin-left</span>:<span class="hljs-number">20px</span>;&#125;<br>  <span class="hljs-selector-tag">body</span> &#123;<span class="hljs-attribute">background-image</span>:<span class="hljs-built_in">url</span>(<span class="hljs-string">&quot;images/back40.gif&quot;</span>);&#125;<br>&lt;/style&gt;<br>&lt;/head&gt;<br><br>&lt;<span class="hljs-selector-tag">p</span> style=&quot;<span class="hljs-attribute">color</span>:sienna;<span class="hljs-attribute">margin-left</span>:<span class="hljs-number">20px</span><span class="hljs-string">&quot;&gt;这是一个段落。&lt;/p&gt;/*内联*/</span><br></code></pre></td></tr></table></figure><h2 id="background背景-要设置宽高">background(背景,<strong>要设置宽高</strong>)</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">body</span>&#123;<br>  <span class="hljs-attribute">background</span>: all;<br>  backdround-<span class="hljs-attribute">color</span>: <span class="hljs-number">#FFFFFF</span>;<span class="hljs-comment">/*rgb(255,255,255)*/</span><br>  <span class="hljs-attribute">background</span>-imgage: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;url&#x27;</span>);<br>  <span class="hljs-attribute">background-repeat</span>: repeat-x / repeat-y / no-repeat;<br>  <br>  // 水平位置(<span class="hljs-attribute">left</span> center <span class="hljs-attribute">right</span>) 垂直位置(<span class="hljs-attribute">top</span> center <span class="hljs-attribute">bottom</span>)<br>  <span class="hljs-attribute">background-position</span>: 固定值 / 百分比 / 单词; <br>  <span class="hljs-attribute">background-attachment</span>: scroll / fixed / inherit;<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="text文本">Text(文本)</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">body</span>&#123;<br>  <span class="hljs-attribute">color</span>: red;<br>  <span class="hljs-attribute">text-align</span>: center / right / justify;<br>  <span class="hljs-attribute">text-decoration</span>: none;<br>  <span class="hljs-attribute">text-transform</span>: uppercase / lowercase / capitalize;<br>  <span class="hljs-attribute">text-indent</span>: <span class="hljs-number">10px</span>; <span class="hljs-comment">/*指定文本的第一行的缩进*/</span><br>  <span class="hljs-attribute">text-shadow</span>: <span class="hljs-number">2px</span> <span class="hljs-number">2px</span> <span class="hljs-number">#ff0000</span>; <span class="hljs-comment">/*CSS3: 水平阴影的位置 垂直阴影的位置 模糊的距离(blur) 阴影的颜色(color)*/</span><br>  <span class="hljs-attribute">vertical-align</span>: text-top; <span class="hljs-comment">/*设置元素的垂直对齐*/</span><br>  <span class="hljs-attribute">word-spacing</span>: <span class="hljs-number">30px</span>;<span class="hljs-comment">/*设置英文单词之间的间距*/</span><br>  <span class="hljs-attribute">letter-spacing</span>:<span class="hljs-number">30px</span>;<span class="hljs-comment">/*设置字母与字母之间的间距*/</span><br>&#125;<br></code></pre></td></tr></table></figure><h2 id="font字体">Font(字体)</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">body</span>&#123;<br>  <span class="hljs-attribute">font</span>: all;<br>  <span class="hljs-attribute">font-style</span>: normal / italic / oblique;<br>  <span class="hljs-attribute">font-size</span>: <span class="hljs-number">14px</span> / <span class="hljs-number">14px</span>/<span class="hljs-number">16</span>=<span class="hljs-number">0.875em</span>;<br>  <span class="hljs-attribute">font-family</span>:<span class="hljs-string">&quot;Times New Roman&quot;</span>,Georgia,Serif;<br>  <span class="hljs-attribute">font-weight</span>: normal / bold / bolder / lighter;<span class="hljs-comment">/*指定字体的粗细*/</span><br>&#125;<br></code></pre></td></tr></table></figure><h2 id="链接">链接</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:link</span>: &#123;<span class="hljs-attribute">color</span>: yellow;&#125;<br><span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:visited</span>: &#123;<span class="hljs-attribute">color</span>: black;&#125;<br><span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:hover</span>: &#123;<span class="hljs-attribute">color</span>: blue;&#125;<br><span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:active</span>: &#123;<span class="hljs-attribute">color</span>: red;&#125;<br></code></pre></td></tr></table></figure><h2 id="列表">列表</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">ul</span>&#123;<br>  <span class="hljs-attribute">list-style</span>: all;<br>  <span class="hljs-attribute">list-style-type</span>: circle / square / upper-roman / lower-alpha;<br>  <span class="hljs-attribute">list-style-image</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;url&#x27;</span>);<br>  <span class="hljs-attribute">list-style-position</span>: inside / outside / inherit;<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="盒子模型上-右-下-左">盒子模型(上 右 下 左)</h2><blockquote><p><strong>所有HTML元素可以看作盒子, 在CSS中, <code>"box model"</code>这一术语是用来<code>设计</code>和<code>布局</code>时使用,CSS盒模型本质上是一个盒子, 封装周围的HTML元素, 它包括:<code>边距</code>, <code>边框</code>, <code>填充</code>,和<code>实际内容</code></strong> 一个盒子的高度一般不用单独设置,由其内容撑开 <strong>不要给元素添加具有指定宽度的内边距,而是尝试将内边距或外边距添加到元素的父元素和子元素</strong></p></blockquote><img src="/posts/ee69e452/CSS-Box-Model.jpg" class="" title="[CSS-Box-Model]"><img src="/posts/ee69e452/Box-Model.jpg" class="" title="[CSS_BOX_MODEL]"><ul><li><code>margin</code> (外边距) - 清除边框外的区域,外边距是透明的(盒子与盒子之间的距离)</li><li><code>border</code> (边框) - 围绕在内边距和内容外的边框</li><li><code>padding</code> (内边距) - 清除内容周围的区域,内边距是透明的(内容填充, 内容到边框之间的距离)</li><li><code>content</code> (内容) - 盒子的内容, 显示文本和图像</li><li><code>说明</code>: margin属性本意描述的<strong>兄弟与兄弟</strong>元素之间的关系,若是父子元素关系, 就最好给其父元素加 padding 属性</li></ul><p><strong>margin 实现水平居中</strong> &gt; 元素要有固定的宽度(未设置,为父元素100%的宽度), 只有块元素可以实现水平居中, 行内元素不能实现;只有标准文档流中的盒子可以使用 margin 实现水平居中 &gt; margin属性是用来实现盒子的水平居中, 而不是文本的水平居中</p><p><strong>注意:</strong> &gt; 在标准文档流中<strong>垂直方向</strong>的margin 值不会叠加, 仅仅会取比较大的值 &gt; 水平方向没有 margin的塌陷现象 &gt; 浮动元素它是没有 margin 的塌陷现象的</p><h2 id="几种属性">几种属性</h2><h3 id="关于尺寸">关于尺寸:</h3><h4 id="width-height设置元素的宽高">width &amp;&amp;height(设置元素的宽高)</h4><p><code>p&#123; height:100px; width:100px;&#125;</code></p><h4 id="line-height设置元素的行高">line-height(设置元素的行高)</h4><p><code>p&#123;line-height: 14px;&#125;</code></p><h4id="display行内与块级相互转化-visibility">display(行内与块级相互转化)&amp;&amp; visibility</h4><blockquote><p>块级元素(block)特性: 总是<em>独占一行</em>, 表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width), 高度(height),内边距(padding)和外边距(margin)都可控制;</p></blockquote><p><code>块级元素: div, h1, h2, h3, h4, h5, h6, hr, dl, ul, li, form, ol, p, pre, table</code></p><blockquote><p>内联元素(inline)特性: 和相邻的内联元素在同一行; 宽度(width),高度(height),内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变,就是里面文字或图片的大小, 即宽高有内容撑开;</p></blockquote><p><code>内联元素: a, img, br, input, select, small, span, strong, sub, sup, textarea,</code></p><img src="/posts/ee69e452/%E5%85%83%E7%B4%A0%E5%88%86%E7%B1%BB.png" class="" title="[元素分类]"><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">h1</span>&#123; <span class="hljs-attribute">display</span>: none;&#125;<span class="hljs-comment">/*隐藏一个元素, 不会占用空间*/</span><br><span class="hljs-selector-tag">h1</span>&#123; <span class="hljs-attribute">visibility</span>: hidden&#125;<span class="hljs-comment">/*隐藏一个元素, 隐藏的元素仍需占用与未隐藏之前一样的空间*/</span><br><br><span class="hljs-selector-tag">li</span>&#123; <span class="hljs-attribute">display</span>: inline;&#125;<span class="hljs-comment">/*显示为内联元素*/</span><br><span class="hljs-selector-tag">span</span>&#123; <span class="hljs-attribute">display</span>: block;&#125;<span class="hljs-comment">/*显示为块级元素*/</span><br></code></pre></td></tr></table></figure><h4 id="position定位">position(定位)</h4><p><strong>标准文档流: 从左至右, 从上至下; 遇到换行做空格解析；高低不齐, 底部对齐</strong> <strong>定位有四个属性值</strong></p><p><strong>1. <code>static</code></strong>: 默认值, 即没有定位,元素出现在正常的文档流中<br /><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">div</span><span class="hljs-selector-class">.static</span> &#123;<br>  <span class="hljs-attribute">position</span>: static;<br>  <span class="hljs-attribute">border</span>: <span class="hljs-number">3px</span> solid <span class="hljs-number">#73AD21</span>;<br>&#125;<br></code></pre></td></tr></table></figure></p><p><strong>2. <code>fixed</code></strong>:元素位置相对于<strong>浏览器窗口</strong>是固定位置,即使窗口滚动也不会动,与标准文档流无关, 层级比标准文档流元素高, 且不占据空间<br /><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">p</span><span class="hljs-selector-class">.pos_fixed</span><br>&#123;<br>  <span class="hljs-attribute">position</span>:fixed;<br>  <span class="hljs-attribute">top</span>:<span class="hljs-number">30px</span>;<br>  <span class="hljs-attribute">right</span>:<span class="hljs-number">5px</span>;<br>&#125;<br></code></pre></td></tr></table></figure></p><p><strong>3. <code>relative</code></strong>:<br />1)<strong>相对定位不脱标</strong><br />2)相对定位不改变元素的性质, 不设置偏移属性, 位置不发生改变3)相对定位元素的定位是相对于,<strong>文档流中原先位置进行定位</strong><br />4)元素会<strong>提升一个层级</strong>, 它原本所占的空间并不会改变<br /><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">h2</span><span class="hljs-selector-class">.pos_left</span><br>&#123;<br>  <span class="hljs-attribute">position</span>:relative;<br>  <span class="hljs-attribute">left</span>:-<span class="hljs-number">20px</span>;<br>&#125;<br><span class="hljs-selector-tag">h2</span><span class="hljs-selector-class">.pos_right</span><br>&#123;<br>  <span class="hljs-attribute">position</span>:relative;<br>  <span class="hljs-attribute">left</span>:<span class="hljs-number">20px</span>;<br>&#125;<br></code></pre></td></tr></table></figure></p><strong>4. <code>absolute</code></strong>:<br />1)绝对定位改变元素的性质, 不设置偏移属性, 位置不发生改变<br />2)绝对定位脱离标准文档流, 定位的元素和其他元素重叠<br />3)绝对定位的元素的位置相对于”最近”的已定位(无论是相对、绝对或固定)的父元素, 如果没有, 则它的位置相对于<body><p>(浏览器窗口)进行定位 <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">h2</span><br>&#123;<br>  <span class="hljs-attribute">position</span>:absolute;<br>  <span class="hljs-attribute">left</span>:<span class="hljs-number">100px</span>;<br>  <span class="hljs-attribute">top</span>:<span class="hljs-number">150px</span>;<br>&#125;<br></code></pre></td></tr></table></figure></p><h4 id="z-index-属性">z-index 属性</h4><blockquote><p>z-index 表示层级大小, 数值大的会压盖数值小的, 默认为0只有定位元素才有 z-index 值, 若多个定位元素未设置, 或者值相同,则写在HTML后面的定位元素会压盖前面的的定位元素</p></blockquote><h4 id="float浮动">float(浮动)</h4><p><strong>浮动的特点</strong><br />&gt; 1. <code>脱离文档流</code>, 浮动的<strong>元素互相贴靠</strong>,浮动元素有”字围”效果、收缩; &gt; 2. 一旦元素浮动后, 即脱离文档流,就不受文档流的控制了, 也就没有行内、块级之分了; &gt; 3.<strong>行内元素能够支持宽高, 但浮动元素未设置宽高,其宽高由内容撑开</strong>;</p><p><strong>浮动清除的方法:</strong><br />&gt; 经过浮动的元素, 会影响到它下面元素的布局,浮动元素的父元素没有将浮动元素包裹 &gt; 1.<code>给浮动元素的父级元素加高度</code>: 如果一个元素要浮动,那么它的父级元素一定要有高度, 保证父级高度不能小于子级高度,有高度的盒子, 才能包住浮动的子元素; &gt; 2.追加一个空元素并添加<code>clear: both;</code>:(该元素的左右两侧都不能有浮动元素),但是这种方法有一个非常大的、致命的问题, 它所在的标签,“margin属性失效了”, margin失效的本质原因是: 父级高度为零. &gt; 3.在最后的浮动元素增加<code>&lt;div class="clear&gt;&lt;/div&gt;</code>,并<code>clear: both;</code> &gt; 4. 在父元素上添加:<code>overflow: hidden;</code></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-class">.clear</span>&#123;<br>   <span class="hljs-attribute">zoom</span>: <span class="hljs-number">1</span>;  <span class="hljs-comment">/*兼容 IE6 利用 hasLayout*/</span><br>&#125;<br><span class="hljs-selector-class">.clear</span><span class="hljs-selector-pseudo">:before</span>, <span class="hljs-selector-class">.clear</span><span class="hljs-selector-pseudo">:after</span>&#123;  <br>  # 父级后边 追加 空内容 <br>   <span class="hljs-attribute">content</span>: <span class="hljs-string">&#x27;&#x27;</span>;<br>   <span class="hljs-attribute">display</span>: block;<br>   <span class="hljs-attribute">clear</span>: both;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="transform-2d效果">transform (2D效果)</h4><blockquote><p>通过CSS3 转换, 可以实现对元素的移动、缩放、转动、拉长或拉伸<code>移动:translate(10px,30px)</code>/<code>旋转:rotate(40deg)</code>/<code>缩放:scale(2,4)</code>/<code>倾斜:skew(30deg,20deg)</code>/<code>矩阵:matrix()</code></p></blockquote><p><ahref="https://www.cnblogs.com/Ivy-s/p/6786622.html">矩阵效果参考</a></p><h4 id="transform-3d效果">transform (3D效果)</h4><blockquote><p>rotateX() rotateY() rotateZ()</p></blockquote><h4 id="transition-过度">transition (过度)</h4><blockquote><p>CSS3 过度是元素从一种样式逐渐改变为另一种的效果 目标属性、时长</p></blockquote><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;style&gt;<br>  <span class="hljs-selector-tag">div</span>&#123;<br>    <span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;<br>    <span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;<br>    <span class="hljs-attribute">background-color</span>: red;<br>    <span class="hljs-attribute">transition</span>: width <span class="hljs-number">3s</span>, height <span class="hljs-number">3s</span>;<br>  &#125;<br>  <span class="hljs-selector-tag">div</span><span class="hljs-selector-pseudo">:hover</span>&#123;<span class="hljs-attribute">width</span>:<span class="hljs-number">400px</span>; <span class="hljs-attribute">height</span>:<span class="hljs-number">400px</span>; <span class="hljs-attribute">transform</span>:<span class="hljs-built_in">rotate</span>(<span class="hljs-number">180deg</span>);&#125;<br>&lt;/style&gt;<br>&lt;<span class="hljs-selector-tag">body</span>&gt;<br>&lt;<span class="hljs-selector-tag">div</span>&gt;&lt;/<span class="hljs-selector-tag">div</span>&gt;<br>&lt;/<span class="hljs-selector-tag">body</span>&gt;<br></code></pre></td></tr></table></figure><h4 id="keyframes-animation"><span class="citation"data-cites="keyframes">@keyframes</span> (animation)</h4><blockquote><p>在 <span class="citation" data-cites="keyframes">@keyframes</span>中规定某项 CSS 样式, 可以创建由当前样式逐渐改为新样式的动画效果动画名称、动画时长</p></blockquote><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;style&gt;<br>  <span class="hljs-selector-tag">div</span>&#123;<span class="hljs-attribute">width</span>:<span class="hljs-number">100</span>ox; <span class="hljs-attribute">height</span>:<span class="hljs-number">100px</span>; <span class="hljs-attribute">background</span>:red animation:myfirstAnim <span class="hljs-number">3s</span>;&#125;<br>  <span class="hljs-keyword">@keyframes</span> myfirstAnim&#123;<br>    <span class="hljs-comment">/*也可以 0%&#123;&#125; 25%&#123;&#125; 50%&#123;&#125; 75%&#123;&#125; 100%&#123;&#125; 控制*/</span><br>    <span class="hljs-selector-tag">from</span>&#123;<span class="hljs-attribute">background</span>:red;&#125; <br>    <span class="hljs-selector-tag">to</span>&#123;<span class="hljs-attribute">background</span>:yellow;&#125;<br>  &#125;<br>&lt;/style&gt;<br>&lt;<span class="hljs-selector-tag">body</span>&gt;&lt;<span class="hljs-selector-tag">div</span>&gt;&lt;/<span class="hljs-selector-tag">div</span>&gt;&lt;/<span class="hljs-selector-tag">body</span>&gt;<br></code></pre></td></tr></table></figure><p><strong>待续…</strong></p>]]>
    </content>
    <id>https://anyu967.github.io/posts/ee69e452.html</id>
    <link href="https://anyu967.github.io/posts/ee69e452.html"/>
    <published>2019-08-08T12:01:40.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-08-CSS]]>
    </summary>
    <title>CSS</title>
    <updated>2026-02-22T05:33:39.792Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="HTML" scheme="https://anyu967.github.io/categories/HTML/"/>
    <category term="HTML" scheme="https://anyu967.github.io/tags/HTML/"/>
    <category term="Web" scheme="https://anyu967.github.io/tags/Web/"/>
    <content>
      <![CDATA[<p>2019-08-08-HTML2 <span id="more"></span></p><h1 id="简单介绍-html5">简单介绍 HTML5</h1><h2 id="结构">结构</h2><img src="/posts/82d0dbac/HTML5.png" class="" title="[HTML5]"><h2 id="新元素">新元素</h2><h3 id="一canvas">一、Canvas</h3><blockquote><p><strong><code>&lt;canvas&gt;</code> 元素用于图形的绘制,<code>&lt;canvas&gt;</code> 标签只是图形容器, 通过脚本(通常是JavaScript)来完成</strong></p></blockquote><img src="/posts/82d0dbac/Canvas.jpg" class="" title="[Canvas]"><p><strong><em>如下是一些例子:</em></strong></p><p><strong>1.绘制矩形</strong> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;canvas id=<span class="hljs-string">&quot;canvas&quot;</span> width=<span class="hljs-string">&quot;200&quot;</span> height=<span class="hljs-string">&quot;100&quot;</span> style=<span class="hljs-string">&quot;border: 1px solid #c3c3c3;&quot;</span>&gt;您的浏览器不支持 <span class="hljs-title class_">HTML5</span> canvas 标签。&lt;/canvas&gt;<br><br><span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="language-javascript"><span class="language-xml">   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElemnetById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);  <span class="hljs-comment">//找到 &lt;canvas&gt;</span></span></span><br><span class="language-javascript"><span class="language-xml">   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContent</span>(<span class="hljs-string">&quot;2d&quot;</span>); <span class="hljs-comment">// 创建 context 对象</span></span></span><br><span class="language-javascript"><span class="language-xml">   ctx.<span class="hljs-property">fillStyle</span>=<span class="hljs-string">&quot;#FF0000&quot;</span>; </span></span><br><span class="language-javascript"><span class="language-xml">   ctx.<span class="hljs-title function_">fillRect</span>(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">150</span>,<span class="hljs-number">75</span>); <span class="hljs-comment">// fillRect(x,y,width,height) </span></span></span><br><span class="language-javascript"><span class="language-xml"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span><br></code></pre></td></tr></table></figure></p><p><strong>2.绘制路径</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;script&gt;<br>   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);<br>   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">&quot;2d&quot;</span>);<br>   ctx.<span class="hljs-title function_">moveTo</span>(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>); <span class="hljs-comment">// moveTo(x,y) 定义线条开始坐标</span><br>   ctx.<span class="hljs-title function_">lineTo</span>(<span class="hljs-number">200</span>,<span class="hljs-number">100</span>); <span class="hljs-comment">// lineTo(x,y) 定义线条结束坐标</span><br>   ctx.<span class="hljs-title function_">stroke</span>(); <span class="hljs-comment">// stroke() 方法来绘制线条</span><br>&lt;/script&gt;<br></code></pre></td></tr></table></figure></p><p><strong>3.绘制圆形</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;script&gt;<br>   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);<br>   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">&quot;2d&quot;</span>);<br>   ctx.<span class="hljs-title function_">beginPath</span>();<br>   ctx.<span class="hljs-title function_">arc</span>(<span class="hljs-number">95</span>,<span class="hljs-number">50</span>,<span class="hljs-number">40</span>,<span class="hljs-number">0</span>,<span class="hljs-number">2</span>*<span class="hljs-title class_">Math</span>.<span class="hljs-property">PI</span>); <span class="hljs-comment">// arc(x,y,r,start,stop)</span><br>   ctx.<span class="hljs-title function_">stroke</span>();<br>&lt;/script&gt;<br></code></pre></td></tr></table></figure></p><p><strong>4.渲染文本</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;script&gt;<br>   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);<br>   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">&quot;2d&quot;</span>);<br>   ctx.<span class="hljs-property">font</span>=<span class="hljs-string">&quot;30px Arial&quot;</span>;<br>   ctx.<span class="hljs-title function_">fillText</span>(<span class="hljs-string">&quot;Hello World&quot;</span>,<span class="hljs-number">10</span>,<span class="hljs-number">50</span>); <span class="hljs-comment">// 实心 fillText(text,x,y)方法, 空心 storkeText()方法</span><br>&lt;/script&gt;<br></code></pre></td></tr></table></figure></p><p><strong>5.渐变</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;script&gt;<br>   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);<br>   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">&quot;2d&quot;</span>);<br> <br>   <span class="hljs-comment">// createLinearGradient(x,y,x1,y1) - 创建线条渐变</span><br>   <span class="hljs-comment">// createRadialGradient(x,y,r,x1,y1,r1) - 创建一个径向/圆渐变</span><br>   <span class="hljs-keyword">var</span> grd=ctx.<span class="hljs-title function_">createLinearGradient</span>(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">200</span>,<span class="hljs-number">0</span>);<br>   grd.<span class="hljs-title function_">addColorStop</span>(<span class="hljs-number">0</span>,<span class="hljs-string">&quot;red&quot;</span>);<br>   grd.<span class="hljs-title function_">addColorStop</span>(<span class="hljs-number">1</span>,<span class="hljs-string">&quot;white&quot;</span>);<br> <br>   <span class="hljs-comment">// 填充渐变</span><br>   ctx.<span class="hljs-property">fillStyle</span>=grd;<br>   ctx.<span class="hljs-title function_">fillRect</span>(<span class="hljs-number">10</span>,<span class="hljs-number">10</span>,<span class="hljs-number">150</span>,<span class="hljs-number">80</span>);<br>&lt;/script&gt;<br></code></pre></td></tr></table></figure></p><p><strong>6.渲染图像</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;script&gt;<br>   <span class="hljs-keyword">var</span> c=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;canvas&quot;</span>);<br>   <span class="hljs-keyword">var</span> ctx=c.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">&quot;2d&quot;</span>);<br>   <span class="hljs-keyword">var</span> img=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;scream&quot;</span>);<br>   ctx.<span class="hljs-title function_">drawImage</span>(img,<span class="hljs-number">10</span>,<span class="hljs-number">10</span>);<br>&lt;/script&gt;<br></code></pre></td></tr></table></figure></p><h3 id="二svg">二、SVG</h3><blockquote><p><strong>SVG 指可伸缩矢量图形 (Scalable Vector Graphics),用于定义用于网络的基于矢量的图形, 使用 XML 格式定义图形, SVG图像在放大或改变尺寸的情况下其图形质量不会有损失</strong></p></blockquote><p><strong>五角星</strong><br /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs javascript">&lt;svg xmlns=<span class="hljs-string">&quot;http://www.w3.org/2000/svg&quot;</span> width=<span class="hljs-string">&quot;190&quot;</span> height=<span class="hljs-string">&quot;190&quot;</span>&gt;<br>  <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">polygon</span> <span class="hljs-attr">points</span>=<span class="hljs-string">&quot;100,10 40,180 190,60 10,60 160,180&quot;</span></span></span><br><span class="hljs-tag"><span class="language-xml">  <span class="hljs-attr">style</span>=<span class="hljs-string">&quot;fill:lime; stroke:purple; stroke-width:5; fill-rule:evenodd;&quot;</span>&gt;</span></span><br><span class="language-xml"><span class="hljs-tag">&lt;/<span class="hljs-name">svg</span>&gt;</span></span><br></code></pre></td></tr></table></figure></p><h3 id="三video-与-audio">三、Video 与 Audio</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">video</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;320&quot;</span> <span class="hljs-attr">height</span>=<span class="hljs-string">&quot;240&quot;</span> <span class="hljs-attr">controls</span>=<span class="hljs-string">&quot;controls&quot;</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;movie.mp4&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;video/mp4&quot;</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;movie.ogg&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;video/ogg&quot;</span>&gt;</span><br>  您的浏览器不支持 HTML5 video 标签。<br><span class="hljs-tag">&lt;/<span class="hljs-name">video</span>&gt;</span><br><br><span class="hljs-tag">&lt;<span class="hljs-name">audio</span> <span class="hljs-attr">controls</span>=<span class="hljs-string">&quot;controls&quot;</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;horse.ogg&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;audio/ogg&quot;</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;horse.mp3&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;audio/mpeg&quot;</span>&gt;</span><br>您的浏览器不支持 audio 元素。<br><span class="hljs-tag">&lt;/<span class="hljs-name">audio</span>&gt;</span><br></code></pre></td></tr></table></figure><h3 id="四拖放">四、拖放</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs css">&lt;style&gt;<br>   <span class="hljs-selector-id">#box</span>&#123; <span class="hljs-attribute">width</span>:<span class="hljs-number">100px</span>; <span class="hljs-attribute">height</span>:<span class="hljs-number">100px</span>; <span class="hljs-attribute">border</span>:<span class="hljs-number">1px</span> solid <span class="hljs-number">#000</span>;&#125;<br>&lt;/style&gt;<br>&lt;script&gt;<br>   function allowDrop(ev)&#123;<br>      ev<span class="hljs-selector-class">.preventDefault</span>();<br>   &#125;<br>   // 拖动<br>   function drag(ev)&#123;<br>      ev<span class="hljs-selector-class">.dataTransfer</span><span class="hljs-selector-class">.setData</span>(&quot;<span class="hljs-selector-tag">Text</span>&quot;, ev<span class="hljs-selector-class">.target</span><span class="hljs-selector-class">.id</span>);<br>   &#125;<br>   // 放置<br>   function drop(ev)&#123;<br>      ev<span class="hljs-selector-class">.preventDefault</span>();<br>      <span class="hljs-selector-tag">var</span> data = ev<span class="hljs-selector-class">.dataTransfer</span><span class="hljs-selector-class">.getData</span>(&quot;<span class="hljs-selector-tag">Text</span>&quot;);<br>      ev<span class="hljs-selector-class">.target</span><span class="hljs-selector-class">.appendChild</span>(document<span class="hljs-selector-class">.getElementById</span>(data));<br>   &#125;<br>&lt;/script&gt;<br>&lt;<span class="hljs-selector-tag">body</span>&gt;<br>   &lt;<span class="hljs-selector-tag">div</span> id=&quot;box&quot; ondrop=&quot;drop(event)&quot; ondragover=&quot;allowDrop(event)&quot;&gt;&lt;/<span class="hljs-selector-tag">div</span>&gt;<br>   &lt;<span class="hljs-selector-tag">img</span> id=&quot;drag&quot; <span class="hljs-attribute">src</span>=&quot;images/<span class="hljs-number">1</span><span class="hljs-selector-class">.png</span>&quot; draggable=&quot;true ondragstart=&quot; drag(event)&quot;/&gt;<br>&lt;/<span class="hljs-selector-tag">body</span>&gt;<br></code></pre></td></tr></table></figure><h1 id="待续">待续…</h1>]]>
    </content>
    <id>https://anyu967.github.io/posts/82d0dbac.html</id>
    <link href="https://anyu967.github.io/posts/82d0dbac.html"/>
    <published>2019-08-08T10:58:47.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-08-HTML2]]>
    </summary>
    <title>html-02</title>
    <updated>2026-02-22T05:33:39.801Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="HTML" scheme="https://anyu967.github.io/categories/HTML/"/>
    <category term="HTML" scheme="https://anyu967.github.io/tags/HTML/"/>
    <category term="Web" scheme="https://anyu967.github.io/tags/Web/"/>
    <content>
      <![CDATA[<p>HTML01 <span id="more"></span></p><h2 id="html">HTML</h2><h3 id="概念">概念:</h3><blockquote><p><code>超文本标记语言</code>(HyperText Markup Language)是一种用于创建网页的标准标记语言</p></blockquote><h3 id="结构">结构:</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;utf-8&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;description&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;tutorial&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">&quot;refresh&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;30&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">&quot;stylesheet&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/css&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;css.css&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="language-css"></span><br><span class="language-css"><span class="hljs-selector-tag">body</span> &#123;<span class="hljs-attribute">background</span>: red;&#125;</span><br><span class="language-css"></span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span><br><br><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>我的第一个标题<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>我的第一个段落<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span><br></code></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span> 声明为 HTML5 文档<br><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span> 元素是 HTML 页面的根元素<br><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span> 元素包含了文档的元（meta）数据，如 `<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;utf-8&quot;</span>&gt;</span>` 定义网页编码格式为 utf-8<br><span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span> 元素描述了文档的标题<br><span class="hljs-tag">&lt;<span class="hljs-name">link</span>&gt;</span> 标签通常用于链接到样式表<br><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span> 元素包含了可见的页面内容<br><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span> 元素定义一个大标题<br><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span> 元素定义一个段落<br></code></pre></td></tr></table></figure><h3 id="基础">基础:</h3><h4 id="注释">注释:</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-comment">&lt;!--&gt;...&lt;--&gt;</span><br></code></pre></td></tr></table></figure><h4 id="元素标签">元素(标签)</h4><ul><li><p>标题(Heading) <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span> - <span class="hljs-tag">&lt;<span class="hljs-name">h6</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">h6</span>&gt;</span> 标签进行定义<br><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span> 定义最大的标题, <br><span class="hljs-tag">&lt;<span class="hljs-name">h6</span>&gt;</span> 定义最小的标题<br><span class="hljs-tag">&lt;<span class="hljs-name">hr</span> /&gt;</span> 标签进行定义水平线<br></code></pre></td></tr></table></figure></p></li><li><p>段落(Paragraph) <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span> 标签进行定义 <br><span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span> 标签进行定义换行<br></code></pre></td></tr></table></figure></p></li><li><p>文本格式化 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">b</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">b</span>&gt;</span> 定义粗体文本<br><span class="hljs-tag">&lt;<span class="hljs-name">em</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">em</span>&gt;</span> 定义着重文字( em = pixels / 16 )<br><span class="hljs-tag">&lt;<span class="hljs-name">i</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span> 定义斜体字<br><span class="hljs-tag">&lt;<span class="hljs-name">small</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">small</span>&gt;</span> 定义小号字<br><span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span> 定义加重语气<br><span class="hljs-tag">&lt;<span class="hljs-name">sub</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">sub</span>&gt;</span> 定义下标字<br><span class="hljs-tag">&lt;<span class="hljs-name">sup</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">sup</span>&gt;</span> 定义上标字<br><span class="hljs-tag">&lt;<span class="hljs-name">ins</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ins</span>&gt;</span> 定义插入字<br><span class="hljs-tag">&lt;<span class="hljs-name">del</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">del</span>&gt;</span> 定义删除字<br><span class="hljs-tag">&lt;<span class="hljs-name">code</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">code</span>&gt;</span> 定义计算机代码<br><span class="hljs-tag">&lt;<span class="hljs-name">kbd</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">kbd</span>&gt;</span> 定义键盘码<br><span class="hljs-tag">&lt;<span class="hljs-name">samp</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">samp</span>&gt;</span> 定义计算机代码样本<br><span class="hljs-tag">&lt;<span class="hljs-name">var</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">var</span>&gt;</span> 定义变量<br><span class="hljs-tag">&lt;<span class="hljs-name">pre</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">pre</span>&gt;</span> 定义预格式文本<br><span class="hljs-tag">&lt;<span class="hljs-name">abbr</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">abbr</span>&gt;</span> 定义缩写<br><span class="hljs-tag">&lt;<span class="hljs-name">address</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">address</span>&gt;</span> 定义地址<br><span class="hljs-tag">&lt;<span class="hljs-name">bdo</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">bdo</span>&gt;</span> 定义文字方向<br><span class="hljs-tag">&lt;<span class="hljs-name">blockquote</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">blockquote</span>&gt;</span> 定义长的引用<br><span class="hljs-tag">&lt;<span class="hljs-name">q</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">q</span>&gt;</span> 定义短的引用语<br><span class="hljs-tag">&lt;<span class="hljs-name">cite</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">cite</span>&gt;</span> 定义引用、引证<br><span class="hljs-tag">&lt;<span class="hljs-name">dfn</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">dfn</span>&gt;</span> 定义一个定义项目<br></code></pre></td></tr></table></figure></p></li><li><p>链接 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">hred</span>=<span class="hljs-string">&quot;url&quot;</span> <span class="hljs-attr">target</span>=<span class="hljs-string">&quot;_blank&quot;</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">&quot;noopener noreferrer&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span> <span class="hljs-comment">&lt;!-- 定义链接 --&gt;</span><br></code></pre></td></tr></table></figure></p></li><li><p>图像 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;url&quot;</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">&quot;sone_text&quot;</span> /&gt;</span> <span class="hljs-comment">&lt;!-- 定义图片 --&gt;</span><br></code></pre></td></tr></table></figure></p></li><li><p>表格 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">table</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>Header1<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>Header1<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span><br>  <span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>row1, cell1<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>row1, cell2<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span><br>  <span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span><br></code></pre></td></tr></table></figure> <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span> 定义行<br><span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span> 定义列<br></code></pre></td></tr></table></figure></p></li><li><p>列表 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs html">  <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span> 无序<br><span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span> 有序<br><br><span class="hljs-tag">&lt;<span class="hljs-name">dl</span>&gt;</span> 自定义<br>    <span class="hljs-tag">&lt;<span class="hljs-name">dt</span>&gt;</span>Coffee<span class="hljs-tag">&lt;/<span class="hljs-name">dt</span>&gt;</span><br>      <span class="hljs-tag">&lt;<span class="hljs-name">dd</span>&gt;</span>- black hot drink<span class="hljs-tag">&lt;/<span class="hljs-name">dd</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">dt</span>&gt;</span>Milk<span class="hljs-tag">&lt;/<span class="hljs-name">dt</span>&gt;</span><br>      <span class="hljs-tag">&lt;<span class="hljs-name">dd</span>&gt;</span>- white cold drink<span class="hljs-tag">&lt;/<span class="hljs-name">dd</span>&gt;</span><br>    <span class="hljs-tag">&lt;/<span class="hljs-name">dl</span>&gt;</span>   <br></code></pre></td></tr></table></figure></p></li><li><p>表单 <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">&quot;action.php&quot;</span> <span class="hljs-attr">method</span>=<span class="hljs-string">&quot;get&quot;</span>&gt;</span><br>     文本框: <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;firstname&quot;</span> /&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span><br>  密码框: <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;password&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;pwd&quot;</span> /&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;radio&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;sex&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;male&quot;</span> /&gt;</span>单选框<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;checkbox&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;vehicle&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;Bike&quot;</span> /&gt;</span>复选框<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span><br>  <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;submit&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;Submit&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span><br></code></pre></td></tr></table></figure></p></li></ul><h4 id="属性">属性</h4><ul><li><strong>HTML 元素</strong>可以设置属性</li><li>属性可以在元素中添加附加信息</li><li>属性一般描述于开始标签</li><li>属性总是以<strong>属性名/属性值</strong>对的形式出现, 比如:name=“value”<br /></li><li><strong>class 属性</strong>可以多用 class=”“(引号里面可以填入多个class属性)</li><li><strong>id 属性</strong>只能单独设置 id=” “(只能填写一个,多个无效)</li></ul><h1 id="待续">待续…</h1>]]>
    </content>
    <id>https://anyu967.github.io/posts/1bd98a16.html</id>
    <link href="https://anyu967.github.io/posts/1bd98a16.html"/>
    <published>2019-08-08T07:44:11.000Z</published>
    <summary>
      <![CDATA[<p>HTML01]]>
    </summary>
    <title>html-01</title>
    <updated>2026-02-22T05:33:39.801Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="Hexo" scheme="https://anyu967.github.io/categories/Hexo/"/>
    <category term="github" scheme="https://anyu967.github.io/tags/github/"/>
    <category term="Hexo" scheme="https://anyu967.github.io/tags/Hexo/"/>
    <content>
      <![CDATA[<p>2019-08-05-网站数据备份 <span id="more"></span></p><h2 id="将网站数据备份至github">将网站数据备份至GitHub</h2><p><ahref="https://blog.csdn.net/u012195214/article/details/72721065">CSDN参考文章</a><br /><ahref="https://www.zhihu.com/question/21193762">使用hexo，如果换了电脑怎么更新博客？</a></p><h3 id="具体操作">具体操作:</h3><h4 id="情况1-新建博客">情况1, 新建博客</h4><ul><li><p>创建仓库: http://username.github.io</p></li><li><p>创建两个分支: <code>master</code> 与 <code>hexo</code></p></li><li><p>设置 hexo为默认分支(只需要手动管理这个分支上的Hexo网站文件)</p></li><li><p>使用 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">git <span class="hljs-built_in">clone</span> git@github.com:username/username.github.io.git  <span class="hljs-comment"># 拷贝仓库</span><br></code></pre></td></tr></table></figure></p></li><li><p>在本地 http://username.github.io文件夹下通过Git bash依次执行<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash">npm install hexo -g<br>hexo init<br>npm install<br>npm install hexo-deployer-git <span class="hljs-comment"># 此时当前分支应显示为hexo</span><br></code></pre></td></tr></table></figure></p></li><li><p>修改<code>_config.yml</code>中的deploy参数,分支应为master;</p></li><li><p>依次执行 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">git add .<br>git commit -m <span class="hljs-string">&quot;XXXX&quot;</span><br>git push origin hexo <span class="hljs-comment"># 提交网站相关的文件</span><br></code></pre></td></tr></table></figure></p></li><li><p>执行<code>hexo g -d</code>生成网站并部署到 GitHub 上</p></li></ul><h4 id="情况2-已经有部分博文部署到git但没有备份分支">情况2,已经有部分博文部署到git但没有备份分支</h4><ul><li><p>创建 hexo 分支, 并设置为默认分支</p></li><li><p><code>git clone git@github.com:username/username.github.io.git</code>到本地,删除除了 .git 以外的文件;</p></li><li><p>复制原有的博客源文件, 注意除了<code>.deploy_git</code>, 并创建<code>.gitignore</code> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">.DS_Store<br>Thumbs.db<br>db.json<br>*.<span class="hljs-built_in">log</span><br>node_modules/<br>public/<br>.deploy*/<br></code></pre></td></tr></table></figure></p></li><li><p>然后执行 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">git add .<br>git commit -m <span class="hljs-string">&quot;add hexo branch&quot;</span> <br>git push<br></code></pre></td></tr></table></figure></p></li></ul><h3 id="注意">注意:</h3><blockquote><p>If you’re using <strong><code>GitHub Free</code></strong> and<strong>change</strong> a repository’s visibility <strong>from public toprivate</strong>, <strong>you’ll lose access to features like protectedbranches and GitHub Pages.</strong></p></blockquote><blockquote><p><strong><em>Any published GitHub Pages site will be automaticallyunpublished.</em></strong> If you added a custom domain to the GitHubPages site, you should remove or update your DNS records before makingthe repository private, to avoid the risk of a domain takeover. For moreinformation, see “Adding or removing a custom domain for your GitHubPages site.”</p></blockquote><p><strong><ahref="https://help.github.com/en/articles/setting-repository-visibility">helpgithub</a></strong></p><h3 id="设置域名">设置域名</h3><h3 id="cdn加速github-pages">CDN加速Github Pages</h3><h4 id="又拍云的cdn">又拍云的CDN</h4><ol type="1"><li><p><ahref="https://help.upyun.com/knowledge-base/cdn-create-service/">又拍云CDN配置文档</a></p><ul><li><p><a href="https://www.upyun.com/league">又拍云联盟</a></p><blockquote><p>又拍云联盟用户每月独享优惠加入又拍云联盟，按步骤完成申请，即可获得<strong>10GB免费存储空间</strong>+<strong>15GB免费CDN流量</strong></p></blockquote></li></ul></li><li><p>配置CDN服务</p><ul><li>upyun配置</li></ul><img src="/posts/f7bab86b/upyun1.png" class="" title="upyun配置1"><img src="/posts/f7bab86b/upyun2.png" class="" title="upyun配置2"><ul><li>智能压缩 开启 Gzip 和 Brotli</li><li>HTTP 302 调度</li><li>HTTPS 配置</li><li>TLS 1.3</li><li>WebP 自适应</li></ul></li><li><p>腾讯云域名配置</p><ul><li>增加又拍云提供的CDN域名</li><li>国外增加GitHub分配的域名</li><li><a href="https://www.hananoryu.cn/posts/221113/">参考文档</a></li></ul></li><li><p>Github Pages配置</p><ul><li>source目录下增加CNAME文件写上域名</li><li>Github Pages的settings下Custom domain配置域名，开启htpps</li></ul><img src="/posts/f7bab86b/upyun5.png" class="" title="upyun配置5"></li></ol>]]>
    </content>
    <id>https://anyu967.github.io/posts/f7bab86b.html</id>
    <link href="https://anyu967.github.io/posts/f7bab86b.html"/>
    <published>2019-08-05T05:39:06.000Z</published>
    <summary>
      <![CDATA[<p>2019-08-05-网站数据备份]]>
    </summary>
    <title>网站数据备份</title>
    <updated>2026-02-22T05:33:39.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>anyu967</name>
    </author>
    <category term="CRH" scheme="https://anyu967.github.io/tags/CRH/"/>
    <content>
      <![CDATA[<p>2019-07-29-tools <span id="more"></span></p><h2 id="转自httpsgithub.comshenzekun">## 转自<ahref="">https://github.com/shenzekun</a></h2><h1 id="useful-tools">useful-tools</h1><blockquote><p>🔨一些有用的工具网站（<strong>注意</strong>：有些网站可能需要翻墙才能看到）</p></blockquote><h2 id="浏览器兼容类">浏览器兼容类🌎</h2><ul><li><a href="https://caniuse.com/">caniuse</a>(网站开发浏览器兼容性查询)</li><li><a href="http://browserhacks.com/">browserhacks</a>(一些浏览器兼容写法)</li></ul><h2 id="图片类">图片类😎</h2><ul><li><a href="https://tinypng.com/">Tinypng</a> | <ahref="http://zhitu.isux.us/">智图</a> (压缩图片)</li><li><a href="http://www.biaonimeia.com/login">标你妹啊</a> (psd标注)</li><li><a href="https://coolbackgrounds.io/">Cool Backgrounds</a>(生成好看的渐变背景图)</li><li><ahref="https://carbon.now.sh/?bg=rgba(171,%20184,%20195,%201)&amp;t=seti&amp;wt=none&amp;l=auto&amp;ds=true&amp;dsyoff=20px&amp;dsblur=68px&amp;wc=true&amp;wa=true&amp;pv=48px&amp;ph=32px&amp;ln=false&amp;fm=Hack&amp;fs=14px&amp;si=false&amp;es=2x&amp;wm=false">carbon</a>(生成类似 mac 风格的代码图片，用于分享)<br /></li><li><a href="https://source.unsplash.com/">Unsplash Source</a>(生成随机图片)</li><li><a href="https://spritegen.website-performance.org/">CSS SpriteGenerator</a> (生成雪碧图)</li><li><a href="http://www.iconfont.cn/plus">iconfont</a>(阿里巴巴矢量图标库)</li><li><a href="https://icons8.com/preloaders/">Preloaders</a> | <ahref="https://loading.io/">LOADING.IO</a>(加载图，<strong>有些是收费的</strong>)</li><li><a href="https://www.desktoppr.co/wallpapers">desktoppr</a>(好看的壁纸)</li><li><a href="https://material.io/tools/icons/?style=baseline">Materialicons</a> (Material icons图标)</li><li><a href="https://www.iloveimg.com/zh-cn">Iloveimg</a>(批量编辑图片的所有工具。包括压缩图片，剪裁图片，图片加水印，转化至jpg图片等等)</li><li><a href="https://www.pkgif.net/">pkgif</a> (任意GIF添加字幕)</li><li><a href="https://imagecyborg.com/">ImageCyborg</a>(一键下载当前网页的所有图片)</li><li><a href="http://emblemmatic.org/markmaker/#/">MarkMaker</a> (在线logo 随机生成工具)</li><li><a href="https://www.remove.bg/">Removebg</a>(在线移除背景工具，想改图片的背景可以用这个，证件照必备😀)</li><li><a href="https://jakearchibald.github.io/svgomg/">SVGOMG</a>(SVG图形压缩优化)</li></ul><p>## 代码类⌨️</p><ul><li><a href="https://paste.ubuntu.com/">Ubuntu pastebin</a>(代码分享)</li><li><a href="https://codepen.io/pens/">Codepen</a> | <ahref="http://jsbin.com/">Jsbin</a> (在线代码编辑)</li><li><a href="https://codesandbox.io/">CodeSandbox</a>(在线写React,自动编译,有代码提示)</li><li><a href="http://www.colorzilla.com/gradient-editor/">Ultimate CSSGradient Generator</a> (生成 css 渐变)</li><li><a href="https://www.grabient.com/">Grabient</a> (生成漂亮的 css渐变)</li><li><a href="https://dev.w3.org/html5/html-author/charref">CharacterEntity Reference Chart</a> (各种符号的转义字符)</li><li><ahref="http://apps.eky.hk/css-triangle-generator/zh-hant">css三角形产生器</a>| <a href="http://www.cssarrowplease.com/">CSS ARROW PLEASE</a>(生成CSS小三角)</li><li><ahref="https://easings.net/zh-cn?tuyiyi.com">缓动函数速查表</a></li><li><a href="https://regexper.com/">Regexper</a> (正则可视化)</li><li><a href="https://regex101.com/">Regex101</a> (正则表达式测试)</li><li><a href="https://visualgo.net/en">Visualgo</a>(数据结构，算法可视化)</li><li><a href="http://animista.net/">Animista</a> (在线生成 css 动画)</li><li><ahref="https://developers.google.com/speed/pagespeed/insights/">PageSpeedInsights</a> (测试网站速度，优化性能)</li><li><a href="https://learngitbranching.js.org/">Learn Git Branching</a>(以动画的形式让你学习 git)</li><li><a href="http://asciiflow.com/">Asciiflow</a>(生成类似代码注释里那种佛祖的代码。。自己画😄)</li><li><a href="http://pxtoem.com/">PXtoEM</a> (PX EM 单位换算)</li><li><a href="http://epic-spinners.epicmax.co/#/">epic-spinners</a>(一个好看的css loading 代码库)</li><li><a href="https://www.myintervals.com/emogrifier.php">Emogrifier</a>(邮件模板必备工具-html转换成内联样式)</li></ul><h2 id="效率类">效率类⚡️</h2><ul><li><a href="https://modao.cc/">墨刀</a> (画原型图)</li><li><a href="https://shimo.im/">石墨文档</a> | <ahref="https://docs.qq.com/">腾讯文档</a>(多人实时协作的云端文档与表格)</li><li><a href="https://www.hloom.com/resume-examples/">resume-examples</a>(简历模板)</li><li><a href="https://enhancv.com/">Enhancv</a> (生成简历)</li><li><a href="http://www.koppt.cn/index">KOPPT</a> (ppt 模板)</li><li><a href="https://about.beautiful.ai/">Beautiful.Ai</a> (人工智能 ppt模板创建)</li><li><a href="https://www.canva.com/templates/">Canva</a> (设计模板)</li><li><ahref="https://www.processon.com/;jsessionid=EC0CB59BD105F6FD0294417AB0B0CC22.jvm1">ProcessOn</a>(在线画流程图，思维导图、UI原型图等等)</li><li><a href="https://wakatime.com/">WakaTime</a>(跟踪项目花费的时间，得装插件)</li><li><a href="http://screensiz.es/">Screen Sizes</a> (移动屏幕尺寸)</li><li><a href="https://habitica.com/">Habitica</a> (游戏化Todo)</li><li><a href="https://smallpdf.com/">Smallpdf</a>(非常厉害的一个网站，PDF压缩，PDF转PPT，Word，Excel等等都可以直接通过这个页面实现)</li><li><a href="https://cli.im/">草料二维码</a> (在线生成二维码)</li><li><a href="https://ppt.baomitu.com">声享</a> (在线制作 PPT)</li><li><a href="https://mubu.com/">幕布</a>(极简大纲笔记，一键生成思维导图)</li><li><a href="https://infogram.com/">Infogram</a> (在线图表制作工具)</li><li><a href="https://uzer.me/">UZER.ME</a>(能够在线使用ps，ai，office，xmind，火狐浏览器等多个应用的网站)</li><li><a href="http://www.nicetool.net/">NiceTool</a>(在线工具集合网站)</li><li><a href="https://unbug.github.io/codelf/">codelf</a>(开发变量命名神器)</li><li><a href="https://tableconvert.com/">表格转换</a>(Markdown表格生成,LaTex表格生成)</li><li><a href="https://www.rdtoc.com/tools/jsonpath">JSONPath</a>(在线JSON提取工具)</li><li><a href="https://www.rdtoc.com/tools/jmespath">JMESPath</a>(在线JSON提取工具)</li></ul><h2 id="查询类">查询类🔎</h2><ul><li><a href="https://devhints.io/">devhints</a>(常用速查表，快速查询各类框架和库的常用方法，很实用)</li><li><a href="https://docschina.org/">印记中文</a>(快速查询各类框架和周边库的中文文档)</li><li><a href="https://csstriggers.com/">Css Triggers</a>(列出了哪些CSS属性在不同的渲染引擎中是否会触发重排或重绘)</li><li><a href="https://securityheaders.com/">Security Headers</a>(搜索网站是否有不安全的头部 header 设置，并会评分)</li><li><a href="https://devdocs.io/">devdocs</a> (各种编程语言 API文档)</li><li><a href="http://www.speedtest.cn/">Seepdtest</a>(测速网站)<ul><li>300M的家庭带宽，家庭网络需要使用<code>千兆无线路由器、千兆网线组网</code></li><li><code>1Mbps=1024Kbps=128KB/s, 300Mbps=300x128=38400KB/s=37.5MB/s</code></li></ul></li><li>关于网线:<ul><li><code>五类线</code>：该类电缆增加了绕线密度，传输带宽为100MHz，用于语音传输和最高传输速率为<code>100Mbps</code>的数据传输，主要用于100BASE-T和10BASE-T网络，已被超五类线替代。</li><li><code>超五类线</code>：具有衰减小，串扰少，比五类线增加了近端串音功率和的测试要求，并且具有更高的衰减串扰比（ACR)和信噪比、更小的时延误差，性能得到很大提高。超五类线的最大带宽为100MHz。</li><li><code>六类线</code>：的传输性能远远高于超五类标准，最适用于传输速率为<code>1Gbps</code>的应用。六类与超五类的一个重要的不同点在于：改善了在串扰以及回波损耗方面的性能，对于新一代全双工的高速网络应用而言，优良的回波损耗性能是极重要的。</li><li><code>超六类线</code>：是六类线的改进版，发布于2008年，同样是ANSI/TIA-568C.2和ISO/IEC11801超六类/EA级标准中规定的一种双绞线电缆，主要应用于万兆位网络中。传输频率500MHz，最大传输速度也可达到10Gbps ，在外部串扰等方面有较大改善</li><li><code>七类线</code>：该线是ISO/IEC 11801 7类/F级标准中于2002年,认可的一种双绞线，它主要为了适应万兆以太网技术的应用和发展。但它不再是一种非屏蔽双绞线了，而是一种屏蔽双绞线，所以它的传输频率至少可达600MHz，传输速率可达10 Gbps。</li></ul></li></ul>]]>
    </content>
    <id>https://anyu967.github.io/posts/eafade77.html</id>
    <link href="https://anyu967.github.io/posts/eafade77.html"/>
    <published>2019-07-29T12:40:35.000Z</published>
    <summary>
      <![CDATA[<p>2019-07-29-tools]]>
    </summary>
    <title>tools</title>
    <updated>2026-02-22T05:33:39.789Z</updated>
  </entry>
</feed>
