shell编程(超详细)

  • Post category:Linux

Shell变量

变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。

当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。

定义变量

shell支持一下三种定义方式:

variable=value
variable='value'
variable="value"

variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的

注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

Shell变量的命名规范和大部分编程语言都一样:

  • 变量由数字、字母和下划线组成
  • 必须以字母或者下划线开头
  • 不能使用Shell里的关键字(通过help命令可以查看保留关键字)

变量定义举例:

url=https://www.cnblogs.com/liyugui/
echo $url
name='Agui'
echo $name
author="cyyzww"
echo $author

使用变量

使用一个定义过的变量,只要在变量前面加上$就可以了,例:

name="Agui"
echo $name
echo ${name}

其中{}是可选的,加不加都可以,主要是为了帮助解释器识别变量的边界,例:

skill='Java'
echo "I am good at ${skill}Script"

如果不给skill加上{}结果就会变成I am good at $skillScript,所以在使用时需要多加注意

修改变量的值

已定义的变量,可以被重新赋值,例:

url="https://www.cnblogs.com/liyugui/"
echo $url
url="change"
echo $url

单引号和双引号的区别

变量赋值的时候可以使用单引号也可以使用双引号,那么二者有什么区别呢?从下面的代码中来说明看看:

#!/bin/bash

url="https://www.cnblogs.com/liyugui/"
out1='Agui's blog ${url}'
out2="Agui's blog ${url}"
echo $out1
echo $out2

输出结果:

Agui's blog ${url}
Agui's blog https://www.cnblogs.com/liyugui/

以单引号''包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量或是命令(命令需要反引起来)也会把它们按照原样进行输出。这种方式比较适合显示纯字符串的情况,即不希望解析变量、命令的场景。

以双引号""包围变量的值时,输出会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合于字符串中附带有变量和命令并且想要解析后在输出定义。

平时在对变量进行赋值时,如果是数字,那么可以不加引号;除非真的需要原样输出,否则习惯性的使用双引号,定义变量使用双引号是最常见的使用场景

将命令的结果赋值给变量

Shell 也支持将命令的结果赋值给变量,主要有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

只读变量

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

#!/bin/bash
url="https://www.cnblogs.com/liyugui/"
readonly url
url="change"

运行脚本,结果如下:

bash: url: This variable is readonly.

删除变量

使用unset可以删除变量,例:

unset variable

变量被删除之后无法再次使用,unset命令不能删除只读变量