工作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. 响应式Web设计 – 布局

    写在前面 去年上半年,我开始着手推动项目中响应式设计的落地.以官网优化需求为契机,主动去做了响应式的页面设计,也说服了产品.设计和开发的相关同事一起把它上线落实,但不幸的是,由于各种方面的原因,比如, ...

  2. 【MySQL】MySQL忘记root密码解决方案

    转眼间从实习到现在已经快两年了.两年的工作做遇到过很多很多的拦路虎,大部分也通过搜索引擎找到了解决的方案.奈何大脑不是硬盘,偶尔有的问题第二次遇到还是有点抓蒙...所以决定把这些东西记录在博客上.这样 ...

  3. 获取微信openID 的步骤

    获取微信openid的步骤:1.进入-->判断openID是否为空: 空-->$url=urlencode("http://xxx/xxx.php");//回调链接 $ ...

  4. PHP笔记(PHP高级篇)

    高级篇中将涉及数据库的使用以及Cookie和Session会话,提高PHP的开发效率和运行效率 PHP程序员需要掌握的MySQL操作 为项目设计表 使用SQL语句 MySQL的目录结构 data目录中 ...

  5. ASP.NET5 MVC6入门教学之一(自己动手)

    等待微软开源大动作已经好几年了,终于ASP.NET 5发布了.今天给新手们写一个简单地教程,教你认识一下ASP.NET5 MVC6 1.安装kvm 首先,你需要以管理员权限打开cmd,执行如下的脚本: ...

  6. nginx 做负载均衡

    最近正在研究Nginx,Nginx作为反向代理服务器,可以对Web服务器提供加速,并且具有负载均衡的功能. 首先我要在官网下载Nginx(http://nginx.org/en/download.ht ...

  7. 堆栈 & Stack and Heap

    What's the difference between a stack and a heap? The differences between the stack and the heap can ...

  8. C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度

    在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了: 如何求数组长度? 如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有 ...

  9. ZooKeeper系列4:ZooKeeper API简介及编程

    问题导读: 1.ZooKeeper API 共包含几个包? 2.如何使用ZooKeeper API 创建zookeeper应用程序? 1)ZooKeeper API 简介   ZooKeeper AP ...

  10. 边工作边刷题:70天一遍leetcode: day 71-3

    Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...