shell的简单使用

最近发现shell脚本在平常工作中简直算一把瑞士军刀,很多场景下用shell脚本能实现常用的简单需求,而之前都没怎么学习过shell,就趁机把shell相关的语法和常见用法总结了下,方便以后随时回顾和查阅!

1. 综述

shebang

其实shell的开始并不难,第一行如下:

#!/bin/bash

叫做shebang

注释

shell的注释以#开头(这点类似于python)

变量

变量定义:

var_test1="hello"

注意定义和赋值时=两边均不能有空格,且变量名前不能加$

变量使用:

echo $var_test1



echo ${var_test1}

或:

str1="${var_test1} world"

加上美元符后的变量会被替换为其值。注意,单引号中的不会被替换

命令执行结果赋给一个变量:

  1. lines=`wc -l 1.txt` # 这里lines就被赋值为了1.txt的行数
  2. lines="$(wc -l 1.txt)" # 单撇号不能嵌套,可用这种包含在内

格式化变量:

echo 23 | awk {printf("%05d", $0);} # 00023

字符串截取:

${var_test1:1:3}会得到"ell",即从索引1开始取3个字符

输出

shell中的输出直接用echo即可

echo "hello word"

等同于

echo hello word

输入:

  1. echo "What's your name?"
  2. read Name # 这里不需要声明新变量
  3. echo Hello, $Name!

多语句组合

  • &&: 满足短路原则,即第一个命令返回失败时不会执行第二个命令
  • ||: 满足短路原则,即第一个命令返回成功时不会执行第二个命令
  • ;: 不短路,不管第一个命令是否返回成功,均会执行第二个命令
  1. echo "Always executed" || echo "Only executed if first command fails"
  2. echo "Always executed" && echo "Only executed if first command does NOT fail"
  3. echo "Always executed1" ; echo "Always executed2"

通道和重定向

cmd1 | cmd2: 通道,第一个命令的输出会直接作为第二个命令的标准输入来执行

python test.py < in.txt: 输入重定向,将从in.txt读取输入而非标准输入流

echo "hello" > out.txt: 输出重定向,将前一个命令的输出定向到文件out.txt中(创建新文件并写入)

echo "hello" >> append.txt: 输出重定向,将前一个命令的输出定向到文件append.txt中(追加到文件末尾)

echo "hello" 2> err.txt: 错误流重定向,将前一个命令的错误流输出定向到文件err.txt中(创建新文件并写入)

echo "hello" 2>> err.txt: 错误流重定向,将前一个命令的错误流输出定向到文件err.txt中(追加到文件末尾)

2. 判断

最简单的判断逻辑是:

  1. if [ condition1 ]; then
  2. statement1
  3. elif [ condition2 ]; then
  4. statement2
  5. else
  6. statement3
  7. fi
  8. # 或者用test
  9. if test condition1 ; then
  10. statement1
  11. fi

注意:condition两边与[]之间必须至少有一个空格

判断条件

shell中判断条件不同于其他语言中的<,>,==,<=,>=那么直接,常见的有下列几种:

  1. -eq 等于(==)
  2. -ne 不等于(!=)
  3. -gt 大于(\>)
  4. -lt 小于(\<)
  5. -le 小于等于
  6. -ge 大于等于
  7. -z 空串
  8. -n 非空串
  9. == 两个字符相等
  10. != 两个字符不等

组合判断

  1. -a
  2. -o

特殊用法[[ ... ]]

  • 字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]]结果为真
  • &&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a <= 5 ]], 如果不使用双括号, 则为if [ $a -ne 1] && [ $a -le 5 ]或者if [ $a -ne 1 -a $a -le 5 ]

文件的判断

  1. -f 判断后面是否为一个文件
  2. -d 判断后面是否为一个目录
  3. -e 判断后面对应的文件是否存在
  4. -s 判断文件是否存在且不为空

switch case

  1. case "$Variable" in
  2. # 列出需要匹配的字符串
  3. 0) echo "There is a zero.";;
  4. 1) echo "There is a one.";;
  5. *) echo "It is not null.";;
  6. esac

3. 循环

for 循环

  1. # {1..3} == `seq 1 3`
  2. for Variable in {1..3}
  3. do
  4. echo "$Variable"
  5. done

或传统的"for循环",但需要加两层括号(两层的小括号内可以写C语言中的语句):

  1. for ((a=1; a <= 3; a++))
  2. do
  3. echo $a
  4. done

在其他命令的结果上执行for循环:

  1. for Output in $(ls)
  2. do
  3. cat "$Output"
  4. done

while 循环

  1. while [ condition ]
  2. do
  3. echo "loop body here..."
  4. break
  5. done

4. 命令行

  1. $# 命令行参数个数
  2. $0 当前脚本名
  3. $n n个参数值,n可取1,2,3...
  4. $@ 所有命令行参数
  5. $? 上一个命令的返回值

