• "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字
  • shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译型语言,编译器把整个工程编译成可执行文件才能执行
  • 在没有续行符(\回车)的情况下,shell脚本的一条语句以"回车"为结束
  • 任何一个shell脚本程序都必须在开头用#!标识使用的shell程序,如果用的是bash,那就是#!/bin/sh
  • shell脚本一行中的#之后的部分为注释
  • 刚刚写完的一个shell script程序通常是没有执行权限的,需要手动$chmod +x filename.sh来添加可执行权限
  • shell语言本身并不包含linux内置的命令,那些命令本质上都是一个可以在shell环境中执行的程序,只是在shell环境中执行shell脚本可以调用这些程序而已。

特殊符号

$

表示取结果。和变量名一起使用表示取变量的值,和()一起使用表示取命令群组的执行结果

  1. $tunset=123
  2. $echo "$tunset"
  3. 123
  1. $echo $(ls Downloads)
  2. lukas-h.github.io-theme.zip youdao-dict_1.1.0-0-deepin_amd64.deb

( )

  • 表示在"nested sub-shell"中划分一个命令群组(command group),如果我们希望里面的命令对之前和之后的设定不影响的话,就要用(),反之,如果需要在当前shell(non-named command group)中执行相关命令,就要用{}表示命令群组。
  • 在数学计算中就是数学中的()
  • 定义数组
  1. $cat shell.sh;./shell.sh
  2. #!/bin/bash
  3. line="123 25 36532 454"
  4. (
  5. line="wwww"
  6. echo "$line"
  7. )
  8. echo "$line"
  9. wwww
  10. 123 25 36532 454
  1. $arr=(0 1 2 var) #定义一个数组
  2. $echo "${arr[0]}" #显示数组下标为0的元素
  3. 0

