学习bash
工作8年,前6年基本是Windows环境下,也就是个鼠标党;两年前换工作开始用linux,也就开始了领略了命令行的强大,无论是直接在命令行组合命令,也还写几行简单的shell脚本,其能完成的功能往往令人难以置信。
- 关于命令行强大的一个例子:csdn泄露的10个最常用的密码 awk '{print $3}' www.csdn.net.sql |sort |uniq -c |sort -nr |head (陈硕同学写的)
- 关于脚本强大的一个例子:提高分布式环境中程序启动性能的一个方法
如果说我工作中第一次感觉“哇”是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)等表示数字测试。 - [[ 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; }
if后测试的表达式可以有三种:
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
wccut
top
free
vim
p4
perl -pei
学习bash的更多相关文章
- 第十一章、认识与学习BASH
第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...
- 第十一章、认识与学习 BASH
第十一章.认识与学习 BASH 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 shell 与 /etc/shel ...
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- 认识与学习BASH①——鸟叔的Linux私房菜
文章目录 认识与学习BASH① 认识BASH 壳程序 多种shells Bash shell 的功能 type :查询指令是否为Bash shell 的内置指令 指令的换行输入和快速删除 Shell的 ...
- 快速学习Bash
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. Shell是Linux下经典的文本互动方式,而Bash是现在最常用的一种Shell.我在这里总结了Bash ...
- Linux学习笔记之认识与学习Bash
什么是shell:shell是一个翻译器,将所敲的命令翻译成CPU能理解的语言,之后CPU再去执行,CPU执行后返回给shell,shell再翻译成我们所能理解的语言并显示:终端并不是shell,而是 ...
- 认识和学习BASH alias 给长命令起别名 unalias 取消该别名
此图反映了shell所在的位置与作用. 既然Shell与KDE和application等都是用户与Kernel的接口,那为什么还要学习呢?书中也给出了答案. 通用性,可以这样理解,也就是所谓的跨平台机 ...
- 【CentOS】学习Bash
一.特性 命令历史 history , !! , !$ , !字符 , !n (n为第几条命令) Tab可以补全文件路径或者命令 alias a="b", unalias a ...
- 认识与学习 BASH
2015-08-03摘自鸟哥 什么是变量? 那么,什么是『变量』呢?简单的说,就是让某一个特定字符串代表不固定的内容就是了.举个大家在国中都会学到的数学例子, 那就是:『 y = ax + b 』这东 ...
随机推荐
- navicat 连接sqlserver提示要安装 sql server native client
navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!
- 数据库相关 sql 语句
1.操作某数据库 use 数据库名称,然后可以操作该数据库下的某张表 2.$res=mysql_query($sql); 该语句如果用在封装的函数体里,则不用传入第二个参数$conn来指定连接,这样才 ...
- ajax回调中的this.href不执行跳转的解决办法
1. 问题背景 如下所示代码: $.post("/ems/register",indata, function(data){ if(data != null && ...
- 简单谈谈RAID
RAID是“Redundant Array of Independent Disk”的缩写,翻译过来叫做独立磁盘的冗余阵列,其实就是磁盘的存储.访问.备份技术.在谈RAID之前,先简单学习一下存储器的 ...
- Windows Live Writer离线编写博客
WLW最新版本为2012,官网下载 Windows Live Writer配置步骤 使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 L ...
- jdk环境搭建
win7+jdk环境变量配置 进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:1.下载jdk(http://java.sun.com/javase/downloads/inde ...
- C++ 基本知识
无论父类与子类的析构函数是否是virutal,子类的析构函数都会调用父类的析构函数 调用构造函数是与构造函数顺序相反,先子类后基类,否则如果基类先析构,子类的有些资源已经不存在了,会出错. 在C++中 ...
- LeetCode题解-----Majority Element II 摩尔投票法
题目描述: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The a ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- HDU 4941 Magical Forest --STL Map应用
题意: 有n*m个格子(n,m <= 2*10^9),有k(k<=10^5)个格子中有值,现在有三种操作,第一种为交换两行,第二种为交换两列,交换时只有两行或两列都有格子有值或都没有格子有 ...