Shell学习之路-(03-变量、字符串、数组)

来源:互联网 发布:淘宝网返现怎么收款 编辑:程序博客网 时间:2024/05/01 14:29

变量、字符串、数组

1.变量

1.1 常规变量

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

定义变量时,变量名不加美元符号($),如:

variableName="value"

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,{}可加可不加,如:

your_name="mozhiyan"echo $your_nameecho ${your_name}

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

myUrl="http://see.xidian.edu.cn/cpp/linux/"echo ${myUrl}myUrl="http://see.xidian.edu.cn/cpp/shell/"echo ${myUrl}

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

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

#!/bin/bashmyUrl="http://see.xidian.edu.cn/cpp/shell/"readonly myUrlmyUrl="http://see.xidian.edu.cn/cpp/danpianji/"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

使用 unset 命令可以删除变量。语法:

unset variable_name

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

举个例子:

#!/bin/shmyUrl="http://see.xidian.edu.cn/cpp/u/xitong/"unset myUrlecho $myUrl

上面的脚本没有任何输出。

1.2 特殊变量

变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。 $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

例:

#!/bin/bashecho "File Name: $0"echo "First Parameter : $1"echo "First Parameter : $2"echo "Quoted Values: $@"echo "Quoted Values: $*"echo "Total Number of Parameters : $#"

运行结果:

$./test.sh Zara AliFile Name : ./test.shFirst Parameter : ZaraSecond Parameter : AliQuoted Values: Zara AliQuoted Values: Zara AliTotal Number of Parameters : 2

@ 的区别

@ 都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以”1""2” … “$n” 的形式输出所有参数。

但是当它们被双引号(” “)包含时,”""1 2n”的形式输出所有参数;”@""1” “2""n” 的形式输出所有参数。

2.字符串

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

2.1 单引号

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

例:

str='this is a string'

2.2 双引号

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

例1:

your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"

例2:

your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1

2.3 获取字符串长度

长度的获取及通过上面的特殊变量$#演变来的

string="abcd"echo ${#string} 

2.4 提取子字符串

例1,截取1-4,三个字符串,注意两种方式的起始位计算方式是不一样的,一种是从0开始,一种是从1开始。

string="alibaba is a great company"echo ${string:1:4} 或者echo `expr substr "$string" 2 4`

例2,截取1后面的全部字符

 echo ${string:1}

2.5 查找子字符串

查找首字母所在的位置,例:

string="alibaba is a great company"echo `expr index "$string" is`echo `expr index "$string" llll`echo `expr index "$string" bjhjkhjkhj`echo `expr index "$string" gg`

结果:

32414

可以看出,该函数只检测第一字母第一次出现的位置。

3.数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

3.1 定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。

定义数组的一般形式为:array_name=(value1 ... valuen)例如:

array_name=(value0 value1 value2 value3)或者array_name=(value0value1value2value3)

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

array_name[0]=value0array_name[1]=value1array_name[2]=value2

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

3.2 读取数组

读取数组元素值的一般格式是:${array_name[index]}例如:

valuen=${array_name[2]}

举个例子:

#!/bin/shNAME[0]="Zara"NAME[1]="Qadir"NAME[2]="Mahnaz"NAME[3]="Ayan"NAME[4]="Daisy"echo "First Index: ${NAME[0]}"echo "Second Index: ${NAME[1]}"

运行脚本,输出:

$./test.shFirst Index: ZaraSecond Index: Qadir

使用@ 或 * 可以获取数组中的所有元素,例如:

${array_name[*]}${array_name[@]}

举个例子:

#!/bin/shNAME[0]="Zara"NAME[1]="Qadir"NAME[2]="Mahnaz"NAME[3]="Ayan"NAME[4]="Daisy"echo "First Method: ${NAME[*]}"echo "Second Method: ${NAME[@]}"

运行脚本,输出:

$./test.shFirst Method: Zara Qadir Mahnaz Ayan DaisySecond Method: Zara Qadir Mahnaz Ayan Daisy

3.3 获取数组的长度

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

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

变量、字符串、数组的分析就到这边,有感悟时会持续会更新。

注:以上内容来自C语言中文网及本人在使用过程的一些理解整理。如有侵权,请及时通知我,我将马上删除,如有错误之处也请指出,进行探讨学习。文章只是起一个引导作用,详细的数据解析内容还请查看Shell相关教程,感谢您的查阅。

0 0
原创粉丝点击