Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组

一、Shell替换:Shell变量替换,命令替换,转义字符

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

举个例子:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. a=10  
  3. echo -e "Value of a is $a \n"  
运行结果:
Value of a is 10
这里 -e 表示对转义字符进行替换。如果不使用 -e 选项,将会原样输出:
Value of a is 10\n

下面的转义字符都可以用在 echo 中:
转义字符 含义
\\反斜杠
\a警报,响铃
\b退格(删除键)
\f换页(FF),将当前位置移到下页开头
\n换行
\r回车
\t水平制表符(tab键) 
\v垂直制表符
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。

命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。

命令替换的语法:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. `command`  
注意是反引号,不是单引号,这个键位于 Esc 键下方。

下面的例子中,将命令执行结果保存在变量中:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. DATE=`date`  
  3. echo "Date is $DATE"  
  4. USERS=`who | wc -l`  
  5. echo "Logged in user are $USERS"  
  6. UP=`date ; uptime`  
  7. echo "Uptime is $UP"  
运行结果:
Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15


变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值 可以使用的变量替换形式:
形式 说明
${var}变量本来的值
${var:-word}如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message}如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word}如果变量 var 被定义,那么返回 word,但不改变 var 的值。

请看下面的例子:
#!/bin/bashecho ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
运行结果:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Variable is not set  
  2. 1 - Value of var is  
  3. Variable is not set  
  4. 2 - Value of var is Variable is not set  
  5. 3 - Value of var is  
  6. This is default value  
  7. 4 - Value of var is Prefix  
  8. Prefix  
  9. 5 - Value of var is Prefix  


二、Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等

Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/bash  
  2. val=`expr 2 + 2`  
  3. echo "Total value : $val"  

运行脚本输出:

Total value : 4
两点注意:
  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符

先来看一个使用算术运算符的例子
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="cpp">#!/bin/sh  
  2. a=10  
  3. b=20  
  4. val=`expr $a + $b`  
  5. echo "a + b : $val"  
  6. val=`expr $a - $b`  
  7. echo "a - b : $val"  
  8. val=`expr $a \* $b`  
  9. echo "a * b : $val"  
  10. val=`expr $b / $a`  
  11. echo "b / a : $val"  
  12. val=`expr $b % $a`  
  13. echo "b % a : $val"  
  14. if [ $a == $b ]  
  15. then  
  16.    echo "a is equal to b"  
  17. fi  
  18. if [ $a != $b ]  
  19. then  
  20.    echo "a is not equal to b"  
  21. fi  

运行结果:
 
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b
注意:
  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
  • if...then...fi 是条件语句,后续将会讲解。

算术运算符列表
运算符 说明 举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 10。
*乘法`expr $a \* $b` 结果为  200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。


关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
先来看一个关系运算符的例子:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. a=10  
  3. b=20  
  4. if [ $a -eq $b ]  
  5. then  
  6.    echo "$a -eq $b : a is equal to b"  
  7. else  
  8.    echo "$a -eq $b: a is not equal to b"  
  9. fi  
  10. if [ $a -ne $b ]  
  11. then  
  12.    echo "$a -ne $b: a is not equal to b"  
  13. else  
  14.    echo "$a -ne $b : a is equal to b"  
  15. fi  
  16. if [ $a -gt $b ]  
  17. then  
  18.    echo "$a -gt $b: a is greater than b"  
  19. else  
  20.    echo "$a -gt $b: a is not greater than b"  
  21. fi  
  22. if [ $a -lt $b ]  
  23. then  
  24.    echo "$a -lt $b: a is less than b"  
  25. else  
  26.    echo "$a -lt $b: a is not less than b"  
  27. fi  
  28. if [ $a -ge $b ]  
  29. then  
  30.    echo "$a -ge $b: a is greater or  equal to b"  
  31. else  
  32.    echo "$a -ge $b: a is not greater or equal to b"  
  33. fi  
  34. if [ $a -le $b ]  
  35. then  
  36.    echo "$a -le $b: a is less or  equal to b"  
  37. else  
  38.    echo "$a -le $b: a is not less or equal to b"  
  39. fi  