5. 其他常用命令用法

  1. # 打印每行中 ',' 之前内容
  2. cut -d ',' -f 1 file.txt
  3. # 将 file.txt 文件所有 'okay' 替换为 'great', (兼容正则表达式)
  4. sed -i 's/okay/great/g' file.txt
  5. # shell中不支持浮点数除法运算,可使用awk实现浮点除法
  6. a=3
  7. b=4
  8. c=`awk 'BEGIN{printf "%.2f",('$a'/'$b')}'` # 单引号内的变量不能被替换,因此需要将变量单独放在引号外
  9. sort
  10. -k 指定比较的列(从1开始)
  11. -n 数值比较
  12. -r 倒序
  13. -o filename 输出到文件(可用此选项输出到输入文件)
  14. -f 不区分大小写排序
  15. -c 检查是否已排序好,如果未排序好则输出第一个未按序的行
  16. -M 按月份排序
  17. -b 忽略前导空格
  18. -u 得到不重复的行
  19. 多列排序:sort -k1,1 -k3nr,3

字符串的其他操作

命令 作用
${#string} $string的长度
${string:position} $string中, 从位置$position开始提取子串
${string:position:length} $string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

字符串分割:

  1. a="one,two,three,four"
  2. # 要将$a分割开,可以这样:
  3. OLD_IFS="$IFS"
  4. IFS=","
  5. arr=($a)
  6. IFS="$OLD_IFS"
  7. for s in ${arr[@]}
  8. do
  9. echo "$s"
  10. done
  11. # 后面的可以直接改为只取${arr[1]}

6. Shell必学必会命令列表

  • 目录操作:cd/mkdir/ls/mv/cp/rm/rmdir/pwd/du/df
  • 整个文件的操作:mv/cp/rm/cat/wc/sort/uniq
  • 文件部分内容的简单操作:cut/head/tail/more/less
  • 文件内容检索和处理三剑客:grep/sed/awk
  • 多个文件的关联操作:join/paste

加粗的部分支持管道接收标准输入流。更多命令可参考:Linux命令大全


  本文简要介绍了下shell入门的一些用法,如有不对之处,欢迎大家指正。我也是不久前才开始真正使用shell,这是个强大而又复杂的语言,大家有比较好的shell资料也欢迎留言,共同学习,谢谢!

  转载请注明出处:Shell常见用法小记

Shell常见用法小记的更多相关文章

  1. shell编程系列9--文本处理三剑客之sed概述及常见用法总结

    shell编程系列9--文本处理三剑客之sed概述及常见用法总结 sed的工作模式:对文本的行数据一行行处理,如下图 sed(stream editor),是流编辑器,依据特定的匹配模式,对文本逐行匹 ...

  2. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  3. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  4. [转]Linux中find常见用法示例

    Linux中find常见用法示例[转]·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;find命令的参 ...

  5. linux expect, spawn用法小记

    linux expect, spawn用法小记_IT民工_百度空间 linux expect, spawn用法小记 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://sys ...

  6. [转载]expect spawn、linux expect 用法小记

    原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...

  7. Linux中 find 常见用法示例

    Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #- ...

  8. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  9. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

随机推荐

  1. java线程之多个生产者消费者2.0

    上一节中,通过while和notifyAll解决了多个生产者,消费者对共享资源的访问问题,现在开始升级 但是,仍然有改进之处,主要体现在两点: 1)使用新版本1.5开始后的锁Lock解决,目的将其全部 ...

  2. (C#)xml的简单理解创建和读取

    xml知识点清理:一.文档规则 1.区分大小写. 2.属性值必须加引号(单引号.双引号都可以),一般情况下建议使用使用双引号. 3.所有标记必须有结束符号. 4.所有空标记必须关闭. 5.必须有且仅有 ...

  3. JS事件流理解

    事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字. 事件是javaScript和DOM之间的桥梁. 你若触发,我便执行--事件发生,调用它的处理函数执行相 ...

  4. 3553: [Shoi2014]三叉神经树(树链剖分)

    这道题特别恶心,首先我们可以发现更改的就是出现连续的一或二,那么就用线段树+树链剖分找到这个范围 想到是不难想,就是打起来恶心罢了= = CODE: #include<cstdio> #i ...

  5. [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)

    这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...

  6. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

  7. ant编译java的例子

    ant hello world 建一上文件夹HelloWorld.里面的内容如下所示: 第一个例子不讨论build1.xml和HelloWorld1.java.运行出helloworld程序要如下步骤 ...

  8. react-router 中的history(react中关于后退键的处理用的到)

    react-router 中的history react-router 是建立在history之上的:我们来谈谈这个history吧. github: mjackson/history history ...

  9. struts2中Action到底是什么,怎么理解

    struts2中Action到底是什么,怎么理解 1.配置完web.xml2.创建视图页面login.jsp3.创建业务控制器LoginAction类(解释说:创建业务控制器LoginAction类, ...

  10. Kafka Eagle 源码解读

    1.概述 在<Kafka 消息监控 - Kafka Eagle>一文中,简单的介绍了 Kafka Eagle这款监控工具的作用,截图预览,以及使用详情.今天笔者通过其源码来解读实现细节.目 ...