赞
踩
Shell的3种变量:
(1)局部变量:除了本地变量外,还有shell脚本中定义的变量。
(2)全局变量:和局部变量相对。比如环境变量就是一种全局变量。
(3)特殊变量:shell内置的、具有特殊功能的变量。
根据变量的作用域可以将 shell变量分为:全局变量、局部变量、环境变量,其中:
Shell特殊变量:主要用于传递参数的。
shell内置的特殊参数变量主要有:
Shell $*和$@之间的区别:
所以当我们echo $* 和 echo$@时,看不出什么区别,但是当我们使用for循环逐个输出数据时,区别就出来了。
shell内置的特殊状态变量主要有:
Shell 支持不同类型的变量,下面是一些最常用的数据类型。
字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一。
字符串可以由单引号’ '包围,也可以由双引号" "包围,也可以不用引号。它们之间是有区别的。
三种形式的区别:
(1) 由单引号’ '包围的字符串
(2) 由双引号" "包围的字符串
(3) 不被引号包围的字符串
在脚本语言中,字符串的拼接(也称字符串连接或者字符串合并)往往都非常简单。
在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接,非常简单粗暴。
示例如下:
#!/bin/bash name="Shell" url="http://www.baidu.com" str1=$name$url #中间不能有空格 str2="$name $url" #如果被双引号包围,那么中间可以有空格 str3=$name": "$url #中间可以出现别的字符串 str4="$name: $url" #这样写也可以 str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号 echo $str1 echo $str2 echo $str3 echo $str4 echo $str5
在 Shell 中,通过 ${#string_name} 来获取字符串长度。
示例如下:
#!/bin/bash
url="http://www.baidu.com"
echo ${#url} # 20
# 变量为字符串时,${#string_name} 等价于 ${#string_name[0]}
echo ${#url[0]} # 20
Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
指定起始位置时,可以从字符串左边开始计数,也可以从字符串右边开始计数。
(1) 从字符串左边开始计数
从字符串的左边开始计数,格式如下:${string: start :length}
其中:
示例如下:
#!/bin/bash
url="http://www.baidu.com"
echo ${url: 2: 9}
echo ${url: 3} #省略 length,截取到字符串末尾
(2)从右边开始计数
从字符串的右边开始计数,格式如下:${string: 0-start :length}
格式中多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
需要注意:
示例如下:
#!/bin/bash
url="http://www.baidu.com"
echo ${url: 0-13: 9}
echo ${url: 0-13} #省略 length,直接截取到字符串末尾
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。
Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
(1)使用 # 号截取右边字符
使用#号可以截取指定字符(或者子字符串)右边的所有字符,格式如下:${string#*chars}
其中:
使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。
示例如下:
#!/bin/bash
url="http://www.baidu.com"
echo ${url#*:}
echo ${url#*p:}
echo ${url#*ttp:}
如果不需要忽略 chars 左边的字符,那么也可以不写*。
示例如下:
#!/bin/bash
url="http://www.baidu.com"
echo ${url#http://}
echo ${url#*/}
注意:
以上写法遇到第一个匹配的字符(子字符串)就结束了。
如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用##,格式为:${string##*chars}
示例如下:
#!/bin/bash
url="http://www.baidu.com"
url="http://c.biancheng.net/index.html"
echo ${url#*/} #结果为 /c.biancheng.net/index.html
echo ${url##*/} #结果为 index.html
str="---aa+++aa@@@"
echo ${str#*aa} #结果为 +++aa@@@
echo ${str##*aa} #结果为 @@@
(2)使用 % 截取左边字符
使用%号可以截取指定字符(或者子字符串)左边的所有字符,格式如下:${string%chars*}
注意*的位置,
因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*应该位于 chars 的右侧。
示例如下:
#!/bin/bash
url="http://www.baidu.com"
url="http://c.biancheng.net/index.html"
echo ${url%/*} #结果为 http://c.biancheng.net
echo ${url%%/*} #结果为 http:
str="---aa+++aa@@@"
echo ${str%aa*} #结果为 ---aa+++
echo ${str%%aa*} #结果为 ---
在一些Shell中,你可以使用 declare 或 typeset 命令来声明整数变量。这样的变量只包含整数值。
示例如下:
#!/bin/bash
declare -i my_integer=42
echo ${my_integer}
my_integer=hello
echo ${my_integer}
这样的声明告诉 Shell 将 my_integer 视为整数,如果尝试将非整数值赋给它,Shell会尝试将其转换为整数。
数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Bash Shell 只支持一维数组(不支持多维数组),并且没有限制数组的大小,理论上可以存放无限量的数据。
Shell 数组元素的下标也是从 0 开始计数。获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式0。
在 Shell 中,用括号 ( ) 来表示数组,数组元素之间用空格来分隔。
定义数组的一般形式为:array_name=(ele1 ele2 ele3 … elen)
注意:
示例如下:
#!/bin/bash
nums=(29 100 13 8 91 44)
arr=(20 56 "http://www.baidu.com")
# 定义之后还可以增加元素
nums[6]=88
# 无需逐个元素地给数组赋值,我们也可以只给特定元素赋值
ages=([3]=24 [5]=19 [10]=12) # 只给第 3、5、10 个元素赋值,所以数组长度是 3。
数组长度,就是数组元素的个数。
利用 @或 *,可以将数组扩展成列表,然后使用 #来获取数组元素的个数,格式如下:
${#array_name[@]}
${#array_name[*]}
其中 array_name 表示数组名。两种形式是等价的,选择一种即可。
如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度。其实获取数组长度的方法与获取字符串长度的方法如出一辙。
示例如下:
#!/bin/bash arr=(20 56 "http://www.baidu.com") echo ${#arr[*]} # 输出 3 echo ${#arr[@]} # 输出 3 echo ${#arr[2]} # 输出 20 #向数组中添加元素 arr[10]="ele88" echo ${#arr[*]} # 输出 4 echo ${#arr[10]} # 输出 5 #删除数组元素 unset arr[1] echo ${#arr[*]} # 输出 3
(1)获取数组中某个元素的值。
一般格式为:${array_name[index]}
其中,array_name 是数组名,index 是下标。
(2)使用 @或 *可以获取数组中的所有元素。
一般格式为:
${array_name[*]}
${array_name[@]}
两者都可以得到 array_name 数组的所有元素。
示例如下:
#!/bin/bash
nums=(29 100 13 8 91 44)
echo ${nums[@]} #输出所有数组元素
nums[10]=66 #给第10个元素赋值(此时会增加数组长度)
echo ${nums[*]} #输出所有数组元素
echo ${nums[4]} #输出第5个元素
Shell 和其他编程语言一样,支持多种运算符,包括:
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
基本语法:
方式1:value=$((运算式))
方式2:value=$[运算式]
方式3:value=`expr m + n`
expr(expression的缩写)是一款表达式计算工具,使用它能完成表达式的求值操作。
使用expr时注意:
反引号包含,这个字符不是常用的单引号,在 Esc 键下边。下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
示例如下:
#!/bin/bash res1=$(((2+3)*4)) res2=$[(2+3)*5] temp=`expr 2 + 3` res3=`expr ${temp} \* 6` echo "res1=${res1}" echo "res2=${res2}" echo "temp=${temp}" echo "res3=${res3}" a=10 b=20 val=`expr $a + $b` echo "a + b = : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
示例如下:
#!/bin/bash a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
示例如下:
#!/bin/bash res1=$((2 != 3)) echo "res1=${res1}" a=10 b=20 if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a == $b: a 等于 b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a 小于 100 且 $b 大于 15 : 返回 true" else echo "$a 小于 100 且 $b 大于 15 : 返回 false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a 小于 100 或 $b 大于 100 : 返回 true" else echo "$a 小于 100 或 $b 大于 100 : 返回 false" fi
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
示例如下:
#!/bin/bash a=10 b=20 if [[ $a -lt 100 && $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi if [[ $a -lt 100 || $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
示例如下:
#!/bin/bash a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a 等于 b" else echo "$a = $b: a 不等于 b" fi if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi if [ -z $a ] then echo "-z $a : 字符串长度为 0" else echo "-z $a : 字符串长度不为 0" fi if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi if [ $a ] then echo "$a : 字符串不为空" else echo "$a : 字符串为空" fi
参考文章:
– 求知若饥,虚心若愚。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。