学习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 』这东 ...
随机推荐
- ASP.NET MVC 在WebService中Token的使用方法
最近发现公司接口的验密方式很简单,就是简单的用户名密码校验.客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个Demo以供大家学习参考: 接口:WebService 方式:Toke ...
- PS网页设计教程XXIV——从头设计一个漂亮的网站
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- mongo学习笔记(六):linux上搭建
linux分以下几台 monogos mongocfg mongod1 mongod2 1.用ssh把 mongodb-linux-x86_64-3.0.6.tgz 移到linux /root上 2. ...
- JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型
/// <summary> /// 过滤特殊字符 /// </summary> private static string String2Json(String s) { St ...
- 最完整PHP.INI中文版
;;;;;;;;;;;;;;;;;;; 关于php.ini ;;;;;;;;;;;;;;;;;;;; 这个文件必须命名为'php.ini'并放置在httpd.conf中PHPINIDir指令指定的目录 ...
- grub条目示例
https://wiki.archlinux.org/index.php/GRUB#Install_to_disk /boot/grub/menu.lst default=0 timeout=5 ti ...
- hdu 2089 不要62--数位dp入门
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- Python 元组知识点
1.元组是一个有序的集合,2.元组和列表一样可以使用索引.切片来取值.3.创建元组后不能在原地进行修改替换等操作.4.元组支持嵌套,可以包含列表.字典和不同元组.5.元组支持一般序列的操作,例如:+. ...
- Vrrp协议
一.简介 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...
- css shorthand属性简写
一.什么是shorthand 属性简写(shorthand)就是一次性声明一组相关的属性.好处呢当然是众所周知的,让css从臃肿无序升级为简洁有效具有高可读性. 大多数的人都使用属性简写,我也用,但是 ...