Shell 简易教程

语法

变量

  1. ${variable} 获取变量值,简写$variable。当涉及变量拼接时,必须使用{}。如:${variable}_name。
  2. variable=value 变量赋值,=左右两边不能有空格。
  3. 命令结果赋值。 variable=$(ls -a) 或者 varivale=`ls
    -a`
     。
  4. 环境变量。打开shell的时候,创建环境变量。该shell创建的子进程将继承该shell的环境变量。export命令可以设置环境变量,供子进程继承使用。但子进程不能export给父进程使用。
  5. 位置变量。$0 代表脚本名字,$1代表第1个参数,$n代表第n个参数。
  6. 特殊符号变量。[email protected] 与 $* 表示所有参数; $# 表示参数个数。

[email protected] 与 $* 区别:
加入双引号后,*表示的参数不会被IFS分隔。

bash test.sh 1 2------------------

code> for item in "$*"; do echo $item; doneout > 1 2

code> for item in "[email protected]"; do echo $item; doneout > 1      2

操作符

  1. = 赋值操作符,操作符两端不能有空格。
  2. (())类似于let命令,允许算是操作,同时允许类似C语言的表达式
    (( a++ ))(( t = a < 45 ? 4 : 5 ))(( i = 1;  i < 10; i++ ))

数组

  1. 数组赋值 array[key]=value 或 array
    = (value1 value2 value3)
  2. 访问数组 ${array[key]}
  3. 删除元素 unset array[key]
  4. 删除数组 unset array
  5. 数组长度 ${#array[*]} 或 ${#array[@]}
  6. 数组展开 ${array[*]} 或 ${array[@]}
    array=(1 2 3)for item in ${array[*]}do    echo $itemdone

退出状态码

  1. 取值范围0-255之间整数,成功返回0,失败返回非0。
  2. exit 等价于 exit
    $?
    。而 $? 取上一条命令的返回状态码
  3. ! 不影响命令的执行,只影响命令的状态码。
    code> ! echo "hello world"; echo $?out > 1

NOTE: ! 改变返回状态码的值。

测试条件

  1. if 测试退出状态码,0代表成功,1代表失败。
  2. test 与 [] 与[[]]
  3. -a 逻辑与
  4. -o 逻辑或
    if [ "$expr1" -a "$expr2" ]  ==> expr1 与 expr2 同时为真if [[ "$expr1" && "$expr2" ]] ==> [[]] 可以采用&&, ||

文件测试

符号 含义
-d file 为目录且存在
-e file 为文件且存在
-f file 为非目录普通文件且存在
-s file 存在且长度不为 0
-L file 为连接且存在
-r file 为文件且可读
-w file 为文件且可写
-x file 为文件且可执行

数字测试

符号 含义
-eq equal
-ne not equql
-gt greater than
-ge greater equal
-lt less than
-le less equal

双圆括号 (($a < $b));符号:<<=>>=,==!=

字符串测试

= 仅仅是对等号两边的字符串进行逐字匹配,等号两端必须有空格,否则相当于字符串连接了。

== 在[]中的表现同=,但如果采用[[]],则展现不同。

[[ "$a" == a* ]] 相当于正则,匹配以a开头的字符串[[ "$a" == "a*" ]] 关闭正则,逐字匹配

code> a="aabb"; if [[ $a == a* ]]; then echo "got"; else echo "not"; fiout > got

code> a="aabb"; if [[ $a == "a*" ]]; then echo "got"; else echo "not"; fiout > not

!= 同==使用方式,判断不等。

< 与 > 通过ascll码进行大小比较。[] 中必须转义,因为[]相当于shell表达式,不转义,相当于重定向。

[[ "$a" < "$b" ]] 或 [ "$a" \< "$b" ]

-z 字符串为空

-n 字符串非空。 if
[ -z "$a" ]

[] 与 [[]]

[] 相当于test命令,为shell的一个内置命令。

[[]] 为一个关键字,非命令。

循环与分支

  1. for arg in [list]; do command;
    done
  2. for ((i=min; i <= max; i+=step))
    do command; done
  3. while [condition] do command;
    done
  4. until [ condition ] do command
    done
  5. casc "$variable" in "$condition") command;; esac
    var="spch2008"case $var in    "spch2009" | "spch2010") echo "condition 1";;     spch*) echo "condition2";;     *) echo "last condition";;esac

