工作8年,前6年基本是Windows环境下,也就是个鼠标党;两年前换工作开始用linux,也就开始了领略了命令行的强大,无论是直接在命令行组合命令,也还写几行简单的shell脚本,其能完成的功能往往令人难以置信。

如果说我工作中第一次感觉“哇”是08年左右开始使用perl处理文本 - 发现脚本原来可以如此强大,自动化那么多工作;那么第二次就应当是使用bash - 原来不用写脚本也能如此强大。(尤其对原Windows下鼠标+菜单党来讲)

这两天比较系统的看了下bash reference manual,记录一下。

一、命令行交互

这里包括两个部分,一个是readline支持的命令行编辑功能,有不同的编辑style:emacs和vi模式:

  • set -o emacs
  • set -o vi

用vi模式的话,使用vi一些常用的命令,编辑起来自然方便,但是需要先escape一下进入操作模式。但是对于平时99%的工作,一些常用的快捷键已经足够满足了:

  • C-a, C-e:移动到行首,行尾
  • Alt->, Alt-<-:前移,后移一个单词 (最好自己定义成右alt,额,好像是我的右alt键坏掉了。。。)
  • C-b, C-f:前移,后移一个字符
  • C-l:清空屏幕
  • C-w:删除前一个单词
  • Alt-d:删除后一个单词
  • C-d:删除当前字符
  • C-y:粘贴前次删除内容

这些快快捷键是readline的默认定义,一般在/etc/inputrc可以找到系统全局定义,然后个人可以定义:~/.inputrc

另一部分是历史管理,下面是一些要点:

  • 控制历史的一些变量:HISTSIZE,HISTFILE,HISTFILESIZE
  • 设置HISTTIMEFORMAT='%F %T '在历史中显示命令运行时间
  • C-r:查找历史并运行
  • history expansion
    • !! - 上一条命令
    • !preceding - 上一条以preceding开始的命令
    • !$ - 上一个命令的最后一个参数
    • !n - 第n个命令
    • !-n - 倒数第n个命令

二、语法

1. 五种quoting

  • \A:转义,保持字符原意,如果在行末,则表示续行
  • 'string':single quoted string,不进行转义,变量expansion
  • “string”:double quoted string,进行转义,变量expansion
  • $'string':访问一些特殊字符,如$'\a', $'\n'
  • $"string":locale specific translation, translated according to the current locale

2. 注释

以#开头的行均为注释,除了第一行:

#!/bin/bash

3. 控制结构

  • 简单命令:cmd
  • pipeline: cmd1 | cmd2
  • 命令序列:
    • cmd1; cmd2: 顺序执行两条命令
    • cmd1& cmd2:并行执行两条命令,其中cmd1在后台执行
    • cmd1 && cmd2: 如果cmd1成功了,执行cmd2
    • cmd1 || cmd2:如果cmd1失败了,执行cmd2
  • 循环控制
    • until test-commands; do consequent-commands; done
    • while test-commands; do consequent-commands; done
    • for name [ [in [words …] ] ; ] do commands; done
    • for (( expr1 ; expr2 ; expr3 )) ; do commands ; done - 例子:for ((i=1; $i < 100; i++)); do echo $i; done
  • 条件控制
    • if
      if的测试表达式有三种情况:-x表示文件或者变量测试;(==, !=, >, <)表示字符串测试;(-gt, -lt, -eq, -ne, -ge)等表示数字测试。
    • if后测试的表达式可以有三种:

      • [[ expression ]]
      • [ expression ]
      • test expression
    • if test-commands; then
      consequent-commands;
      [elif more-test-commands; then
      more-consequents;]
      [else alternate-consequents;]
      fi
    • case
      case word in [ [(] pattern [| pattern]…) command-list ;;]… esac
      
      echo -n "Enter the name of an animal: "
      read ANIMAL
      echo -n "The $ANIMAL has "
      case $ANIMAL in
      horse | dog | cat) echo -n "four";;
      man | kangaroo ) echo -n "two";;
      *) echo -n "an unknown number of";;
      esac
      echo " legs."
    • select
      select name [in words …]; do commands; done
      
      select fname in *;
      do
      echo you picked $fname \($REPLY\)
      break;
      done
  • 命令组合
    • 新起shell:( list )
    • 当前shell:{ list; }

4. 函数

语法
name () compound-command [ redirections ]
or
function name [()] compound-command [ redirections ] 定义
function reverse() {
echo $-$-$
} 调用
echo `reverse hello world thanks`

5. 参数

参数有脚本的参数、函数的参数,都是用$1-$9等来访问, $0表示脚本或者函数名字,这些叫做positional parameters,还有一些特殊的参数:$*, $@, $#, $?, $-等等

6. Shell expansion

  • brace expansion: echo a{b, c, d}e
  • tilde expansion: cd ~; cd ~user/bin
  • shell parameter expansion: ${parameter}, , ${parameter:-word}.${parameter:=word}
  • command expansion: $(cmd) or `cmd`
  • arithmetic expansion: $((1+2*6))
  • word splitting
  • filename expansion: *.txt
  • quote removal

7. Redirection

  • >: write stdout to file
  • >>: append stdout to file
  • &>: write stdout and stderr to file
  • &>>: append stdout and stderr to file
  • tee: ls | tee ls.txt

8. Variable & array

# variable
x=
echo $x #array:
arr[]=
echo ${arr[]} #associate array:
declare -A map
map[hello]=world
echo ${map[hello]}

三、内建命令与变量

