按自己的意愿生活, 而且是::: 要敢于按自己的意志去活! 那是一种胆量和勇气!!


  1. shell中的结构, 只有选择(实际上if条件也是一种选择结构)和循环, 都是用关键字来替代 大括号的。 如:

    if 用 then ...fi来表示 代码段。 case 变量 in 1)....;; 2)....;; *)....;;

    for 用 do... done. while也是用 do...done 来 表示代码段的。

  2. shell 中的关键字比如do, done, then等, 都是单独一行的。遵守普通规则, 不要 放在一行什么的

  3. for循环

    shell中的for循环 跟其他任何编程语言中的for都不一样, 其他for循环都是一个连续范围, 如: 1《i《10等等。

    shell中的for,后面是一个 枚举的, 分散的, 离散的 值(数字, 字符串)的列表, 因为他是用的 in 来引导取值列表。

    后面的列表中的值, 可以有三种种类, 一是数字, 二是字符串, 三是文件。 数字用空格分开, 不是用逗号分隔的, 也不能用引号括起来:

而且循环变量的值, 就是后面列表中的一个一个的依次的取值, 在代码段中

1. for loop in 1 2 3 4 (数字列表, 直接用空格分隔)
echo $loop 2. for loop in 'this is a demo'

for循环有点像php等编程语言中的foreach. for后面的单词 就是循环体中将用到的循环变量: for i in ... then echo $i... fi


shell中的大括号

  1. 当shell中的大括号 来括 变量的时候, 一定要将大括号只括 "变量名", 不要括 $ 符合, 并且大括号在shell中就是一个普通字符,没有 转义的. 这个跟tp中的模板变量的输出不一样

shell字符串中的冒号

  1. echo ${var:Cstring} 冒号表示替换. 将var用string来替换. C 表示条件condition. C 是必须的, 如果没有C将 忽略冒号后面的string的内容: echo ${var:string}将输出 var变量的值/(由此看来, md中的图片虽然另起一行, 但是并不影响后面的序号排序)

  2. C有+, -, =, ? 加号表示var为正, 即var不为空 的时候替换, -表示负, 即var为空的时候替换, =表示var为空的时候替换,而且var本身要被赋值为string. 前面的加号减号中, var本身的值都不会变

后来增加的内容

单括号和双括号都可以跟$结合使用, 前者括号中要跟命令, 表示命令执行结果, 而双括号是跟计算表达式.

x=y 在不同位置的含义?

当x=y单独在一个行, 表示一个命令的时候, 它表示是跟x变量赋值. 可以给"字符串", 也可以给"数字字符串"都是可以的, 默认的都是作为字符串看待的

但是当 x=y 在if条件判断中时, if [ x=y ], 此时的x=y是 表示 字符串相等判断, 而不是赋值了. 但是即使是逻辑判断, 等号两边仍然不能有空格! 如果有空格, 它就表示一个命令.

**等号 = , 要表示赋值 和 条件判断 的时候, 就一定要去掉等号两边的空格. 否则就表示一个命令, 而不是赋值和判断了 **

双中括号, 仅仅只是中括号的一个扩展, 表示两个方面的东西:

  1. 是可以直接使用关系运算符和逻辑运算符, 可以直接使用 && ||, > < >= <= == !=, 而不会出错. 比如: 用单括号:

    if [ $a>$b ] && [ $a>$c ] 或者 if [ $a>$b -a $a>$c ] 就可以直接时使用 if [[ $a>$b && $a>$c ]]
  2. 是在判断字符串相等的可以使用通配符

shell中的四则运算只能借助于let expr命令, 和 两个扩展 (( )) 和$[]

let命令, 是bash中用于计算 四则运算的命令, 首先, 它可以一次性的计算多个表达式的值, 而返回最后一个表达式的值, 而没有被赋值保存的表达式值将被丢弃; 其次, 如果表达式中有空格 等特殊符号 要用双引号括起来.

使用time来测试命令所使用的时间

可以知道 同样是赋值, let命令, 比expr的命令更快, 因为let命令, 只有一次操作, 而expr命令有两次操作, 首先要计算 , 然后再是赋值.

$* $@ "$*" "$@" 的区别

$*, 是表示所有的参数. 而且这些参数是分开的,独立的

"$*", 因为加了双引号, 就表示是一个, 只有一个 字符串, 是一个整体, 是由"$1,$2, ..."等组成的一个字符串.

$@ 和 "$@" 相等 , 都表示分割的, 多个独立的参数 . 因为这里的@ 不像, 星号有通配符, 全部的意思. 而@没有全部的意思*.

通过$* 和 "$*", 就给用户 提供了一种机会, 你即可以处理形参中的各个独立的参数, 也可以把形参当作一个整体的字符串来对待.



关于$0参数的理解? shell和awk中的 $0 的区别.

并不总是当前脚本的名称, 这种说法不是很准确.

