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

题图:gratisography

变量、字符串、数组

1.变量

1.1 常规变量

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

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

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

variableName="value"

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

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

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

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

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

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

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

运行脚本,结果如下:

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

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

unset variable_name

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

举个例子:

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

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

1.2 特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $*稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

例:

#!/bin/bash
echo "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 Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

$* 和 $@ 的区别

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

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$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`

结果:

3
2
4
14

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

3.数组

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

3.1 定义数组

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

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

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

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

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

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

3.2 读取数组

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

valuen=${array_name[2]}

举个例子:

#!/bin/sh
NAME[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.sh
First Index: Zara
Second Index: Qadir

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

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

举个例子:

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

运行脚本,输出:

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

3.3 获取数组的长度

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,272评论 0 4
  • 天上的繁星未启开生命的阀门,地上的重门未囚住伤心人的灵魂。如果再一次的选择,谁也不会再次踏入眼泪和情感汇聚的红尘...
    竹鸿初阅读 420评论 2 4
  • #死磕设计#,2016的第一个阅读主题;第一本书,《至关重要的设计》,作者罗伯特-布伦纳,前苹果的首席设计师; 整...
    peace_lee阅读 999评论 1 0
  • tyger老师课程的内容,就像是雕玉成器的过程。 这节课代词有门道。细化地讲解代词你、我、他在...
    bd262e01cc14阅读 264评论 0 0