引号

shell中输入命令,得到一个命令行,该命令行被shell解析。对于一个命令行中的字符,shell将其分成两种。一种是普通文字,一种是元字符,对shell来说,具有特定功能的保留字。

单引号: 单引号内所有元字符被关闭。

双引号: 双引号大部分元字符功能被关闭,仅保留$`,\三种。

反斜线: \之后的单一元字符功能被关闭。

IFS 域分隔符,由, , 三者组成。IFS用于拆分command
line中的每个单词。如果要还原字符的本义,即关闭元字符功能,则需要使用引号。

code> line="one two three"; for word in $line; do echo $word; doneout > one      two      three

code> line="one two three"; for word in "$line"; do echo $word; doneout > one two three

元字符:

元字符 含义
= 赋值
> 重定向
| 管道
& 重定向文件描述符 或 置于后台

命令替换

` 与 () :可将一个命令的输出转入另一个上下文中;也可以作为另一个命令的参数;也可以用来设置变量;还可以为for循环产生参数列表。

files=`ls *.txt`files=$(ls *.txt)

variable=`cat file`variable=`<file`

for file in `ls *.sh`; do echo $file; done

操作变量

  1. 取长度 ${#string}${#array}
  2. 截取 ${string:position:len}
    string=spch2008echo ${string:4:4}echo ${string:4}         #位置4到最后echo ${string:(-4)}     #从后向前计算索引,负数加括号或则空格echo ${string: -4}
    
    out > 2008

函数及返回值

函数定义:function name() { }

返回数字:return

function name(){    return 100}

nameecho $?   #取得返回值

返回字符串:echo

function name(){    echo "hello "$1}var=`name Tom`echo $var

特殊变量

. 类似于C中的#include,引入shell文件

. func.sh # 有空格,引入另一个shell文件

: 空语句

$$ 当前脚本的进程ID

$! 最近一个执行命令的后台进程ID

echo $$./a.out &echo $!

out > 18180 和 18181

() 命令集,展开一个新的进程执行命令集。

注释

单行采用#,若一行不足以写完,另一行以#+代表承接上一行。

#  one line#+ one line more

算术操作

整数操作

let shell内置操作,计算表达式值

expr一个命令,类似let,用于计算表达式值,但expr直接输出结果,而不是保存在变量中。

num_a=10let result=num_a*2echo $result

expr $num_a \* 2

NOTE: expr 操作符两侧必须留有空格;*必须被转义,因为*被shell展开,因此需要转义,将*传递给expr。

参考:expr

浮点操作

bc

echo "3*2" | bcecho "$num * 3" | bc

code> echo "scale=2; 3/4" | bc     # 设置精度out > .75

2. 命令

find

文件查找

  1. 按名查找 -name, 忽略大小写 -iname

    find path -iname Spch
  2. 多表达式 。 满足一个即可。and: -a ; or -o
    find path \( -name "*.txt" -o -name "*.t" \)
  3. 指定路径范围 -path
    find . -path "*/linux/*"    #路径中包含linux
  4. 正则表达式 -regex
    find . -regex ".*\(\.py|\.sh\)$"   #查找py或sh结尾的文件

    默认采用emacs。 正则表达式种类繁多,建议通过-regextype 指定采用的正则类型。

    posix-basic 和 posix-extend。参见正则

  5. 取反 !
    find . ! -name "*.txt"
  6. 文件类型 -type

    f 常规文件 l 符号链接 d 文件夹 c 字符设备 b 块设备 s 套接字

  7. 访问时间
    • atime access time 访问时间
    • mtime modification time 修改时间
    • ctime metadata 修改时间 (权限,拥有者等)
    • amin mmin cmin 以分钟为单位
      find . -atime -7   #7天之内被访问过的find . -atime 7     #距离访问时间刚好7天find . -atime +7   #7天之前被访问过的
  8. 基于文件大小 -size
    • -size 2k 等于2k
    • -size +2k 大于2k
    • -size -2k 小于2k

    b 比特 c 字节 w 2字节 k kb m mb g gb

  9. 基于文件权限 -perm

    perm -> permission, 权限为可读可写可执行 777

    find . -type f -perm 644
  10. 基于用户 -user
  11. 查找删除 -delete
    find  . -type f -name "spch.txt" -delete
  12. 嵌套层次 -maxdepth -mindepth
    find . -maxdepth 2 -name "*.txt"  #只递归两层文件夹进行查找

    NOTE: 参数优先级,左边大于右边, 如果先指定名字,在指定嵌套深度,

    则,依然会全部递归,找到名字后,在比较嵌套层次

  13. 查找 + 动作 exec
    find . -user spch2008 -type -f -exec chown linux {} \;  # 将属于spch2008的文件修改所有者为linux

    {} 表示查找到的文件; 表达式以分号结尾,分号需要转义。

    find …… -exec cat {} \; > a.txt

    find: 整个find命令为一个输出流,因为不需要使用>>追加操作。

    find …… -exec ./command.sh {} \;

    执行一个脚本

tr

tr [ option ] set1 set2 =》 将set1集合内容替换为set2集合内容,set1与set2一一对应

  1. 指定范围 (将a-c替换为x-z)

    cat text | tr ‘a-c‘ ‘x-z‘
  2. 删除 -d
    tr -d ‘0-9‘  #删除0-9
  3. 去重连续重复字符 -s
    cat  text | tr -s ‘a‘cat  text | tr -s ‘a-z‘   #删除text中a-z重复的字符cat  text | tr -s ‘\n‘     #删除联系空行

sort

排序

  1. 输出排序结果到源文件 -o

    cat file | sort -o file
  2. 以数字而非ascll进行排序比较 -n
  3. 从大至小进行排序 -r
  4. 合并两个已排序文件 -m
    sort -m file1 file1 #合并到file1中
  5. 检查文件是否已经按从小到大排序-C$? 为0,表明已排序。
  6. 多列,指定排序列(默认以\t作为分隔)。-t 指定分隔符。
    (cunyi)

    mac 1000winxp 500
    
    sort -k 2 -n data.txt 
  7. 指定排序内容 -k pos1, pos2
     2134 3404 --- sort -k2,3 ----
  8. 忽略每行前空格 -b

uniq

去重。处理数据之前,必须先排序。

  1. 去除重复行。 uniq data.txt
  2. 只显示不重复行 -u
  3. 只显示重复行 -d
  4. 去除重复行,且显示行数 -c
      tom  tom  rom --- uniq -c --------------  2 tom  1 rom
  5. 指定比较字段。 -s 起始位置 -w匹配长度

cut

提取文件内容

  1. 提取指定字段(默认tab分隔) -f

    tom 18 studnet---- cut -f 2,3 file ---18 student
  2. 排除某个字段,剩下全要 --complement
    cut -f3 --complement file
  3. 指定分隔符 -d
  4. 指定字符或字节范围
    • -b 字节
    • -c 字符
    • -f 域

    abcdef ==> cut -c1-5 ==> 截取abcde

wc

统计字符

  • -l 统计行数
  • -w 统计单词
  • -c 统计字符
  • -L 最长行的字符数
  • wc file 总览,输出行数,单词数,字符数

tail

打印文件结尾部分

  • tile file 打印尾10行
  • tile -n file 打印尾n行
  • tile -f file 打印最新的,即文件在动态增长
  • tile -f file –pid pid 指定进程死亡,tail命令结束

tar

打包工具

  1. 压包

    tac -cf output.tar file1 file2

    c (create) f (filename)

  2. 看包 

    tar -tf output.tar

    tar -tvf output.tar 文件详细信息,如大小等。

  3. 追加 

    tar -rf output.tar newfile

  4. 解包 

    tar -xf output.tar

  5. 抽取 

    tar -xf output.tar file1 file2

  6. 合并 

    tar -Af tar1 tar2 #合并到tar1中

  7. 更新 

    tar -uf output.tar file1

  8. 删除 

    tar -f output.tar –delete file1

  9. 压缩
    • -j bzip2 .bz2
    • -z gzip .gz

    ① 根据后缀自动选取压缩工具 -a

    tar -acf output.tar.gz file1 file2

    ② 指定压缩工具

    tar -zcf ouput.tar.gz file1 file2

  10. 解压缩 

    ① 自动选择解压工具

    tar -xaf output.tar.gz -C 路径

    ② 指定压缩工具

    tar -xzf output.tar.gz

du

查看文件大小

  • du -a Dir 列出文件夹下所有文件大小
  • du Dir 列出文件夹总大小
  • -h 友好输出大小
  • –max-depth 计算Dir内所有文件大小,但只列出一层的
  • du -k –max-depth 1 Dir | sort -nrk1 | head 文件大小排序
  • -k,-m 以k或m为单位

df

查看磁盘利用率

df -h

time

查看某个命令的执行时间

  • time ls 查看ls执行时间
  • -o 将信息写入文件
  • -o -a 以追加方式写入文件

grep sed awk

grep and sed

awk

crontab

预设时间,执行脚本。

  1. 六个区间

    Minute (0-59) Hour (0-23) Day (1-31) Month (1-12) Weekday (0-6) Command

    * 代表这个区间段执行

    如 00 02 * * * ,每天两点执行; /2 * * * 每两分钟执行一次; 00 5,6,7 * * * 每天5,6,7点执行。

  2. 使用
    编写文件:vim task.cron编写命令:00 02 * * * /home/script.sh执行:chrontab task.cron

    NOTE: 脚本写绝对路径

  3. 查看crontab
    crontab -lcrontab -l -u spch2008  #查看指定用户的crontab
  4. 删除
    crontab -r                  #删除全部crontab -r -u spch2008      #删除某个用户的全部

    一个用户只能有一个crontab,但该crontab中可以添加多条任务;如果需要进行修改,采用crontab -e进行编辑。

知识点

重定向

文件描述符: 输入0, 输出1,
错误输出2

2>&1 不可以写成2>1
错误写法,相当于把错误输出打印到文件1中,而不是重定向。加入&告诉shell,后面的是一个文件描述法,而非文件名。

块重定向

>>><<< 可以为单个命令进行重定向,也可以通过{}()进行块的重定向。

{    echo message1    echo message2} > text

更进一步, ifcase块, forwhile循环体,{}() 命令分组都共享相同的文件描述符,除非在块中自行打开或关闭文件描述符。

#统计文件行数file=textcnt=0

while read; do    ((cnt++))done < $file
时间: 2024-10-12 23:53:47

Shell 简易教程的相关文章

Shell 程序设计简易教程

Shell 程序设计简易教程 我不能说我写过多少功能复杂的 shell 脚本,但一些简单的脚本倒是写了不少.在 Linux 下工作,有时候一些零零碎碎的工作,如果你通过写 shell 脚本来处理,会发现那是相当的方便和快捷.当然这样的脚本也不是经常会用到,偶尔用到的时候又要重新去翻书或者查资料,因为我们毕竟不能记住太多的东西,这似乎有些麻烦,所以索性就写了这份网络教程,以便于今后参考. 本教程的内容大部分摘自清华大学出版社出版的<Linux操作系统实用教程>一书,原书作者为文东戈, 孙昌立,

getopts简易教程(Small getopts tutorial)译文(未完成)

getopts简易教程 当你想用一种专业的方式解析命令行参数时,getopts就是要选择的工具.和它的旧版本兄弟命令getopt不同(注意没有s!),getopts是shell内置命令.高级地方表现在 你不需要通过一个外部命令传递参数 getopts可以很容易的设置一些你能用于解析参数的变量(对于一个外部程序来说这是不可能的!) 你不必再处理过去一些使用getopt时的一些bug实现(空格, -) getopts已经在POSIX?定义 一些其他解析位置参数的其他方法(不用getopt(s))在这

BIND简易教程(1):安装及基本配置

首先,为什么说是简易教程呢?因为BIND的功能实在太多,全写出来的话要连载好久,我觉得我没有那么多精力去写:而我了解的仅仅是有限的一点点,不敢造次.百度上的文章也是一抓一大把呐!所以,教点基本使用方法,有需求的同学可以再翻翻BIND管理员手册.那么,还是直接开始说正题吧.本次还是像PowerDNS一样是一个连载,写三篇. 目录:BIND简易教程(1):安装及基本配置(本篇)BIND简易教程(2):BIND视图配置(待续)BIND简易教程(3):DNSSec配置(待续) 首先说说安装.安装是非常简

Emacs简易教程

Emacs简易教程阅读: 命令: $emacs 进入之后,输入: C-h t 这里,C-h表示按住[Ctrl]键的同时按h ####### 20090620 *退出: 输入“C-x C-c” *撤销: 输入"C-x u" 或输入"C-_" 这里,"C-_"比较好输入一些(好像C--也行),但是有的键盘上面没有"_"就只能输入“C-x u”了,撤销动作能进行20次. *向上翻页: 输入"M-v" 这里,右手的

CCS2.2基于软件仿真简易教程(汇编)

CCS2.2基于软件仿真简易教程(汇编) Rev 1.0 Writer Nirvana Silence 配置目标芯片 打开此图标 导入配置,生成gel文件,导入点击close 然后关闭 保存changes 启动工程软件 新建工程.asm文件,添加到工程 新建文件 保存为汇编格式 添加到工程 编写程序,编译程序,load程序 在新建的ASM文件中输入以下程序,查看运行后(1030H).(1040H).*AR3,AR4的值 记得助记符前面至少要有一个空格 编译 没有问题,load .out文件 打开

Android实战简易教程-第四十枪(窃听风云之短信监听)

近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台服务,将监听到的短信自己主动上传到bmob数据库中. 一.代码实现: 1.首先实现javabean对象. package com.example.messagecut; import cn.bmob.v3.BmobObject; public class MsgContent extends Bmo

Linux Shell系列教程之(七)Shell输出

本文是Linux Shell系列教程的第(七)篇,更多shell教程请看:Linux Shell系列教程 与其他语言一样,Shell中也有输出操作,而且在实际应用中也是非常重要的,今天就为大家介绍下Shell输出操作. Shell echo命令 echo命令是Shell的一个内部指令,用于在屏幕上打印出指定的字符串. 命令格式: echo arg 转义字符 像其他高级语言一样,Shell也使用反斜杠“\”作为转义字符. 例子: echo "\"It is a test\"&q

移动开发之【微信小程序】的原理与权限问题以及相关的简易教程

这几天圈子里到处都在传播着这样一个东西,微信公众平台提供了一种新的开放能力,开发者可以快速开发一个小程序,取名曰:微信公众平台-小程序 据说取代移动开发安卓和苹果,那这个东东究竟是干吗用的?但很多人觉得是网页版应用. 有的人很鸡冻,但是--最后文章会提及具体的权限开放问题,所以,还是保持一颗冷静的?比较好. 那我们先来看看组件和API开放了哪些服务: 视图容器:视图(View).滚动视图.Swiper 基础内容:图标.文本.进度条 表单组件:按钮.表单等等 操作反馈 导航 媒体组建:音频.图片.

BIND简易教程(2):BIND视图配置

目录:BIND简易教程(1):安装及基本配置BIND简易教程(2):BIND视图配置(本篇)BIND简易教程(3):DNSSec配置 上文书说到,我们把aaa.apple.tree解析到192.168.4.100.那么世界上任何一个人在请求aaa.apple.tree的时候,解析到的都是这个IP地址,之后,再访问这个域名(当然这个IP地址只是实验的,而且我域名也没注册,除了我内网之外,世界上任何一个人都访问不到).那么问题来了,两个人一个在电信,一个在联通,都想访问这个域名的话,我的服务器要放在