Bash Shell 基础

大纲

  • 开始
  • 命令
  • 变量
  • 复合命令
  • Shell扩展
  • 标准输入/输出/错误
  • 常用命令
  • sed, awk
  • 扩展阅读

开始

  • ~/.bash_profile ~/.bash_logout ~/.bashrc
  • $PATH
  • which

获取帮助

  • xxx --help
  • man xxx
  • info xxx
  • man bash man info

命令

  • 名称 参数
  • [time] 命令1 [| 命令2 ..]
  • 返回值 0正确 其他错误
  • 0是true, 其他false

变量1

  1. x="f e n g" (=号两边没有空白,为什么?)
  2. echo $x
  3. echo "$x"
  4. echo '$x'
  5. echo \$x
  6. echo "\$x"
  7. echo '\$x'

变量2

  1. x="weifeng"
  2. echo ${x}
  3. echo ${#x}
  4. echo ${x##*e}
  5. echo ${x#*e}
  6. echo ${x%%e*}
  7. echo ${x%e*}
  8. echo ${x:3}
  9. echo ${x:3:2}
  10. echo ${x/wei/i am wei}

复合命令

  • 循环
  • 条件结构
  • 命令组合
  • 命令队列

循环

语法:

  1. until 测试命令; do 命令块; done
  2. while 测试命令; do 命令块; done
  3. for 变量 [in 单词]; do 命令块; done
  4. for ((表达式1; 表达式2; 表达式3)); do 命令块; done

示例:

  1. while read line; do
  2. echo $line
  3. done < file
  4. for name in `ls`; do
  5. echo $name
  6. done

条件控制1

语法:

  1. if 测试命令一 ; then
  2. 命令块1;
  3. [elif 测试命令二 ; then
  4. 命令块2;] ..
  5. [else
  6. 命令块3; ]
  7. fi
  8. case 单词 in
  9. (模式一 | 模式二 ...)
  10. 命令块;;
  11. esac
  12. select 名称 [in 单词表]; do 命令块; done

条件控制2

示例:

如果脚本存在且可执行则执行:

  1. if [ -x "~/feng.sh" ]
  2. then
  3. . ~/feng.sh
  4. fi

case:

  1. echo -n "输入动物名称:"
  2. read name
  3. case $name in
  4. (dog | pig) echo -n "4";;
  5. children) echo -n "2";;
  6. *) echo -n "不知道多少";;
  7. esac
  8. echo "条腿"

select:

  1. user="fengweifeng"
  2. select host in {fe,fedev}.baidu.com
  3. do
  4. echo "ssh $user@$host"
  5. break;
  6. done
  7. ssh $user@$host

命令队列

  1. 命令1 && 命令2
  2. 命令1 || 命令2

函数

  1. function fn1
  2. {
  3. echo '--fn1 start'
  4. echo '$0' $0 # 脚本名
  5. echo '$#' $# # 参数个数
  6. echo '$*' $* # 参数列表
  7. echo '$@' $@
  8. echo '--fn end'
  9. }
  10. echo '$_' $_ # 启动shell的路径
  11. echo '$*' $* # 命令行的参数
  12. echo '$$' $$ # 进程号
  13. fn1 1 2 3 4 a b c d # 函数调用
  14. echo '$?' $? # 函数返回值
  15. sleep 100

Shell扩展

  • 大括号扩展 echo a{x,y,z}b
  • 波浪号扩展 echo ~ ~+ ~-
  • 参数和变量扩展 ${filename/.sh/.bash}
  • 命令替换 sort $(ls) 或者用反引号
  • 算术扩展 $(( 表达式 ))
  • 单词拆分
  • 文件名扩展 * ? [...]

标准输入/输出/错误

  • /dev/stdin 描述符0
  • /dev/stdout 描述符1
  • /dev/stderr 描述符2

重定向

  1. touch x
  2. chomod 000 x
  3. cat x > y 2>&1
  4. cat x 2>&1 > y

&>x >&x >x 2>&1 等价


常用命令

  • ls, cd, cp, rm, mv, diff, colordiff, ln, pwd, mkdir, rmdir, cat
  • find, locate
  • grep, sed, awk
  • more, less, tail, head, wc, sort, uniq, xargs
  • date, df, free, du, top, vmstat, ps, pstree, kill, nestat, ssh, scp
  • su, who, whoami
  • wget, curl, crontab, jobs, fg, bg
  • expect

sed, awk

都是文本处理的神级软件, 一般简易文本处理两者都可以胜任,awk对于多列数据/复杂场景更具优势.

参考文档:


示例

  • 查找替换线下地址(sed)
  • 快速添加到svn(svn+awk)
  • 查找文件并进行操作(find)
  • 日志过滤(tail+grep)
  • 定时同步模板(crontab+except+ssh+scp)

延伸阅读