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

不分!

shell编程中 不分数据类型, 所有的变量都 是字符串. 要进行 数值 / 数字的 整数运算, 就要用let, expr, (( ))等方式进行!

另外, shell中 只能处理整数, 不能处理 浮点数. 要用浮点运算, 需要用bc 程序

双小括号的使用

[foo@localhost ~]$ myfunc () {
> local i=0
> (( i++ ))
> echo $i
> }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( ++i )); echo $i; }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( --i )); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$ myfunc () { local i=0; ((--i)); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$

miscellaneous杂项

  1. $! 和!$的区别, 只要搞清楚, 以$开头的表示 是变量, 是特殊变量, 而以! 开头的是 "历史命令 designator指示器" 就能够分清楚了,所以$! 是 显示 上一次"后台运行的"命令的pid进程id,注意是后台运行的进程id, 如果不是后台运行的,则是当前shell进程中执行命令, 所以 echo $! 就是显示为空的. 那么用 echo $$ 就可以显示当前进程的pid:



    而!$ 则是表示上一次命令的参数.

  2. print和 printf的区别?

    shell中没有print这个命令!

    只有printf这个命令,格式是: printf <format> [args], 格式中 \n是换行, 默认的printf是不换行的. %s是输出字符串. %d其实也没有用.

  3. let是返回 被赋值的 变量的内容, 如果没有变量被赋值, 则返回的是 多个表达式中, 最后一个表达式的值. 而expr才是返回 表达式的值.

  4. 定义函数/ 执行多个命令序列的时候, 如果写在 同一行中, 一定要 在每条命令的最后 加上 分号, 否则会出错.

  5. eval命令?

    eval主要是用在"复杂变量" "间接引用变量"的解析上, 会对命令行进行 两次扫描, "两次解析", 第一次进行变量的值替换, 第二次是对替换后的 内容进行解析"执行", 如果替换后的内容,是可以执行的命令, 则执行该命令; 如果是可以显示的变量, 则输出该变量的值.

    eval后要不要 echo?

    注意, 如果是替换后的"字符串内容"是可以执行的命令, 则不要echo, 否则还是显示字符串, 而不是执行命令

    如果替换后的内容是 变量, 通常是: "$$x", 前一个$是转义表示本义的$, 后面的$x则是要替换的变量. 这时则要用 echo.



#!/bin/bash要加空格吗?

在.sh脚本中, 第一行是 #!/bin/bash. 通常在#! 和/bin/bash之间不要加空格. 你所看到的基本都没有的.虽然加上空格也没有什么区别, 但是显得不正规.


在双引号(( i=0; i<$j; i++ )) 中, 最后一个语句 i++ 一定不能加 分号, 否则会报错, 而其中的变量引用 $j可以 可以不加$. 但是 i<$j中, i不能加$, 否则会出错

下面是一个打印三角形的小片段:

#!/bin/bash

# print reverse triangle stars

read -p 'enter star lines: '  line

for (( i=1; i<$line; i++ ))  //i++ 后面不能加分号, 否则会出错, 里面的$line,$可以省略; i=1, 这里i要从1 开始, 以免在下面打印星号的时候, 第一行会打印出空行
do # print spances before stars for (( nspace=line-i; nspace>0; nspace-- ))
do
echo -n ' '
done # print stars for (( j=2*i-1; j>0; j-- ))
do
echo -n '*'
done echo // 这里的echo是为了换行 done

注意, 在C 语言中, 每个语句后面都要加分号, 必须的! 但是, shell语句, 如果单独一行的话, 是可以/不必加分号的, 但是如果多个语句在一行, 则必须要加分号.


bash中的双中括号 [[ ]] 用法 参考: http://www.cnblogs.com/xkfz007/archive/2011/10/13/2209563.html https://www.dwhd.org/20150708_211624.html http://www.jb51.net/article/60326.htm

  1. 双中括号, 仅仅是: 单中括号的扩展. 两个方面的内容

    一是: 可以用于字符串的比较, (像1, 2, 10, 20)等, 只要不是在 let expr中, 都是字符串, 可以叫 "数字字符串", 数字字符串的比较 跟 "数值比较, 数学比较" 是一样的. 用于条件判断. 可以使用于 关系比较和逻辑运算.


shell中的变量其实还是分 数据类型的, 根据你的操作命令,和 操作方式, 共有三种: 整数变量, 字符串变量, 文件变量.

shell中双小括号的用法, 有了双小括号, [[, [, test逻辑运算和let express等都 可以抛到一边了.


shell中的大括号的使用

第一, 作为"模板变量替换"使用 参考: https://www.dwhd.org/20150708_211624.html

大括号用来表示替换, 有点类似于php等脚本语言中的模板变量替换, 这种变量替换, 必须在大括号前面加上$符号(加上$符号, 这样才算是一个变量!), 才能替换, 否则,不会替换,而只是把整个大括号的内容作为一个整体的命令来解析.

注意, 整个${var:C string}, 只是替换, 最后 这个整体得到的是, 只是替换后的一个 字符串! 注意只是一个字符串, 因此, 你要用另外的命令, 来操作这个字符串, 否则, 只有字符串, shell会提示: "stirng is not a command! "

注意, 后面的替换字符串, 如果只是一个单词, 则可能会执行, 但是, 如果是带有 参数的 多个单词 的命令, 则可能不会执行!




${var: C string }, 这个表示的是 替换. 意思是当条件C 满足时,才用string替换, 否则就不 替换(还是为$var的值)

其中: -: 表示var为空的时候, 替换,

+: 表示var不为空的时候替换

=: 表示var为空的时候, 替换, 而且var 被替换为string.

? : 表示判断var是否为空, 如果不为空, 就等于$var的值, 如果为空, 就从标准错误输出string的值, 然后退出.


${var:C string}, 的string, 不一定只是变量 , 还可以是 $var, 也可以是 一个命令的输出.

比如:

echo ${var:-$foo} echo ${var:-$(date +%F)} 其中%F, 表示, full date, 完全/全部日期, %F = %Y-%m-%d.

但是需要注意的是, 在替换表达式中, 各个符号之间不能由空格, 否则,就返回 空字符串:

第二, 大括号表示模式删除, 模式去除. 其中 %表示去掉以模式结尾的部分; # 表示去除以模式开始的部分. 两个符号%%, ## 则是贪婪(最大化)匹配.

第三, 大括号表示"分配律", 分别多次多项匹配:

{1,2,3,a,b} =1, 2, 3, a,b {1, 2, 3}.txt= 1.txt 2.txt 3.txt

{1..5}.txt=1.txt 一直到 5.txt.

中括号表示多个中的一个, 而大括号表示所有的大括号中的项目都有效.

注意的是, 表示分配绿的各项之间不能有空格, 否则大括号表示的意义就没有了. 表示范围的.., 前后的两项要是单个的数字或字母, 不能是双个的字母,因为双个的字母没有办法排序.

shell编程中的单/双 小括号, 中括号, 大括号的更多相关文章

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

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

  2. Linux Shell基础 单引号、双引号、反引号、小括号和大括号

    单引号和双引号 单引号和双引号用于变量值出现空格时将字符用引号括起来. 二者的主要区别在于, 被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义: 被双引号括起来的字符中,"$& ...

  3. shell编程中的if语句

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

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

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

  5. Shell编程中Shift的用法

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

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

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

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

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

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

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

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

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

随机推荐

  1. object base基类分析

    uvm_object,是所有uvm data和hierarchical class的基类,实现了copy,compare,print,record之类的函数 扩展类中必须实现create和get_ty ...

  2. SlimScroll插件学习

    SlimScroll插件学习 SlimScroll插件,是一个很好用的滚动条插件. 第一个实例程序: js代码: <script src="../slimScroll/jquery-3 ...

  3. Python - 1. Built-in Atomic Data Types

    From:http://interactivepython.org/courselib/static/pythonds/Introduction/GettingStartedwithData.html ...

  4. 20155228 2017-5-10 课堂测试:MySort

    20155228 2017-5-10 课堂测试:MySort 题目和要求 模拟实现Linux下Sort-t:-k2的功能.参考Sort的实现.提交码云链接和代码运行截图. import java.ut ...

  5. ssh 免登录

    1. 生成 ssh 公钥和私钥 xiluhua@vm-xiluhua ~ $ ssh-keygen Generating public/private rsa key pair. Enter file ...

  6. flask 操作数据库(分类)

    数据库 数据库是大多数动态web程序的基础设施,只要你想把数据存下来,就离不开数据库. 这里所说的数据库指的是有存储数据的单个或多个文件组成的集合,它是一种容器,可以类比文文件柜.而人们通常使用数据库 ...

  7. php ci nginx 伪静态rewrite配置方法

    php ci nginx 伪静态rewrite配置方法 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$ ...

  8. AtCoder Beginner Contest 045 B - 3人でカードゲームイージー / Card Game for Three (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice, Bob and Charlie ...

  9. eclipse格式化代码样式

    1.Window->Preferences //Java 格式化 2.Java->Code Style->Formatter->New->Edit->Line Wr ...

  10. WTL CHyperLink类的使用(超链接)

    1.包含atlctrlx.h头文件: 2.声明一个CHyperLink类的变量: CHyperLink        m_linkIntro; 3.在OnInitDialog函数里: m_linkIn ...