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"

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

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

lines=`wc -l 1.txt`  # 这里lines就被赋值为了1.txt的行数
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

输入:

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

多语句组合

  • &&: 满足短路原则,即第一个命令返回失败时不会执行第二个命令
  • ||: 满足短路原则,即第一个命令返回成功时不会执行第二个命令
  • ;: 不短路,不管第一个命令是否返回成功,均会执行第二个命令
echo "Always executed" || echo "Only executed if first command fails"
echo "Always executed" && echo "Only executed if first command does NOT fail"
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. 判断

最简单的判断逻辑是:

if [ condition1 ]; then
statement1
elif [ condition2 ]; then
statement2
else
statement3
fi
# 或者用test
if test condition1 ; then
statement1
fi

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

判断条件

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

-eq   等于(==)
-ne 不等于(!=)
-gt 大于(\>)
-lt 小于(\<)
-le 小于等于
-ge 大于等于
-z 空串
-n 非空串
== 两个字符相等
!= 两个字符不等

组合判断

-a      且
-o 或

特殊用法[[ ... ]]

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

文件的判断

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

switch case

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

3. 循环

for 循环

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

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

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

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

for Output in $(ls)
do
cat "$Output"
done

while 循环

while [ condition ]
do
echo "loop body here..."
break
done

4. 命令行

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

5. 其他常用命令用法

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

字符串分割:

a="one,two,three,four"

# 要将$a分割开,可以这样:
OLD_IFS="$IFS"
IFS=","
arr=($a)
IFS="$OLD_IFS"
for s in ${arr[@]}
do
echo "$s"
done
# 后面的可以直接改为只取${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-5

    1.请查看String.equals()方法的实现代码,注意学习其实现方法 将此字符串与指定的对象比较.当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 ...

  2. 一篇知乎的故事 - javascript技术贴

    前言 就像文章题目所示,本文的发表源于知乎的一篇文章.文章链接如下:如果你想靠前端技术还房贷,你不能连这个都不会.这篇文章是群里水群时别人发的,像我这样的菜鸟角色才不会逛知乎~~~.这篇文章主要是讲了 ...

  3. wpf后置代码中的Grid布局以及图片路径的设置

    之前用Grid练习连连看布局时,遇到了几个困惑.此次就把当时的一些收获写出来,供以后翻看. 图片路径可能比较常用,所以就写在第一个了. 在xaml中,设置图片非常简单,只要把图片拷贝到资源目录(这里假 ...

  4. MS office2010 ppt自动放映的设置方法

    在菜单“幻灯片放映”-“排练时间”,进入演示,然后设置每张幻灯片需要等待的时间后,手动切换到下一张(如图),一直放映结束,会提示你是否保存排练时间.然后在菜单“幻灯片放映”-“设置放映方式”,里面选择 ...

  5. Spring Mvc + Easyui中根据查询结果导出文件

    项目是典型的SpringMvc + Easyui,需求是前台页面根据查询条件导出生成CSV文件. 基本流程是:前台页面通过表单提交的方式,请求后台,后台接受到查询参数,根据查询参数查询到数据集合,最后 ...

  6. cin的返回值

    例: int main() { int a,b; while(cin >> a >> b) cout << a+b << endl; } 首先,cin是 ...

  7. #define宏与const的区别

    1.#define宏的用法 #define用宏名代替一个字符串,这样便于修改,提高了程序的可移植性.编译器在编译预处理时只对宏做文本替换,而不进行类型检查,所以替换后可能产生一些副作用. 带参数的宏类 ...

  8. java后端学习流程

    首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解! 其中J2SE是关 ...

  9. 什么是vue?

    vue就是一个js库,并且无依赖别的js库,直接引入一个js文件就可以使用,跟jquery差不多.vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的 ...

  10. 关于margin

    ----W3School -----margin CSS 边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距. 这个简 ...