工作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. 【转载】主数据管理(MDM)与元数据管理

    主数据(Master Data)和元数据(Meta Data)是两个完全不同的概念.元数据是指表示数据的相关信息,比如数据定义等,而主数据是指实例数据,比如产品目录信息等.比如,某省地税开发了一套 征 ...

  2. PowerVault TL4000 Tape Library 告警:“Media Attention”

      Dell PowerVault TL4000 磁带库机的指示灯告警,从Web管理平台登录后,在菜单"Library Status"下发现如下告警信息:  Library Sta ...

  3. mac:ssh登陆总是需要输入钥匙串密码解决

    方法1: finder -> 左上角:前往->按住option建->多出一个资源->KeyChains->第一个文件夹(删除掉次文件夹) 然后重启即可 方法2: ssh- ...

  4. windows 下安装nginx

    1.首先去官网下载 nginxWindows版本,官网下载:http://nginx.org/en/download.html 选择最新版本,下载到软件包后,解压文件包到指定目录,例如我的目录是D:\ ...

  5. HTML5 datalist 标签

    以前需要用JS写一个自动完成组件(Suggest),很费劲.HTML5时代则不用了,直接使用datalist标签,直接减少了工作量.如下 <!DOCTYPE html> <html& ...

  6. ZOJ 3865 Superbot(优先队列--模板)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需 ...

  7. Mongodb 字段类型转换

    db.diningmembers.find({modifedDate:{$type:9}}).forEach(function(x){x.tel = String(x.tel);db.diningme ...

  8. Android之数据存储----使用LoaderManager异步加载数据库

    一.各种概念: 1.Loaders: 适用于Android3.0以及更高的版本,它提供了一套在UI的主线程中异步加载数据的框架.使用Loaders可以非常简单的在Activity或者Fragment中 ...

  9. Unity2D Sprite Packer用法介绍

    想充分利用图片空间? 我们用来做sprite的图片通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了. 如果想避免这些资源上的浪费,我们可以把各个sprite做成图 ...

  10. Linux环境安装Jenkins

    安装环境: CenOS 6.4 JDK_1.6.0_23 一.安装前检查环境 检查是否安装JDK: java --version 二.安装Jenkins 1. 添加Jenkins的源(reposito ...