Bash
- 配置
- .inputrc
- .bashrc - 交互 shell
- .profile, .bash_profile - 登陆 shell
- 参考
# empty shell
env -i bash
# empty env
env -i HOME="$HOME" bash -c 'env'
# login shell
time env -i HOME="$HOME" LOG4BASH_LOG_LEVE=DEBUG /usr/local/bin/bash -l -c 'env'
flag | for |
---|---|
-c COMMAND | command string |
-i | interactive |
-l | login shell |
-r | restricted |
-s | stdin |
# 传递 flag 给 stdin 脚本
curl http://sh | bash -s -- -flag
语法
[
= test[[
- shell 内置语法 - 速度更快一点点- 支持
&&
,||
语法
- 支持
{}
- 展开${var}
${var:=default}
${var/find/replace}
${var%remove}
{000..2}
- 序列展开{000..2..2}
- 带 step 参数echo x{,A,B,C}
- 组合展开{ echo 1; echo 2; }
- 命令序列
(())
- 算术操作()
- subshell, array
# for 循环
# ===========
# bash 语法
for ((i = 0; i < 3; i++)); do echo $i; done
# bash 展开序列
for i in {0..2}; do echo $i; done
# 使用 seq 生成序列 - ash 支持
for i in $(seq 0 2); do echo $i; done
for i in $(seq 0 $((3 - 1))); do echo $i; done
set
| set | set -o |
| --- | ----------- | -------------------------------------- |
| a | allexport | export 所有变量 |
| E | errtrace | 继承 ERR trap |
| e | errexit | 命令失败(返回非 0)则退出脚本 |
| u | nounset | 要求变量 unset |
| x | xtrace | trace - 回显执行的内容, 输出前缀为 PS4 |
| B | braceexpand | 展开 {
|
| T | functrace |
| h | hashall |
| H | histexpand |
| | pipefail | pipe 失败也退出 |
| | posix | Bash 符合 POSIX 标准 |
| t | onecmd | 执行一条命令后便退出 |
| v | verbose |
# 推荐
set -Eeuo pipefail
- trap ERR 可处理 -e 退出
- set
shopt
- Bash 扩展选项
shopt [-pqsu] [-o] [optname …]
shopt -s extglob # 开启
shopt -u extglob # 关闭
shopt -q extglob # 使用 exit code 表示是否开启
shopt extglob # 当前状态
shopt # 全部状态
shopt -o nolog # 限定内置 set 支持选项而非扩展选项
# 所有 on 的选项
shopt | grep "on$" | grep -o '^\S\+'
# 推荐
shopt -s autocd cdspell extglob globstar
# 默认开启选项
shopt -s checkwinsize cmdhist expand_aliases extquote force_fignore hostcomplete interactive_comments progcomp promptvars sourcepath
- globstar -
**
会匹配当前而不只是子目录# 会匹配 Makefile
ls **/Makefile - extglob - 扩展 glob 语法
[?*+@!](pattern-list)
!
排除@
匹配 1 个
- Pattern Matching
# 复制 scripts 下的 Makefile 到所有其他 Makefile
ls !(scripts)/**/Makefile | xargs -n 1 cp scripts/stub/Makefile - nocaseglob - glob 大小写不敏感
- histappend - 追加到历史文件而不是重写
- cdspell - 使用 cd 时自动校正书写
cd ignorad # 会 cd 到存在的 ignored 目录 - a -> e
- autocd - 输入目录自动切换到目录
- failglob - glob 匹配不到文件时出错而非 直接输出相同字符
环境变量
env | default | description |
---|---|---|
EPOCHSECONDS | ||
EPOCHREALTIME | ||
BASH_ARGV0 |
echo $EPOCHSECONDS
.inputrc
C-x C-r is bound to re-read-init-file.
https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File.html
https://www.gnu.org/software/bash/manual/bashref.html#Miscellaneous-Commands
# Make Tab autocomplete regardless of filename case
set completion-ignore-case on
# List all matches in case multiple possible completions are possible
set show-all-if-ambiguous on
# Immediately add a trailing slash when autocompleting symlinks to directories
set mark-symlinked-directories on
# Use the text that has already been typed as the prefix for searching through
# commands (i.e. more intelligent Up/Down behavior)
"\eOA": history-search-backward
"\e[A": history-search-backward
"\eOB": history-search-forward
"\e[B": history-search-forward
FAQ
Prefix/Suffix
# 去除前缀和后缀
x="/foo/fizzbuzz.bar"
y=${x%.bar}
echo ${y##*/}
#> fizzbuzz
# 去除后缀
x="/foo/fizzbuzz.bar.quux"
y=${x%.*}
echo $y
#> /foo/fizzbuzz.bar
y=${x%%.*}
echo $y
#> /foo/fizzbuzz
# 去除前缀
x=/foo/bar/bim/baz/file.gif
y=${path##*/}
echo $y
#> file.gif
替换
a=abc/da
# zbc/da
echo ${a/a/z}
# // 是所有
# zbc/dz
echo ${a//a/z}
# 转意
# abczda
echo ${a//\//z}