{ }

  • 用作范围限定
  • 标明在"non-named command shell"中执行的命令群组。shell函数就是使用{}的特性来定义的
  • 配合-+=#/%对变量进行操作
  1. $echo $var
  2. 123
  3. $echo $variable
  4. $echo ${var}iable
  5. 123iable
  1. $cat shell.sh;./shell.sh
  2. #!/bin/bash
  3. line="123 25 36532 454"
  4. {
  5. line="wwww"
  6. echo "$line"
  7. }
  8. echo "$line"
  9. wwww
  10. wwww
  1. $file=/opt/ros/jade/include/image_view/ImageViewConfig.h
  2. #匹配+删除
  3. $echo ${file#*/} #从左侧开始匹配符合模式最短部分,将其剔除,返回剩下的
  4. opt/ros/jade/include/image_view/ImageViewConfig.h
  5. $echo ${file#*/*/}
  6. ros/jade/include/image_view/ImageViewConfig.h
  7. $echo ${file##*/} #从左侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
  8. ImageViewConfig.h
  9. $echo ${file%/*} #从右侧开始匹配符合模式的最短部分,将其剔除,返回剩下的
  10. /opt/ros/jade/include/image_view
  11. $echo ${file%%/i*} #从右侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
  12. /opt/ros/jade
  1. #按个数返回
  2. $echo ${file:0:4}
  3. /opt
  4. $echo ${file:4:9} #将第4个字符当作第1个,计数9个, 返回
  5. /ros/jade
  1. #匹配+替换
  2. $echo ${file/opt/root} #将file中的第一个opt替换为root
  3. /root/ros/jade/include/image_view/ImageViewConfig.h
  4. $echo ${file//i/++} #将file中的所有i都替换为++
  5. /opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h
  1. #根据变量状态操作,
  2. $echo ${file-fault} #只要设定了,就返回file,否则返回fault
  3. /opt/ros/jade/include/image_view/ImageViewConfig.h
  4. $echo ${file1-fault}
  5. fault
  6. $echo ${file:-fault} #只要设定了且非空,就返回file,否则返回fault
  7. /opt/ros/jade/include/image_view/ImageViewConfig.h
  8. $echo ${file+fault} #只要设定了,就返回fault
  9. fault
  10. $echo ${file:+fault} #只要设定了且非空,就返回fault
  11. fault
  12. $echo ${file=fault} #只要file没设定,就将fault赋值给file并返回
  13. /opt/ros/jade/include/image_view/ImageViewConfig.h
  14. $echo ${file1}
  15. $echo ${file1=fault}
  16. fault
  17. $echo ${file1}
  18. fault
  19. $echo ${file:=fault} #只要file没设定或非空,就将fault赋值给file并返回
  20. /opt/ros/jade/include/image_view/ImageViewConfig.h
  21. $echo ${file?fault} #只要file没设定,就将fault输出至STDERR
  22. /opt/ros/jade/include/image_view/ImageViewConfig.h
  23. $echo ${file:?fault} #只要file没设定或为空,就将fault输出至STDERR
  1. #统计字符数
  2. $echo ${file}
  3. /opt/ros/jade/include/image_view/ImageViewConfig.h
  4. $echo ${#file}
  5. 50

(( ))

用作计算,shell支持十进制/十六进制/二进制的+ - * / % & += -= *= /= %= ++ -- 等算术运算,以及| ^ ! > >= < <= !=等逻辑运算。同样的效果也可以使用expr ...来实现,但是expr是Linux的内置软件,并不是shell语言的关键字

  1. $echo $((1 + 2))
  2. 3
  3. $echo $((0xf + 1))
  4. 16
  5. $cal=132
  6. $echo $(($cal+1))
  7. 133

[ ]

  • 用作取数组元素,使用${arr[n]}访问数组编号为n的元素
  1. $arr=(0 1 2 var)
  2. $echo "${arr[0]}"
  3. 0
  4. $echo "${arr[3]}"
  5. var

` `

两个反单引号表示命令替换,和$()是等价的。个人觉得看着比$()清晰,但是如果多层嵌套的话可能需要转义,此时就没有$()看着易懂。在下面的嵌套结构中,我们本意是先执行cmd3,将执行结果传给cmd2,再将结果传给cmd1

  1. cmd1 `cmd2 `cmd3``

但是其实被解析成了下面这个

  1. cmd1 `cmd2`cmd3 ``

为了解决这个问题,我们需要使用转义字符,写成下面这个样子才能正确的传达我们的意思

  1. cmd `cmd2 \`cmd3\``

但如果我们使用$(),就可以让代码更清晰

  1. $echo `echo`echo 12`` #被分解成了 echo `echo` echo 12``
  2. echo 12
  1. $echo `echo \`echo 12\`` #这个才对
  2. 12
  1. $echo $(echo $(echo 12)) #这个才对
  2. 12

|

管道表示将前一个命令的返回结果用作后一个命令的参数,管道的前后必须都是命令,管道是管理Linux十分有用的工具
$grep "test" file1.txt | wc -l

> >>

> 以新建的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就把文件清空再写入内容
>>以追加的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就在原文件后面写入内容

<

我们通常的操作就是文件,其实已经使用的输入重定向

2>

  • 标准输入,标准输出,标准错误其实是三个完全不同的文件,虽然我们看起来标准输出和标准错误都输入到显示屏中显示,但是不能用输出重定向将错误重定向到其他文件
  • 标准输入,标准输出,标准错误的文件描述符分别是0,1,2,这也是错误重定向2>的由来

&&

&&前的命令执行成功了就继续执行后面的命令

||

||前的命令执行失败了就去执行后面的命令

;

不论;前的命令执行成功与否都去执行后面的命令

关键字

readonly

相当于C中的const,readonly将变量设为只读模式,任何针对他们的赋值都是错误的

  1. $readonly var=123
  2. $var=345
  3. bash: var: readonly variable

unset

删除变量

  1. unset var_name 删除变量var_name
  2. unset -v first middle last 删除其他变量
  3. unset -f fcn 删除函数
  1. $tunset=123
  2. $echo $tunset
  3. 123
  4. $unset tunset
  5. $echo $tunset
  6. $

shift

用来截去来自列表的位置参数,从左侧开始,一旦执行shift,$1的初始值就会永远消失,取而代之的是$2的旧值,依次类推,$#的值也会依次减1
shift也可以带一个参数,表示一次截取的个数

  1. $cat shell.sh
  2. #!/bin/bash
  3. echo "${1}"
  4. shift
  5. echo "${1}"
  6. $./*.sh 123 456
  7. 123
  8. 456

set

设置新的位置参数

  1. $set qq ww ee
  2. $echo "${1}"
  3. qq
  4. $echo "${0}"
  5. bash
  6. $echo "${2}"
  7. ww
  8. $echo "$#"
  9. 3

export

添加变量到变量导出列表,即如果在shell中执行子shell,该变量将作为环境变量从而在子shell中变得可以使用。

  1. $cat shell.sh
  2. #!/bin/bash
  3. echo "$NEWENV"
  4. $NEWENV=123
  5. $./shell.sh
  6. $export NEWENV
  7. $./shell.sh
  8. 123

exit

提前结束标本

1、使用&符号在后台执行命令(用户退出则命令终止)

./XX.sh &

2、使用nohup在后台执行命令(用户退出命令不终止)

nohup ./XX.sh &

3、使用screen重新连接会话
4使用watch连续地执行一个命令(类似js中的定时器)

watch df -h

shell数组等基本用法的更多相关文章

  1. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  2. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  3. (转)Shell中read的用法详解

    Shell中read的用法详解 原文:http://blog.csdn.net/jerry_1126/article/details/77406500 read的常用用法如下: read -[pstn ...

  4. Linux Shell系列教程之(六)Shell数组

    本文是Linux Shell系列教程的第(六)篇,更多shell教程请看:Linux Shell系列教程 Shell在编程方面非常强大,其数组功能也非常的完善,今天就为大家介绍下Shell数组的用法. ...

  5. Shell基础(四):字符串截取及切割、字符串初值的处理、基使用Shell数组、expect预期交互、使用正则表达式

    一.字符串截取及切割 目标: 使用Shell完成各种Linux运维任务时,一旦涉及到判断.条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串. 本案例要求熟悉字符串的常见处 ...

  6. Linux Shell 数组

    shell 数组一般都是一维数组. 1. 数组的声明 declare -a arr 该命令将声明一个数组arr,实际上不声明也可以直接定义数组. 2. 数组的初始化 arr=(1 2 3):该命令定义 ...

  7. shell--2.shell数组

    shell 数组 (1)定义数组 shell中,用括号表示数组,数组元素用空格分开,定义数组的一般形式 arrt_name=(val1 val2 val3) 或者 arry_name=(val1 va ...

  8. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  9. Shell数组例子

    Shell数组例子 循环打印数组,并统计数组的个数: [root@slavedb array]# cat a.sh #!/bin/bash array=( freddy freddie tang sh ...

随机推荐

  1. 学习 Spring (十四) Introduction

    Spring入门篇 学习笔记 Introduction 允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象 由 中的 元素声明该元素用于声明所匹配的类型拥有一个新的 p ...

  2. Simple Use IEnumerable<T>

    Private static IEnumerable<T> FunDemo(T para) { while(...) { .... yield return Obj; } } static ...

  3. 5G到来,数据中心如何变革?

    导读 5G将要到来,除改变人们的工作生活外,其带宽.延时.连接特性也逼迫着数据中心变革,以满足5G时代需求.具体而言,5G将从形状规模.硬件组成及软件规模三面变革数据中心. 5G带来什么 高带宽.低延 ...

  4. Go中的Init函数

    init函数会在main函数执行之前进行执行.init用在设置包.初始化变量或者其他要在程序运行前优先完成的引导工作. 举例:在进行数据库注册驱动的时候. 这里有init函数 package post ...

  5. Android InputType

    转载: http://blog.csdn.net/wei_zhi/article/details/50094503 在Android开发过程中,我们经常使用到EditText控件,并且会根据各种需求设 ...

  6. LOJ6432 [PKUSC2018] 真实排名 【组合数】

    题目分析: 做三个指针然后预处理阶乘就行. 题目代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; struct n ...

  7. 【XSY2680】玩具谜题 NTT 牛顿迭代

    题目描述 小南一共有\(n\)种不同的玩具小人,每种玩具小人的数量都可以被认为是无限大.每种玩具小人都有特定的血量,第\(i\)种玩具小人的血量就是整数\(i\).此外,每种玩具小人还有自己的攻击力, ...

  8. scrapy 发送post请求

    登录人人网为例 1.想要发送post请求,那么使用'scrapy.FormRequest'方法,可以方便的指定表单数据 2.如果想在爬虫一开始的时候就发送post请求,那么应该重写'start_req ...

  9. k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)

    你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...

  10. ListView中的组件Button的OnClick事件触发时机

    Android开发时,ListView中的组件Button的OnClick事件必须在ListView之外的组件事件触发后才能触发? 此处ListView无OnItemClick事件,而且ListVie ...