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


  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. MYSQLi数据访问查询数据

    单条件查询 <body> <div align="center" style="width:90%;"> <h1>数据查询& ...

  2. 《大话设计模式》c++实现 装饰者模式

    一.UML图   介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...

  3. json为txt文本加密

    我们知道json是一种数据传输的加密格式 这里为txt格式的文本加密(纯属无聊)   写的比较凌乱,查找你输入的两个文件夹下面的所有txt文件(包含下一级文件): 运行时要注意,别把重要文件给加密了 ...

  4. 详解Linux下iptables中的DNAT与SNAT设置(转)

    详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下   原文连 ...

  5. SiteCore Experience Analytics-体验分析

    体验分析   Sitecore Experience Analytics为营销人员和营销分析师提供仪表板和报告,以识别从其网站和可能的其他外部数据源收集的体验数据的模式和趋势. 体验分析报告示例:   ...

  6. JavaScript--元素对象方法setAttribute() 和appendChild()

    appendChild() 方法可向节点的子节点列表的末尾添加新的子节点 setAttribute() 方法创建或改变某个新属性.如果指定属性已经存在,则只设置该值 <!DOCTYPE html ...

  7. ecplise问题总结

    ecplise 1.ecplise在运行的时候出现错误 Unable to execute dex: GC overhead limit exceeded GC overhead limit exce ...

  8. Python print 中间换行 直接加‘\n’

  9. bzoj4445 小凸想跑步

    题目链接 半平面交,注意直线方向!!! 对于凸包上任意一条边$LINE(p_i,p_{i+1})$都有$S_{\Delta{p_i} {p_{i + 1}}p} < S_{\Delta{p_0} ...

  10. MaxiSYS Elite

    The Maxisys Elite is Autel UK’s top of the range diagnostic and analysis scanner with advanced J2534 ...