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>
    • 转义 ' " $ `` \
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 x1 u(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/cVAR=/tmp/*,求以下命令的输出:

  1. ls '$VAR'
  2. ls "$VAR"
  3. ls $VAR
  4. ls $VARa
  5. ls ${VAR}a
  6. eval 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使用攻略的更多相关文章

  1. Linux Shell脚本攻略 读书笔记

    Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...

  2. Linux shell 脚本攻略之统计文件的行数、单词数和字符数

    摘自:<Linux shell 脚本攻略>

  3. Linux shell 脚本攻略之创建不可修改文件

    摘自:<Linux shell 脚本攻略>

  4. Linux shell 脚本攻略之生成任意大小的文件

    摘自:<Linux shell 脚本攻略>

  5. Linux shell 脚本攻略之批量重命名

    摘自:<Linux shell 脚本攻略>

  6. Linux shell 脚本攻略之文件查找与文件列表

    摘自:<Linux shell 脚本攻略>

  7. Linux shell 脚本攻略之比较与测试

    摘自:<Linux shell 脚本攻略>Page30-33

  8. Linux shell 脚本攻略之根据扩展名切分文件名

    摘自:<Linux shell 脚本攻略>Page61-62  

  9. Linux shell 脚本攻略之正则表达式入门

    摘自:<Linux shell 脚本攻略> 下面是类似的解释:

  10. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

随机推荐

  1. InnoDB还是MyISAM 再谈MySQL存储引擎的选择

    两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...

  2. [资料分享]SQL Server 2016/2014/2012/2008简体中文企业版下载+对应补丁

    为什么只提供企业版下载呢?因为不管你是学生还是工作研究人员,企业版都是功能最为齐全的一个版本,比如企业版都集成了SQL Server Management Studio管理界面(俗称企业管理器的可视化 ...

  3. 【虚拟机】在VMware中安装Server2008之后配置网络连接的几种方式

    VMware虚拟机的网络连接方式分为三种:桥接模式.NAT模式.仅主机(Host Only) (1)桥接模式 桥接模式即在虚拟机中虚拟一块网卡,这样主机和虚拟机在一个网段中就被看作是两个独立的IP地址 ...

  4. cassandra写数据CommitLog

    cassandra 两种方式: Cassandra-ArchitectureCommitLog Cassandra持久化-Durability 一种是配置commitlog_sync为periodic ...

  5. JS中原型链继承

    当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...

  6. VS2010 ERROR:c1xx fatal error c1083

    在VS2010中新建文件夹,然后在文件夹内新建文件polling.cpp,可是在项目中不现实该cpp文件,所以就在在硬盘上将该文件删除,编译报错. >c1xx : fatal error C10 ...

  7. Smart3D系列教程3之 《论照片三维重建中Smart3D几个工作模块的功能意义》

    [摘要] 近年来,倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,利用照片进行三维重建成为一项关键性的技术.Smart3D软件,是照片三维重建主流软件之一,本文将就Smart3D建模软件 ...

  8. WebService的开发、部署、调用

    本文参考其它文章和自己解决中间问题的经历记录,以C#开发WebService为例子,欢迎探讨: 一.C#开发WebService 在visual studio中新建ASP.NET Web服务应用程序, ...

  9. WebP 原理和 Android 支持现状介绍(转)

    本文为腾讯Bugly开发者社区 投稿,作者:soonlai,版权归原作者所有,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/582939577ef9c5b70855 ...

  10. git超详细教程

    GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化Gi ...