学习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 』这东 ...
随机推荐
- android 开发小记
1.fragment & activity when config changes, activity will restart but fragment can be store. 2.te ...
- 高质量c/c++里的strcpy()
已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数. ...
- sql2008备份集中的数据库备份与现有的xxx数据库不同解决方法
原文链接:http://wncbl.cn/posts/1993c22/ 问题描述 今天在配置一个 ASP 站点时,导入以前的数据库备份文件,提示:sql2008备份集中的数据库备份与现有的xxx数据库 ...
- 魔改——MFC SDI程序 转换为 MDI程序
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 打造属于自己的vim利器
毋庸置疑vim很强大,然而没有插件的话对于大多数人来说他的界面是很不友好的.下面简单写一下我对vim的配置 这是我的vim配置,装的插件不是很多,对我来说已经够用.左边的侧边栏是NERD插件提供的,还 ...
- git一些常用设置
用法:git config [选项] 配置文件位置 --global 使用全局配置文件 --system 使用系统级配置文件 -- ...
- html5实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...
- 原创翻译-值得关注的10个python语言博客
原文链接 原文链接的网页感觉网络不是很好,不容易上.我在这里就给大家做个翻译吧. 大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建 ...
- JMeter学习(十四)JMeter监控Tomcat性能
使用jmeter的tomcat监视器功能,可以通过向tomcat的status页面发送get请求,得到资源使用信息,然后转换为只直观的图像方式,这样的话,就可以监视到服务器的资源使用情况,不过需要注意 ...
- ArcGIS Engine 中 Geometric Network 显示流向代码
原文地址:http://hi.baidu.com/steeeeps/item/165fbc15475e94741009b5b3 非常感谢作者. 以前学习几何网络时,对效用网络流向进行了总结,原理与效果 ...