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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
GRAHAM CLULEY
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Last Watchdog
The Last Watchdog
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
L
LINUX DO - 最新话题
腾讯CDC
博客园 - 三生石上(FineUI控件)
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
博客园 - 叶小钗
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Webroot Blog
Webroot Blog
Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
S
Schneier on Security
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Hacker News: Ask HN
Hacker News: Ask HN
T
Tenable Blog
V
V2EX
J
Java Code Geeks
AWS News Blog
AWS News Blog
博客园 - 司徒正美
V
Visual Studio Blog
T
The Exploit Database - CXSecurity.com
H
Hacker News: Front Page
Security Latest
Security Latest
月光博客
月光博客
The Hacker News
The Hacker News
T
Tor Project blog
Project Zero
Project Zero
P
Privacy & Cybersecurity Law 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