惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Proofpoint News Feed
量子位
K
Kaspersky official blog
S
SegmentFault 最新的问题
博客园 - 叶小钗
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
F
Fortinet All Blogs
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
T
Tenable Blog
U
Unit 42
S
Schneier on Security
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Visual Studio Blog
The Hacker News
The Hacker News
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
I
Intezer
Cyberwarzone
Cyberwarzone
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
Spread Privacy
Spread Privacy
T
The Exploit Database - CXSecurity.com
V
V2EX
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
www.infosecurity-magazine.com
www.infosecurity-magazine.com
PCI Perspectives
PCI Perspectives
腾讯CDC
Webroot Blog
Webroot Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News | PayPal Newsroom
Recorded Future
Recorded Future
D
DataBreaches.Net
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog

PixelNest

会议是效率的杀手 国庆出游记录 对居家办公的一些想法 2022 春节 《搏击俱乐部》的结局 纪念 PAI 头一回达到 100 卡片笔记法 《刑法学讲义》的部分摘录 迁移博客 《UNIX 传奇》摘录 就地过年 一点记录:docker-compose 编排不同项目间的网络 近期读的几本书 办新身份证 git 获取其他分支的单个文件或目录 我的高考成绩 推荐 2020 年上半年的 8 部影视作品 ChromeOS 开发者模式 终于下单了《守望者》 联通来电管家服务 关于 鸟枪换炮 《架构整洁之道》摘录 惨淡的星球大战 旧笔记本电脑 if...then... 命令行检测 SSL 证书过期时间 《程序员的职业素养》读书笔记 2019 国庆假期 在 Ubuntu 里按空格键预览 《基本穿搭》笔记 我在 Ubuntu 里安装的一些软件 让人郁闷的英语学习过程 色彩理论基础 向百度主动推送网站链接 两部电视剧 《历史的教训》摘录 新工具 Koa 获取客户端 IP 备案了 apiDoc 基础语法 《代码整洁之道》摘录 BBC 纪录片 《逻辑的乐趣》 读不下去的《原则》 蓝牙鼠标唤醒休眠的 Ubuntu Google 发布会 2018 国庆假期 开发者的时间追踪和统计 使用 curl 发送 POST 请求的几种方式 《重来 2》读书笔记 Linux 和 MacOS 命令行转换图片用法整理 《Go 语言实战》笔记 Win10 微软拼音添加小鹤双拼以及其他配置 针对不同场景临时禁用 eslint 规则的方法 《好妈妈胜过好老师》读书笔记 配置 Win10 Linux 子系统作为开发环境 又读完一本尤·奈斯博的小说 近期写 Go 的一点语法碎片整理 ffmpeg 合并 MP4 M4A 文件 睡前看手机的大问题 《局外人》读书笔记 菊次郎与佐纪 读书笔记 3 菊次郎与佐纪 读书笔记 2 菊次郎与佐纪 读书笔记 1 豆瓣图片服务器防盗链 《如何有效阅读一本书》读书笔记 - 3 《如何有效阅读一本书》读书笔记 - 2 《如何有效阅读一本书》读书笔记 - 1 Vim iskeyword 济南 图个乐 开始看不懂《西部世界》了 剧透 听到几个好故事 过周末 相亲 让人失望的 Apple 悬疑故事 AI 记忆 世纪三部曲 上帝的梦
一些实用的 bash 代码片段
2020-05-28 · via PixelNest

前阵子写了不少 bash 脚本,有些代码片段值得一记。有以下几项内容:

  • 获取当前脚本文件所在路径
  • 字符串 startsWith 和 endsWith
  • 判断字符串内容是否是数字
  • 获取字符串的子串
  • if 语句的几个判断条件

获取当前脚本文件所在的路径

用户执行脚本时,用户所在的目录,也就是 current working directory,可以通过执行 pwd 或者 bash 的内置变量 $PWD 获取。

有时用户执行脚本时,需要拿到脚本文件本身的路径,就稍微麻烦一些。

CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"

字符串 startsWith 和 endsWith

使用 * 号来实现这两个小功能。

如下,判断是否以 sub_string 开头。

if [[ $var == sub_string* ]]; then
    printf '%s\n' "var starts with sub_string."
fi
if [[ $var != sub_string* ]]; then
    printf '%s\n' "var does not start with sub_string."
fi

判断是否以 sub_string 结尾

if [[ $var == *sub_string ]]; then
    printf '%s\n' "var ends with sub_string."
fi
if [[ $var != *sub_string ]]; then
    printf '%s\n' "var does not end with sub_string."
fi

isNumber

判断字符串的内容是否是个数字,比如 "1234" 为真,"abcd""12abcd" 为假。

isNumber() {
  local str="$1"
  local re="^[0-9]+$"
  [[ "$str" =~ $re ]]
}

使用 isNumber 的例子:

#!/bin/bash
isNumber() {
  local str="$1"
  local re="^[0-9]+$"
  [[ "$str" =~ $re ]]
}
tests() {
  isNumber "$1" && echo "yes" || echo "no"
}
tests ""
tests "abc"
tests "abc123"
tests "1acb23"
tests "123"
tests "455"

输出结果:

no no no no yes yes

如果要允许带小数点的格式,那么要把上述代码中的正则表达式换成 ^[0-9]+([.][0-9]+)?$

Stackoverflow – How do I test if a variable is a number in Bash?

获取字符串的子串

有很多方法可以做字符串分割,比如用 cut 命令,awk 命令等等。这里记录的是我一直记不住的一个代码片段。

比如一个字符串变量是 var=hello.world-1234.txt,我们想要根据字符串中的点和横线来分割,获取子字符串。

${var#pattern} 从字符串开始位置,去除最短匹配 pattern 的部分。例如 ${var#*.},pattern 中的星号是通配符,结果就是匹配到第一个 . 之前的部分被去掉,获取到的字符串是 world-1234.txt

${var##pattern} 从字符串开始位置,去除最长匹配 pattern 的部分。
${var%pattern} 从字符串结尾位置,去除最短匹配 pattern 的部分。
${var%%pattern} 从字符串结尾位置,去除最长匹配 pattern 的部分。

var=hello.world-1234.txt
echo "${var#*.}"
echo "${var##*.}"
echo "${var%.*}"
echo "${var%%.*}"

结果是

world-1234.txt     // 从前向后截掉最短匹配 *. 的子串
txt                // 从前向后截掉最长匹配 *. 的字串
hello.world-1234   // 从后向前截掉最短匹配 .* 的内容
hello              // 从后向前截掉最长匹配 .* 的内容

如果想把 hello.world 截取出来,可以用 ${var%-*}。由于 var 里只有一个 -,所以从前往后或者从后往前,找到的都是一个位置,${var%%-*} 同样得到 hello.world

if 判断条件

-e 文件是否存在(万物皆文件)
-d 是否是目录并且存在
-s 文件是否存在并且大小不为 0
-f 文件是否存在并且是普通文件
-h 文件是否存在并且是符号链接
-L 文件是否存在并且是符号链接
-z 字符串长度是否为 0
-n 字符串长度是否不为 0

要注意以下几点:

  • 不论是普通文件,软链接,目录,块设备等等,都是「文件」,-e 测试都为真。
  • -f 测试一个普通文件,或者一个软链接,结果都为真。要确定是否是软链接,用 -h-L