《Linux Shell脚本攻略》是一本适合初学者系统学习Bash Shell的书籍,墙裂推荐。以下是我阅读这本书的笔记,希望对读者有用。
- 输出颜色字符
echo -e "\e[1:41m" # 1表示背景色
- echo打印!需转义
echo "hello, bash!" # 报错,因为!在shell中属于特殊字符,需要转义 echo "hello, bash\!" # 不报错,!已转义 echo 'hello, bash!' # 不报错,在单引号中!无需转移
- printf可用于格式化输出
# 用法类似C中的`printf` printf "format" var1 var2 ...
- echo常用选项
echo -n # 不在字符串末尾添加换行符 echo -e # 支持转义字符表示 echo -e "\e[id XXXXXX" # 显示颜色字体,其中id表示背景颜色id
- pgrep
# 根据进程名获取进程id pgrep <进程名> # 相当于ps -ef cat /proc/$PID/environ # 查看进程运行过程中的环境变量
- 用(())进行算数运算
# 计算两个数之和,有以下两种写法: c=$((a+b)) # 赋值方式1 ((c = a+b)) # 赋值方式2
- 输出重定向
# 将标准输出和标准错误输出重定向到run.log中 ./binary >run.log 2>&1 # 更简洁的写法:注意&和>之间不能有空格 sh mybash.sh &>run.log
- 用exec创建文件描述符
exec 4 < log.txt exec 5 > log.txt exec 6 >> log.txt
- 哈希数组
# 声明 declare -a map # 定义 ${map[key]}=value # 获取所有key ${!map[@]} declare -a HTTP_RESPONSE=( [200]="OK" [400]="Bad Request" [403]="Forbidden" [404]="Not Found" [405]="Method Not Allowed" [500]="Internal Server Error" )
- date获取时间
# 显示秒数 date +%s # 将秒数转成字符串 date -d @秒数
11 tput控制终端光标
# 设置光标位置 tput cup 行号 列号 # 保存光标位置 tput sc # 回到保存的光标位置 tput rc # 清除当前光标到行尾 tput ed
- read读取标准输入
# 设置不回显 read -s # 设置超时时间 read -t # 设置读入字节数 read -n 字节数 # 设置提示 read -p "please input passwd"
- cat显示文件内容
# 显示时忽略多余的空行 cat -s file # 显示每一行的行号 cat -n file # 打印出制表符 cat -T file
- 用find进行文件搜索
# 打印符合搜索条件的文件或目录 find <path> -name XXX -print # 删除符合条件的文件或目录 find <path> -name XXX -exec rm -rf {} \;
- xargs:从标准输入拼装命令
# 常用用法 cat file | xargs # 设定每行的字段数 cat file | xargs -n 3 # 以null为换行符 cat file | xargs -0 # 代替命令中位置 cat file | xargs -I{} rm -rf {}
- tr: 替换或删除标准输入的字符
# 替换 tr 字符集1 字符集2 # 删除 tr -d 字符集 # 补集 tr -d -c 要留下的字符集 # 去除重复空格 tr -s " "
- md5sum: 对文件生成md5 checksum
# 生成md5值 md5sum file > file.md5 # 校验 md5sum -c file.md5
- sort: 对文件内容进行排序
# 按照字符串排序 cat file | sort #按照数字排序 cat file | sort -n # 逆序排序 cat file | sort -r # 按照某列排序 cat file | sort -k 列数
- dd:复制并转换文件
# 从/dev/zero生成文件 dd if=/dev/zero of=data.file bs=100k count=1
- split:分割大文件
# 将文件分成大小为10k的小文件,且小文件命名中后缀长度为3 split data.file -b 10k -a 3
- 字符串分割
# 获取文件后缀 echo ${filename##*.} # 获取文件名 echo ${filename%.*}
- 单词表
cat /usr/share/dict/words
- expect: 自动化交互式输入
# expect spawn ./interactive.sh expect "Password:" send "XXX\n"
- comm: 求两个文件的交集/差集/并集
# 求差集a-b comm a.txt b.txt -1 # 求a+b并集 comm a.txt b.txt # 求ab交集 comm a.txt b.txt -1 -2
- chattr: 修改文件属性
# 将文件设置为不可修改 chattr +i file # 去除不可修改属性 chattr -i file
- 寻找软连接
# 方法一 ll -rt | grep -P "^l" | awk '{print $8}' # 方法二 find . -type l
- diff: 比对两个文件(或目录)
diff -abru 1.txt 2.txt diff -abru 1.txt 2.txt > 12.patch
- patch: 对文件打补丁
patch -p1 1.txt < 12.patch
- 命令行当前目录管理
# pushd: 将当前目录压入栈中 # popd: 从栈中弹出目录,并作为当前目录 # dirs: 显示栈中目录 # 常规用法 pushd directory popd # 指定目录 dirs pushd +N popd +N
- grep: 搜索文件内容
# 匹配内容显示颜色 grep --color=auto # 统计匹配行数 grep -c # 显示匹配行号 grep -n # 显示匹配字符偏移量 grep -o -b # 显示匹配文件列表 grep -l 1.txt 2.txt # 使用文件匹配 grep -f pattern.txt file.txt # 静默模式 grep -q # 定位代码 grep -R -n # 忽略大小写 grep -i # 匹配多个样式 grep -e pattern1 -e pattern2 # 显示匹配行之前N行 grep -A # 显示匹配行之后N行 grep -B # 显示匹配行之前之后N行 grep -C
- sed: 文本过滤和转换工具
# sed "s///" 替换 echo "hello wolrd" | sed "s/hello/goodbye/" # sed -i 替换文件内容 sed -i 's/hello/goodbye/' 1.txt # sed 's///g' 替换所有匹配内容 echo "thisthisthisthis" | sed 's/this/THIS/g' # sed 's///ng' 从第n处匹配开始替换 echo "thisthisthisthis" | sed 's/this/THIS/2g' # sed '//d' 删除匹配行 cat diff.sh | sed '/^$/d' # 匹配字符串标记 echo this is an example | sed 's/\w\+/[&]/g' # 捕捉字符串 echo "this is a digit 7 in a numbger" | sed 's/digit \([0-9]\)/\1/'
- paste: 合并文件
# 按列合并文件 paste file1 file2 paste file1 file2 -d ","
- rev: 字符串逆序输出
echo "1234" | rev
- tac: 对多行文件逆序输出
# 行逆序 seq 1 10 | tac
- 设置命令行编辑模式
set -o vi