跟着RUNOOB网站的教程学习的笔记

shell变量

shell变量的命名

定义变量时,变量名不加美元符号($,PHP语言中需要),如:

name="runoob"

注意,变量名与等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的

命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字母不能以数字开头。
  • 中间不能有空格,可以使用下划线代替你想要的空格(例如your_name)。
  • 不能加标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

shell变量的使用

使用一个定义过的变量,只要在变量名前加美元符号即可,如:

your_name="runoob"
echo $your_name
echo ${your_name}

变量名外面加花括号是可选的,加不加都可以,加花括号是为了帮助解释器识别变量的边界,比如

下面这种情况:

for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成

一个变量(其值为空),代码执行结果就不是我们期待的样子了。

推荐给所有的变量加上花括号,这是一个好的编程习惯。

已经被定义的变量可以被重新定义,如:

your_name="runoob"
echo $your_name
your_name="alibaidu"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaidu",使用变量的时候才加美元符号。

只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.baidu.com"

删除变量

使用unset命令可以删除变量

unset variable_name

变量被删除后不能再次使用。unset命令不能删除只读变量

#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo myUrl

以上实例没有输出任何结果

变量类型

运行shell时,会同时存在三种变量:

  • 局部变量:在脚本或者命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问变量
  • 环境变量:所有程序,包括shell启动程序,都能访问环境变量,有些程序需要环境变量来保证其运行。必要的时候shell脚本也可以定义环境变量。
  • shell变量:是由shell脚本程序设置的特殊变量。shell变量中有一部分是环境变量有一部分是局部变量,这些变量保证了shell的正常运行

shell字符串

字符串是shell编程中最常用的数据类型(除了数字和字符串,业没啥其他类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单引号和双引号的区别和PHP类似。

单引号

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串的变量时无效的;
  • 单引号字符串中不能出现单独一个单引号(对单引号使用转义字符后也不行),但可成对出现,作为字符串拼接使用

双引号

your_name='runoob'
str="Hello, I konw you are \"$your_name\"! \n"
echo $str

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

your_name='runoob'
#使用双引号拼接
greeting="hello, "$your_name" ."
greeting_1="hello, ${your_name} ."
echo $greeting $greeting_1
#使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hellow. ${your_name} !'
echo $greeting_2 $greeting_3

获取字符串长度

string="abcd"
echo ${#string}

输出4

提取子字符串

以下实例从字符串第2个字符开始截取4个字符:

string="runoob is a great site"
echo ${string::}

查找子字符串

查找字符i或o的位置(哪个字母先出现就计算哪个)

string="runoob is a great site"
echo `expr index "$string" io`

注意:以上脚本中`是反引号,不是单引号

shell数组

bash支持一维数组(不支持多维数组),而且没有限定数组的大小

类似C语言,获取数组元素要利用下标,下标可以是整数或者算数表达式,其值应大于或等于0

定义数组

在shell中,用括号来表示数组,数组元素用“空壳”符号来分割。定义 数组的一般形式为:

数组名=(值1 值2 值3)

例如:

array_name=(value1 value2 value3)

或者

array_name=(
value0
value1
value2
)

还可以单独定义数组的各个分量:

array_name[]=value0
array_name[]=value1
array_name[]=value2

可以不使用连续的下标,而且下标的范围没有限制

读取数组

读取数组元素值得一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用@符号可以获取数组的所有元素,例如

echo ${array_name[@]}

获取数组的长度

获取数组字符串长度的方法与获取字符串长度的方法相同,例如:

#取得数组元素的个数
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得数组单个元素的长度
length=${#array_name[n]}

shell注释

以#开头的行就是注释行,会被解释器忽略

sh里没有多行注释,只能每一行加一个#号。

如果在开发过程中遇到大段的代码需要注释,可以将所需要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达和注释一样的效果。

多行注释

多行注释还可以使用以下格式:

:<<EOF
注释1
注释2
注释3
EOF

EOF也可以使用其它符号

shell脚本学习-变量的更多相关文章

  1. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  2. shell脚本学习总结02--数组

    bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ...

  3. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  4. shell脚本学习之6小时搞定(1)

    shell脚本学习之6小时搞定(1) 简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把 ...

  5. 笔记——shell脚本学习指南

    <shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...

  6. Shell 脚本学习资料搜集

    Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...

  7. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  8. Shell脚本学习 - 运算符

    继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...

  9. shell脚本-高级变量

    shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...

随机推荐

  1. json null

    { "ResourceId": 0, "JsonKey": "Account", "GroupId": 21, &quo ...

  2. sharepoint环境安装过程中几点需要注意的地方

    写在前面 上篇文章也说明了,在安装sharepoint环境的时候,确实吃了不少苦头,这里纪录一下安装过程中遇到的几个问题. 安装环境 windows server 2012 r2 standard x ...

  3. 第三章 FFmpeg转封装

    3.1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件. 3.1.1 MP4格式标准介绍 MP4文件由多个Box与FullBox组成 每个Box由Header和Data两部 ...

  4. Node学习笔记(三)

    1.EventEmitter常用的API EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener. E ...

  5. 汉化-PowerDesigner 16.5 汉化

    转载: https://www.cnblogs.com/yeaicc/p/PowerDesigner16CN.html 一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后, ...

  6. 性能测试day07_性能瓶颈和分析

    其实如果之前都做的很到位的话,那么再加上APM工具(dynaTrace等),监控到非常细节,那么我们跑一个业务,我们就能完全清楚的知道每个请求的时间,也能知道请求所产生sql的时间,这样你自然而然都知 ...

  7. mysql5.7.18.1修改用户密码报错ERROR 1054 (42S22): Unknown column 'password' in 'field list'解决办法

    本意向修改一个用户的密码,网上搜到的命令为如下 mysql> update user set password=password(“新密码”) where user=”用户名”; 执行后报错 E ...

  8. Entity Frame Code First 简易教程

    简介 什么是ORM 搭建Entity FrameWork CodeFirst应用 数据库迁移 表属性常见配置 Entity FrameWork 一对多.多对多 一.简介 Entity Framewor ...

  9. 一个判断I2C总线通信异常原因的方法

    此问题由某客户提出,应用处理器 AP与 MCU进行 I2C通信,通信会经常发生异常,需要定位原因. 首先需要定位的是因为哪个器件发的波形不正确导致通信异常,所以我们在 I2C 线路上增加了以下处理,增 ...

  10. 预浸料(Prepreg,PreimpregnatedMaterials)

    预浸料(Prepreg,PreimpregnatedMaterials),是把基体(Matrix)浸渍在强化纤维(Reinforced Fiber)中制成的预浸片材产品,是复合材料的中间材料.