应该说是: $0表示当前命令行的 第一个单词, 比如:

source foo.sh 中的echo $0, 则会输出 "bash"

如果是 ./foo.sh 脚本中的echo $0, 则会输出 "./foo.sh" , 就是这个 "第一个单词"

但是, 在shell脚本中的$0 和 awk脚本中的$0不一样"

awk中的$0 是一行, 一条记录, 当前行, 当前记录.

所以 awk -F: '{print $0;}' /etc/passwd | head -n5 则会输出前面5行的内容.

关于2>&1

在任何命令的后面都可以使用 重定向和管道 命令

要注意几个代表 "标准设备"的 文件描述符: 0, 1, 2, 也就是 深入理解"设备也是文件"的概念.

0: 标准输入设备"文件", 即键盘,

1: 标准输出设备"文件", 即屏幕

2: 标准错误输出设备"文件", 默认的也是屏幕

> 表示重定向, 其中, > 前面的表示来源设备, 可以不加&, 而 > 后面的表示输出设备, "重定向"设备, 但是, 要在数字前面加上&, 这个& 表示"文件描述符"

在/etc目录下, 只能放root用户的文件和东西.


字符串和数字的比较, 在于你采用什么比较操作符号. 作为数字来比较, 就用 -eq -gt等符号或者用 (( ))双括号. 作为字符串来比较, 就用= , ==, !=, -z -n等符号.

===============

2>&1, 为什么要在1前面加上&?

首先, 加&表示文件描述符.表示1这个设备作为一个文件看待, 就是"device is also file", 表示标准输出. 反之,如果不加&, 成为2>1, 这时候, 1就是一个文件看待, 就表示标准错误重定向到当前目录下的一个regular 文件1中.

2>&1, 为什么要放到最后?

这是由于不同的执行顺序会导致不同的结果,

如果是 比如: ls > file 2>&1, 则先执行ls, 结果重定向文件file中, 此时标准输出就被重新定义为file了. 然后, 再执行重定向命令 2>&1, 则&1就变为 file了,所以, 到最后, 命令的输出和错误都将输出到 file中.

但是, 如果 ls 2>&1 >file 则执行的顺序是: 首先ls命令的 错误2将输出到 &1,即标准输出设备"屏幕"上. 然后执行>file, 这时 并没有改变命令的输出设备, 将产生一个stdout的拷贝, 将命令ls 的正常输出内容, 输出到文件file中.

ls >&file 或者, ls &>file 都表示将命令的标准输出和标准错误都重定向到regular文件file中. >&file 就等于 &>file , 都等于 ">file 2>&1" 这里>和& 要连起来使用, 分开则没有意义.

shell 编程中的 知识点 - 突然一下子就明白很多东西了的更多相关文章

  1. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  2. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  3. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  4. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  5. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  6. shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法

    shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...

  7. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  8. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

  9. shell编程中用户输入处理(shell 04)

    shell编程中用户输入处理1.命令行参数2.脚本运行时获取输入 命令行参数 通过空格来进行分割的位置参数 :$+position $0,$1,$2 ....$0 :程序名$1,$2,$3 ... $ ...

随机推荐

  1. [6]传奇3服务器源码分析一GameGate

    1. 2. 留存 服务端下载地址: 点击这里

  2. python 文件写入错误

    在保存网页文字到txt文件下时,出现如下错误 UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24 ...

  3. 微信小程序制作家庭记账本之一

    制作的第一天,思索着制作手机端APP还是微信小程序,首先是想到制作APP但是各种收费让我不得不换一条路,所以开始制作小程序,下载了微信小程序开发工具,试着学习制作方法,但是似乎没有成效,但我坚信要一步 ...

  4. 15类Android通用流行框架

    15类Android通用流行框架 Android流行框架 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 图片加载 Android Universal Image Loader 一个 ...

  5. 以太坊智能合约介绍,Solidity介绍

    以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...

  6. Android Auto开发初探

    一.Android Auto 概述 二.Android Auto 使用方法 四.Android Auto应用开发 五.Android Auto开发总结 一.Android Auto 概述 最近物联网是 ...

  7. 服务器网络地址 "TCP://XXX:5022" 无法访问或不存在。请检查网络地址

    把主机上数据库,完整备份一份库文件和事务日志文件,“with non recover”方式还原过去,再重新执行SQL指令.当跨IP段的时候就需要在主备机的 C:\Windows\System32\dr ...

  8. centos6使用yum安装python3和pip3

    在安装了epel源的情况下,直接yum就可以安装python3.4 #yum install python34 -y# python3 --versionPython 3.4.5 没有自带pip3,需 ...

  9. flask框架----flask-session组件

    简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...

  10. 怎样从外网访问内网Jboss?

    本地安装了一个Jboss,只能在局域网内访问,怎样从外网也能访问到本地的Jboss呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Jboss 默认安装的Jboss端口是8080. 实现步骤 下载并 ...