运行结果:

10 -eq 20: a is not equal to b
10 -ne 20: a is not equal to b
10 -gt 20: a is not greater than b
10 -lt 20: a is less than b
10 -ge 20: a is not greater or equal to b
10 -le 20: a is less or  equal to b

关系运算符列表
运算符 说明 举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 true。
-ne检测两个数是否相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。


布尔运算符

先来看一个布尔运算符的例子:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. a=10  
  3. b=20  
  4. if [ $a != $b ]  
  5. then  
  6.    echo "$a != $b : a is not equal to b"  
  7. else  
  8.    echo "$a != $b: a is equal to b"  
  9. fi  
  10. if [ $a -lt 100 -a $b -gt 15 ]  
  11. then  
  12.    echo "$a -lt 100 -a $b -gt 15 : returns true"  
  13. else  
  14.    echo "$a -lt 100 -a $b -gt 15 : returns false"  
  15. fi  
  16. if [ $a -lt 100 -o $b -gt 100 ]  
  17. then  
  18.    echo "$a -lt 100 -o $b -gt 100 : returns true"  
  19. else  
  20.    echo "$a -lt 100 -o $b -gt 100 : returns false"  
  21. fi  
  22. if [ $a -lt 5 -o $b -gt 100 ]  
  23. then  
  24.    echo "$a -lt 100 -o $b -gt 100 : returns true"  
  25. else  
  26.    echo "$a -lt 100 -o $b -gt 100 : returns false"  
  27. fi  
运行结果:
10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true
10 -lt 5 -o 20 -gt 100 : returns false

布尔运算符列表
运算符 说明 举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。


字符串运算符

先来看一个例子:
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. a="abc"  
  3. b="efg"  
  4. if [ $a = $b ]  
  5. then  
  6.    echo "$a = $b : a is equal to b"  
  7. else  
  8.    echo "$a = $b: a is not equal to b"  
  9. fi  
  10. if [ $a != $b ]  
  11. then  
  12.    echo "$a != $b : a is not equal to b"  
  13. else  
  14.    echo "$a != $b: a is equal to b"  
  15. fi  
  16. if [ -z $a ]  
  17. then  
  18.    echo "-z $a : string length is zero"  
  19. else  
  20.    echo "-z $a : string length is not zero"  
  21. fi  
  22. if [ -n $a ]  
  23. then  
  24.    echo "-n $a : string length is not zero"  
  25. else  
  26.    echo "-n $a : string length is zero"  
  27. fi  
  28. if [ $a ]  
  29. then  
  30.    echo "$a : string is not empty"  
  31. else  
  32.    echo "$a : string is empty"  
  33. fi  

运行结果:

abc = efg: a is not equal to b
abc != efg : a is not equal to b
-z abc : string length is not zero
-n abc : string length is not zero
abc : string is not empty

字符串运算符列表
运算符 说明 举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -z $a ] 返回 true。
str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

例如,变量 file 表示文件“/var/www/tutorialspoint/unix/test.sh”,它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. file="/var/www/tutorialspoint/unix/test.sh"  
  3. if [ -r $file ]  
  4. then  
  5.    echo "File has read access"  
  6. else  
  7.    echo "File does not have read access"  
  8. fi  
  9. if [ -w $file ]  
  10. then  
  11.    echo "File has write permission"  
  12. else  
  13.    echo "File does not have write permission"  
  14. fi  
  15. if [ -x $file ]  
  16. then  
  17.    echo "File has execute permission"  
  18. else  
  19.    echo "File does not have execute permission"  
  20. fi  
  21. if [ -f $file ]  
  22. then  
  23.    echo "File is an ordinary file"  
  24. else  
  25.    echo "This is sepcial file"  
  26. fi  
  27. if [ -d $file ]  
  28. then  
  29.    echo "File is a directory"  
  30. else  
  31.    echo "This is not a directory"  
  32. fi  
  33. if [ -s $file ]  
  34. then  
  35.    echo "File size is zero"  
  36. else  
  37.    echo "File size is not zero"  
  38. fi  
  39. if [ -e $file ]  
  40. then  
  41.    echo "File exists"  
  42. else  
  43.    echo "File does not exist"  
  44. fi  