builtin的命令,用help就可以全部打出来, 然后逐个help就可以看到大致介绍。

有两个主要的设置命令:

  • set
  • shopt

控制bash的各种行为模式。

但有个eval命令我有点搞不清楚:

$ help eval
eval: eval [arg ...]
Execute arguments as a shell command.

Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.

Exit Status:
Returns exit status of command or success if command is null.

这个,与没有eval,直接run命令有什么区别呢?搜了一下,发现这么个例子:

for i in   ; do
eval a$i=
eval echo "\$a$i"
done

动态组合变量名字并赋值,这个在shell里直接是做不到的。

另外,三类比较常用的命令:

  • 别名:alias, unalias
  • job控制:jobs, fg, bg, kill, C-z
  • 目录管理:dirs, popd, pushd

内置的变量,主要用来控制行为,或者暴露信息,臂长常用的有PATH, PS1, PS2, PWD, HOSTNAME, HISTFILE, IFS, CDPATH(这个貌似可以好好利用一下)

四、常用非内建命令

这里指的是非bash内置命令,但是linux内置的,或者另外安装的一些常用命令,非常有效,这里列几个自己用的比较多的:

du
df
strace
lsof
ps aux
netstat
grep
find
wget
curl
tr
ssh
sort
uniq
awk
wc

cut
top
free
vim
p4
perl -pei

学习bash的更多相关文章

  1. 第十一章、认识与学习BASH

    第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...

  2. 第十一章、认识与学习 BASH

    第十一章.认识与学习 BASH 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 shell 与 /etc/shel ...

  3. 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

    第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

  4. 认识与学习BASH①——鸟叔的Linux私房菜

    文章目录 认识与学习BASH① 认识BASH 壳程序 多种shells Bash shell 的功能 type :查询指令是否为Bash shell 的内置指令 指令的换行输入和快速删除 Shell的 ...

  5. 快速学习Bash

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. Shell是Linux下经典的文本互动方式,而Bash是现在最常用的一种Shell.我在这里总结了Bash ...

  6. Linux学习笔记之认识与学习Bash

    什么是shell:shell是一个翻译器,将所敲的命令翻译成CPU能理解的语言,之后CPU再去执行,CPU执行后返回给shell,shell再翻译成我们所能理解的语言并显示:终端并不是shell,而是 ...

  7. 认识和学习BASH alias 给长命令起别名 unalias 取消该别名

    此图反映了shell所在的位置与作用. 既然Shell与KDE和application等都是用户与Kernel的接口,那为什么还要学习呢?书中也给出了答案. 通用性,可以这样理解,也就是所谓的跨平台机 ...

  8. 【CentOS】学习Bash

    一.特性 命令历史  history , !! , !$ , !字符 , !n (n为第几条命令) Tab可以补全文件路径或者命令 alias a="b",  unalias a ...

  9. 认识与学习 BASH

    2015-08-03摘自鸟哥 什么是变量? 那么,什么是『变量』呢?简单的说,就是让某一个特定字符串代表不固定的内容就是了.举个大家在国中都会学到的数学例子, 那就是:『 y = ax + b 』这东 ...

随机推荐

  1. IPv4中IP地址分类

    分三个部分进行讲述: 1 五类IP 2 特殊用途的IP 3 私有IP 1 五类IP IPV4简单粗暴地把IP地址分为五类.分类方法如下图所示: 也就是说,分为以下几类: A: 0.0.0.0-127. ...

  2. python 把数据 json格式输出

    有个要求需要在python的标准输出时候显示json格式数据,如果缩进显示查看数据效果会很好,这里使用json的包会有很多操作 import json date = {u'versions': [{u ...

  3. MySql查询语句中解决“该列没有包含在聚合函数或者groupby子句中”的相关问题方法

    首先引入语句来源,表结构和数据如下: 需求是:查出员工(personname)在不同店铺(store)的总薪酬(salary),相同店铺输出store,不同店铺输出multi_store. 正确查询语 ...

  4. 【mysql】使用脚本对mysql状态进行监控

    1.mysqladmin 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如 ...

  5. 基于Cookie的SSO登录分析和实现

    什么是SSO? 现在很多大的互联网公司都会有很多的应用,比如以下是淘宝网的截图: 天猫 聚划算 头条等都是不同的应用,有的甚至采用完全不同的域名,但是所有在淘宝注册的用户都是使用的一套用户名和口令,如 ...

  6. FinanceJson

    FinanceJson, 对Json的包装.底层使用jackson实现. 1. 生成节点 (1)在某个路径下添加某个节点 FinanceJson financeJsonInfo = FinanceJs ...

  7. Mac SVN ignore 等相关

    OSX自带了SVN命令行,通过终端就可以使用了. 一.SVN ignore Mac的SVN想把node_modules 忽略,即svn status时(svn st缩写)不显示node_nodules ...

  8. [转载] Android Metro风格的Launcher开发系列第一篇

    前言:从毕业到现在已经三年多了,回忆一下这三年基本上没有写过博客,总是觉得忙,没时间写,也觉得写博客没什么大用.但是看到很多大牛们都在写博客,分享自己的东西,所以嘛本着向大牛看齐,分享第一,记录第二的 ...

  9. [转]angularjs 设置全局变量的3种方法

    本文转自:http://blog.51yip.com/jsjquery/1601.html angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是 ...

  10. function [ binary,decimal ] = num2binary16( number )

    function [ binary,decimal ] = num2binary16( number ) %The IEEE 754 standard specifies a binary16 as ...