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

推荐订阅源

Cyberwarzone
Cyberwarzone
Recent Announcements
Recent Announcements
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 聂微东
博客园 - 【当耐特】
aimingoo的专栏
aimingoo的专栏
N
Netflix TechBlog - Medium
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
L
LangChain Blog
The Cloudflare Blog
Y
Y Combinator Blog
AI
AI
P
Palo Alto Networks Blog
美团技术团队
有赞技术团队
有赞技术团队
I
Intezer
Last Week in AI
Last Week in AI
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
NISL@THU
NISL@THU
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
S
Schneier on Security
IT之家
IT之家
博客园 - 司徒正美
A
Arctic Wolf
罗磊的独立博客
雷峰网
雷峰网
Vercel News
Vercel News
SecWiki News
SecWiki News
AWS News Blog
AWS News Blog
GbyAI
GbyAI
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tor Project blog
V
Vulnerabilities – Threatpost
Hugging Face - Blog
Hugging Face - Blog
H
Heimdal Security Blog
Schneier on Security
Schneier on Security
H
Help Net Security
T
Troy Hunt's Blog
N
News and Events Feed by Topic
爱范儿
爱范儿
V2EX - 技术
V2EX - 技术
Project Zero
Project Zero
T
The Exploit Database - CXSecurity.com

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