[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. </pre><pre code_snippet_id="1663121" snippet_file_name="blog_20160426_11_7216744" name="code" class="cpp" style="background-color: rgb(255, 255, 255);">运行结果:  

File has read access
File has write permission
File has execute permission
File is an ordinary file
This is not a directory
File size is zero
File exists

文件测试运算符列表
操作符 说明 举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是具名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。


三、Shell字符串

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

单引号

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">str</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">'this is a string'</span></li></ol>
单引号字符串的限制:
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">your_name</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">'qinjx'</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">str</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Hello, I know your are </span><span class="sh_specialchar" style="color: rgb(24, 97, 167);">\"</span><span class="sh_string" style="color: rgb(24, 97, 167);">$your_name</span><span class="sh_specialchar" style="color: rgb(24, 97, 167);">\"</span><span class="sh_string" style="color: rgb(24, 97, 167);">! </span><span class="sh_specialchar" style="color: rgb(24, 97, 167);">\n</span><span class="sh_string" style="color: rgb(24, 97, 167);">"</span></li></ol>
双引号的优点:
  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">your_name</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"qinjx"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">greeting</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"hello, "</span><span class="sh_variable" style="color: rgb(0, 0, 255);">$your_name</span><span class="sh_string" style="color: rgb(24, 97, 167);">" !"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">greeting_1</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"hello, ${your_name} !"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_variable" style="color: rgb(0, 0, 255);">$greeting</span> <span class="sh_variable" style="color: rgb(0, 0, 255);">$greeting_1</span></li></ol>

获取字符串长度

复制纯文本新窗口
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">string</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"abcd"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_variable" style="color: rgb(0, 0, 255);">${#string}</span> <span class="sh_comment" style="color: rgb(56, 173, 36);">#输出 4</span></li></ol>

提取子字符串

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">string</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"alibaba is a great company"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_variable" style="color: rgb(0, 0, 255);">${string:1:4}</span> <span class="sh_comment" style="color: rgb(56, 173, 36);">#输出liba</span></li></ol>

查找子字符串

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">string</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"alibaba is a great company"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo `expr index <span class="sh_string" style="color: rgb(24, 97, 167);">"$string"</span> is`</li></ol>


四、Shell数组:shell数组的定义、数组长度

Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
    array_name=(value1 ... valuen)
例如:

<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">array_name</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=(</span>value0 value1 value2 value3<span class="sh_symbol" style="color: rgb(48, 48, 238);">)</span></li></ol>
或者
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">array_name</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=(</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">value0</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">value1</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">value2</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">value3</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_symbol" style="color: rgb(48, 48, 238);">)</span></li></ol>

还可以单独定义数组的各个分量:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">array_name<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">0</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span>value0</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">array_name<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">1</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span>value1</li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">array_name<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">2</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span>value2</li></ol>
可以不使用连续的下标,而且下标的范围没有限制。

读取数组

读取数组元素值的一般格式是:
    ${array_name[index]}
例如:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">valuen</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_variable" style="color: rgb(0, 0, 255);">${array_name[2]}</span></li></ol>
举个例子:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_comment" style="color: rgb(56, 173, 36);">#!/bin/sh</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">0</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Zara"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">1</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Qadir"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">2</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Mahnaz"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">3</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Ayan"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">4</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Daisy"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_string" style="color: rgb(24, 97, 167);">"First Index: ${NAME[0]}"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_string" style="color: rgb(24, 97, 167);">"Second Index: ${NAME[1]}"</span></li></ol>
运行脚本,输出:
$./test.sh
First Index: Zara
Second Index: Qadir
使用@ 或 * 可以获取数组中的所有元素,例如:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">${array_name[*]}</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">${array_name[@]}</span></li></ol>
举个例子:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_comment" style="color: rgb(56, 173, 36);">#!/bin/sh</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">0</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Zara"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">1</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Qadir"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">2</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Mahnaz"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">3</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Ayan"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">NAME<span class="sh_symbol" style="color: rgb(48, 48, 238);">[</span><span class="sh_number" style="color: rgb(50, 186, 6);">4</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">]=</span><span class="sh_string" style="color: rgb(24, 97, 167);">"Daisy"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_string" style="color: rgb(24, 97, 167);">"First Method: ${NAME[*]}"</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;">echo <span class="sh_string" style="color: rgb(24, 97, 167);">"Second Method: ${NAME[@]}"</span></li></ol>
运行脚本,输出:
$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:
<ol class="snippet-num" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 20px; padding-top: 3px !important; padding-right: 8px !important; padding-bottom: 3px !important;"><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_comment" style="color: rgb(56, 173, 36);"># 取得数组元素的个数</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">length</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_variable" style="color: rgb(0, 0, 255);">${#array_name[@]}</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_comment" style="color: rgb(56, 173, 36);"># 或者</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">length</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_variable" style="color: rgb(0, 0, 255);">${#array_name[*]}</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_comment" style="color: rgb(56, 173, 36);"># 取得数组单个元素的长度</span></li><li style="padding-left: 8px; list-style: decimal-leading-zero outside none;"><span class="sh_variable" style="color: rgb(0, 0, 255);">lengthn</span><span class="sh_symbol" style="color: rgb(48, 48, 238);">=</span><span class="sh_variable" style="color: rgb(0, 0, 255);">${#array_name[n]}</span></li></ol>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell 脚本知识回顾 (二) —— Shell变量

一、Shell变量&#xff1a;Shell变量的定义、删除变量、只读变量、变量类型 Shell支持自定义变量。定义变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff09;&#xff0c;如&#xff1a; [cpp] view plaincopy variableName"value" 注意&…

Shell 脚本知识回顾 (一) —— 基础篇

一、Shell简介&#xff1a;什么是Shell&#xff0c;Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序&#xff0c;它是用户使用Unix/Linux的桥梁&#xff0c;用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言&#xff0c;又是一种程序设计语言。作为命令…

红帽集群RHCS

1、简介&#xff1a;RHCS是RedHatClusterSuite的缩写&#xff0c;也就是红帽子集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&#xff0c;可以给web应用、数据库应用…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…

《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?

《在你身边&#xff0c;为你设计》-前端UI必读出自腾讯CDChttp://cdc.tencent.com/?p6761今天听同事说这本书写的非常好&#xff0c;改变了他关于前端UI的许多看法&#xff0c;可谓&#xff1a;醍醐灌顶。可惜我网上找了下都需要Money买&#xff0c;哪位有在线阅读、PDF下载地…

一、OpenStack架构

DashBoardHorizon提供WEB界面ComputerNova计算也就是虚拟机NetworkingNeutron提供给nova网络支持Object StorageSwift提供对象存储Block StorageCinder提供云硬盘给nova&#xff0c;同时备份到SwiftIdentity SserviceKeystone提供所有组件的认证Image ServiceGlance提供给nova镜…

Java 三大特性 —— 多态

Java中多态性的实现 一、什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应…

linux /proc/cpuinfo文件分析

为什么80%的码农都做不了架构师&#xff1f;>>> 基于不同指令集&#xff08;ISA&#xff09;的CPU产生的/proc/cpuinfo文件不一样&#xff0c;基于X86指令集CPU的/proc/cpuinfo文件包含如下内容&#xff1a; processor  &#xff1a; 0vendor_id  &#xff1a;…

Java 高级类(下) —— 内部类和匿名类

Java内部类&#xff08;Inner Class&#xff09;&#xff0c;类似的概念在C里也有&#xff0c;那就是嵌套类&#xff08;Nested Class&#xff09;&#xff0c;乍看上去内部类似乎有些多余&#xff0c;它的用处对于初学者来说可能并不是那么显著&#xff0c;但是随着对它的深入…

Java 高级类(上) —— 抽象类和接口

在面向对象的概念中&#xff0c;我们知道所有的对象都是通过类来描绘的&#xff0c;但是并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、 设…

【Git入门之五】版本管理

2019独角兽企业重金招聘Python工程师标准>>> 1.版本回退 我们先看一下从项目开始到现在做了什么操作。 [cpp] view plaincopy #总共是4个操作 $ git log --prettyoneline c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03 a25c58804cb3f4045564fc0e…

Java 进阶——单例模式

一、单例模式概念及特点 Java中单例模式是一种常见的设计模式&#xff0c;单例模式分三种&#xff1a;懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点&#xff1a; 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其…

Java 关键字—— static 与 final

static表示“全局”或者“静态”的意思&#xff0c;用来修饰成员变量和成员方法&#xff0c;也可以形成静态static代码块&#xff0c;但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说&#xff0c;它不依赖类特定的实例&am…

Java 三大特性之——继承

继承(inheritance)是面向对象的重要概念。继承是除组合(composition)之外&#xff0c;提高代码重复可用性(reusibility)的另一种重要方式。我们在组合(composition)中看到&#xff0c;组合是重复调用对象的功能接口。我们将看到&#xff0c;继承可以重复利用已有的类的定义。 类…

基于Linux的 Open×××网络之网络架构应用实例

基于Linux的 Open网络之网络架构应用实例Open 概述Open 是一个开源的加密隧道构建工具&#xff0c;基于 OpenSSL 的 SSL/TLS 协议&#xff0c;可以在 Internet中实现点对点的 SSL 安全连接。使用 Open 的好处是安全、易用和稳定&#xff0c;且认证方式灵活&#xff0c;具备实现…

Java 进阶——自动装箱和自动拆箱

1、什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候&#xff0c;我们会这样&#xff1a; Class a new Class(parameter); 当我们创建一个Integer对象时&#xff0c;却可以这样&…

基于KVM的虚拟化研究及应用

引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM&#xff0f;370大型机上&#xff0c;这项技术极大地提高了大型机资源利用率。随着软硬件技术的迅速发展&#xff0c;这项属于大型机及专利的技术开始在普通X86计算机上应用并成为当前计算机发展和研究的一个热点方向。目前&am…

Java 进阶—— super 和 this 的用法

一、this Java关键字this只能用于方法方法体内。当一个对象创建后&#xff0c;Java虚拟机&#xff08;JVM&#xff09;就会给这个对象分配一个引用自身的指针&#xff0c;这个指针的名字就是this。因此&#xff0c;this只能在类中的非静态方法中使用&#xff0c;静态方…

unity中脚本编辑器UnIDE

引言 unity默认脚本编辑器是MonoDevelop&#xff0c;随着unity4.3面世&#xff0c;MonoDevelop (4.0.1)版本也随之而来&#xff0c;更新为界面更改和bug自动修复功能等&#xff0c;具体还未使用。 点击unity的Edit下的属性(preference)&#xff0c;可以更改默认脚本编辑器&…

apk,task,进程区别

2019独角兽企业重金招聘Python工程师标准>>> apk&#xff0c;task&#xff0c;进程区别 apk一般占一个dalvik,一个进程&#xff0c;一个task。通过设置也可以多个进程,占多个task。 task是一个activity的栈&#xff0c;其中"可能"含有来自…