shell使用攻略
shell 是什么
~ $ ls /bin/*sh
/bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh
是什么
- kernel shell
- 命令解释器,和 kernel 交互
- 命令语言、程序设计语言
特性
- 命令集
- 胶水语言
- 操作系统外壳接口
适合场景
- 自动化简单任务
- 快速、简单完成原型
劣势
- 移植性 grep --version wget--version
- 执行效率
- 组织性,结构性
- 不支持面向对象特性
shell 特性
wget uc.cn -O uc.html 2>/dev/null || echo "Failed to get url"
- 面向字符串
- 元字符(metacharacter,分割字符串)
space tab | < > & ( ) ; - 控制字符(control operator,分割命令)
|| & && ; ;; ( ) | |& <newline> - 转义
' "$ `` \
- 元字符(metacharacter,分割字符串)
var=3+5
echo '$$ `uname` $var $((var))'
echo "$$ \$ `uname` $var $((var))"
- 字符串展开
- 利用元字符分割字符串
- 如果字符串是用来给变量赋值,则不管它是否被双引号包围,都认为它被双引号包围
- 大括号展开{};波浪线展开、-/、~+/ (不被单引号和双引号包围)
- 参数和变量展开$USER $var $1 $@ $# ${var[i]} ${var:?value} ${var##value} ${var/pat/str};命令替换 ${cmd} `cmd`;算数展开 $((a+b)) (不被单引号包围)
- 单词分割;路径展开 (不被单引号和双引号包围)
- 去掉字符串外面的引号 (如需重复以上流程使用 eval 声明)
echo {a,b}cd{e,f} ~ ~-/ `uname` $(ls /bin/[kcz]sh) $$ `ls /bin/e*` /bin/?sh ${var} $(($var)) $#
字符串使用
- 命令
- 外部命令,命令名、选项、参数
ls -l /home - 内部命令,
break continue : . echo eval exec exit export expr printf return set shift trap unset
- 外部命令,命令名、选项、参数
- 表达式
((3+5))、[[ 4 > 5]] - 赋值
var=value
- 命令
常见语法
- 简单命令
cd ~ - 管道
uname |grep linux - 命令序列
; & || && - 复合命令
() {} (()) [[]]
- 简单命令
流程控制选择
if condition1; then
statements
elif condition2; then
statements
else
statements
fi
- 流程控制-循环
for var in one two three four five; do
echo '$var is '$var
done
while until case select
shell 实战
- 对文件进行按行处理
cat in.txt |while read url; do
echo "got $url"
done > out.txt
- 生成配置包
tar -zcvf update.`date '+%Y%m%d_%H%M%S'`.tar.gz somedir
- 生成模板文件(其他格式化文本)
cat <<EO > index.html
<html>
<head>
<title></title>
</head>
hello $USER
your computer's name `hostname`
</html>
EO
- 日志监控及定时处理
/usr/bin/find /home/dir -type f ! \( -name "*.bz2" -o -name "*.gz" \) -mmin +120 -exec bzip2 {} \; >/dev/null 2>&1
- 去除文件重复(保留文件原有顺序)
awk '!a[$0]++' in.txt > out.txt
- 从文件中提取指定的内容
grep -Phio "(?<=\`uri=)[^\`]+" *.log |sort |uniq
grep -Pio "(?<='customizable': ')[^',]+" *.log
`uri=http://13aaaa.com/html/PIC01/332190.html`wait=0.09`slow...
- 文件非交互式编辑
sed -i 's/dispatch_rule/dispatch_rule = /g' in.txt
- 计算
awk -F, '{sum+=$2} END{print sum}
- 条件运算 && 、 ||
ps -ef |grep start_all.py |grep -v grep && exit 2 || python start_all.py
- 变量替换、去除首尾字符
url='http://www_sina_com_cn/path/index.html'
echo ${url//_/.}
echo ${url#http://}
echo ${url%%/*}
- 循环
for i in $(seq -w 0 23); do
echo "log.8???_2014-10-15_$i"
done
- 查找
find . -type f |xargs -n 1000 grep -Pio -m 1 $key
find /nfs -size +10000k –xdev –exec ls –lh {} \;
find ~ -mtime +7 -name "*.log*" -exec rm -rf {} \;
- 文件权限控制
r4 w2 x1u(ser) g(roup) o(ther) a(ll)
chmod o+r filename
chmod 775 filename
chown user:user_group filename
shell的坑
- 命令的返回状态 0表示正常
if uname |grep -i linux; then
echo 'you are using linux'
fi
通配符扩展(和正则区别)
*?[set][^set]{ba,c,k,z,tc}sh字符串比较,
=!=;数字比较-eq -ne -lt -le -gt -ge
if [ "$t1" != "$t2" -a $n1 -eq $n2 ] || [ $n3 -eq 100 ]; then
...
fi
- crontab 任务列表不读环境变量,执行脚本要绝对路径
30 * * * * source /home/nemo/.bashrc; /home/nemo/somescript > /dev/null
0-59 1-23 1-31 1-12 0-6 somescript
- 重定向前后不可为同一文件
sort in.txt > in.txt
最佳实践
- 函数内部变量使用 local 声明
func () {
local var=hello;
}
- 变量用花括号
echo echo ${BASH}_VERSION
echo ${10}
- 字符串变量用双引号
[ "$day" = yes ]
- 一步到位
mkdir -p some/conf/{first,second/{third,forth}}
vi some/domains.conf
find . -name "dom*.conf" -exec vi {} \;
- 其他
tar xvf -C ~ /nfs/some.tar.gz # 减少移动文档
cd ~ && tar xvf -C ~ /nfs/some.tar.gz # 鼓励使用列表
使用 \ 进行长命令折行;
() {} 对命令分组执行
rm *.xml; rm some -r #避免 rm * -rf
附:
shell 内部特殊参数
| 字符 | 通用含义 | 示例及说明 |
|---|---|---|
| * | 位置变量列表,使用IFS第一个字符分开 | fun 'hello world' |
| @ | 位置变量列表 | |
| # | 位置参数数目 | |
| ? | 最近一个前台任务的返回状态 | $? |
| - | 所有发送给shell的标志 | |
| $ | 进程ID | |
| ! | 最近被放到后台执行的命令的进程ID | |
| _ | 前一个命令最后一个参数 | |
| 0 | shell、脚本名、函数名 | |
| 1-9 | shell、脚本、函数的位置参数 | $2 ${10} |
练习
已知
ls /tmp/*=/tmp/a /tmp/b /tmp/c,VAR=/tmp/*,求以下命令的输出:
ls '$VAR'ls "$VAR"ls $VARls $VARals ${VAR}aeval ls "$VAR"
已知:/etc/hosts的内容为下:
192.168.1.11 oldboy11.etiantian.org
192.168.1.21 oldboy21.etiantian.org
192.168.1.31 oldboy31.etiantian.org
#192.168.1.111 oldboy111.etiantian.org
怎么才能在输入IP后找到/etc/hosts里对应的唯一的hostname?
列出你最常用到的linux命令
grep awk sed find vi git
cd ls echo cat cp mv wl tar
参考
shell使用攻略的更多相关文章
- Linux Shell脚本攻略 读书笔记
Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...
- Linux shell 脚本攻略之统计文件的行数、单词数和字符数
摘自:<Linux shell 脚本攻略>
- Linux shell 脚本攻略之创建不可修改文件
摘自:<Linux shell 脚本攻略>
- Linux shell 脚本攻略之生成任意大小的文件
摘自:<Linux shell 脚本攻略>
- Linux shell 脚本攻略之批量重命名
摘自:<Linux shell 脚本攻略>
- Linux shell 脚本攻略之文件查找与文件列表
摘自:<Linux shell 脚本攻略>
- Linux shell 脚本攻略之比较与测试
摘自:<Linux shell 脚本攻略>Page30-33
- Linux shell 脚本攻略之根据扩展名切分文件名
摘自:<Linux shell 脚本攻略>Page61-62
- Linux shell 脚本攻略之正则表达式入门
摘自:<Linux shell 脚本攻略> 下面是类似的解释:
- Linux Shell脚本攻略
-Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...
随机推荐
- form表单提交问题
1.提交后不能跳转到指定页面 jsp代码 <form class="form-horizontal" role="form"> <p clas ...
- 解决java.beans.Introspector导致的内存泄漏
解决方案: 在WEB.XML 中配置监听器: <listener> <listener-class> org.springframework.web.util.Introspe ...
- tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)
配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...
- 构建高性能的MYSQL数据库系统
实验环境: DB1:172.16.1.100 DB2:172.16.1.101 VRRIP:172.16.1.99 步骤: yum -y install mysql 1.修改DB1的mysql配置文件 ...
- Python学习日志(四)
列表 列表名 = [元素1,元素2,-] 列表和C中的数组有些相似,但列表的功能更加强大,数组的元素要求是同种类型,但列表可以是混合类型. 跟数组一样,通过元素的索引值,我们可以从列表获取单个数据. ...
- 基于dubbo构建分布式项目与服务模块
关于分布式服务架构的背景和需求可查阅http://dubbo.io/.不同于传统的单工程项目,本文主要学习如何通过maven和dubbo将构建分布项目以及服务模块,下面直接开始. 创建项目以及模块 ...
- ubuntu14.04禁用自动待机保持屏幕亮度
http://jingyan.baidu.com/article/9989c7461fd041f648ecfe05.html
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法
基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法 Siamese CNN Temporally Constrained Metrics T ...
- java并发J.U.C AtomicReference VS Volatile
SpinLock实现,摘自并发编程网 package com.juc.simple; import java.util.concurrent.atomic.AtomicReference; /** * ...