1、用户自定义变量
在编写shell脚本的过程中,用户可以使用自定义的变量来保存数据。这一点类似于c语言中的变量。下面程序段简单示意了shell中变量的定义。
number=1
a=2
b=3
c=$a+$b
filename="test.txt"
string="hello world"
因为大部分Linux命令使用的是小写字母,而大多数的shell中的环境变量是使用大写字母表示的。因此,在shell脚本中出现的用户自定义变量最好使用小字母,这样可以很好地区别shell中的环境变量。shell中变量的赋值是由左至右进行的,下面实例演示了在shell脚本中使用多重赋值
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
>首个字符必须为字母(a-z,A-Z)。
>中间不能有空格,可以使用下划线(_)。
>不能使用标点符号。
>不能使用bash里的关键字(可用help命令查看保留关键字)。
#!/bin/sh
x=2 y=$x
echo "x is $x, y is $y"
$chmod u+x var.sh
./var.sh
x is 2, y is 2
使用unset命令可以删除变量的赋值,使变量的值为空。如果用户需要清除一个变量的值可以这样做,其等效于将这个变量赋值为空。下面实例演示了使用ubset命令清除一个变量的值。
#!/bin/sh
#unset.sh 使用unset清除变量的值
echo "before clearance"
string="hello world"
echo $string #输出string变量的原来的值
echo "after clearance"
unset string
echo $string #输出清除了string变量后的值
$chmod u+x unset.sh
$./unset.sh
before clearance
hello world
after clearance
输出string变量的值时其值已经变成了空值,因此打印了一个换行。
2、引用变量
在shell脚本中需要引用一个变量时有3种方法。这3种方法区别不大,通用的一种是需要在引用的变量名之前加上一个"$"字符
1、使用双引号引用变量
"$var"
2、使用大括号引用变量
${var}
3、直接运用变量
$var
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
例:string="hello world"
echo "$string"
echo ${string}
echo $string
hello world
hello world
hello world
3、为表达式求值
expr命令中可以使用数学运算符。例如,数字比较操作,整数运算操作或者逻辑操作等,例:
#!/bin/sh
#使用expr命令计算表达式的值
#在数学表达式中使用加法操作
expr 3 + 2
#在数学表达式中使用加法操作
expr 3 - 2
#在数学表达式中使用求余操作
expr 3 % 2
#在数学表达式中使用乘法操作是乘法符号必须被转义
expr 3 \* 2
#在数学表达式中除法操作
expr 3 / 2
./expr.sh
5
1
1
6
1
在shell脚本中也可以使用括号代替expr命令计算表达式的值,其形式如下
$((表达式))
例:
#!/bin/sh
#在数学表达式中使用加法操作
sum=$((3+2))
echo $sum
#在数学表达式中使用减法操作
sub=$((3-2))
echo $sub
#在数学表达式中使用求余操作
mod=$((3%2))
echo $mod
#在数学表达式中使用乘法操作
mul=$((3*2))
echo $mul
#在数学表达式中使用除法操作
div=$((3/2))
echo $div
./brace.sh
5
1
1
6
1
4、变量的类型
shell脚本中的变量很特别,因为在这里变量并不区分类型。本质上,shell脚本中的变量都是字符串,在对变量的解释上则依赖于shell脚本中的变量定义。例如,整数变量也是一个字符串,shell允许比较操作和整数操作。其中的关键因素是,这个整型变量中的值是否只有数字。如果只有数字则在进行整数操作时将其解释为一个整型,如果还包括其他的字符,则只能将其解释为字符串。例:
#!/bin/sh
a=1024 #整型变量a,将其赋值为1024
((a=$a+1)) #累增变量a的值
echo "the value of a is :$a"
b=102a #在整型数据中混杂一个字母,把变量b从整型变为字符串
echo "the value of b is $b"
declare -i b #使用declare命令,明确指定变量b值是一个整型变量
echo "the value of b is :$b"
c="" #c变量的值是一个空值
echo "the value of c is :$c"
((c=$c+1)) #使用加法运算符操作一个值为空的变量
echo "the value of c is :$c"
((d=d+1)) #使用加法运算符操作没有声明的变量
echo "the value of d is :$d"
$ ./test.sh the value of a is :1025
the value of b is 102a
the value of b is :102a
the value of c is :
the value of c is :1
the value of d is :1
shell脚本不区分变量的类型有好处也有坏处。好处是使shell脚本程序变得更加灵活,编写代码的难度也更小了;坏处是这种方法产生错误的几率很高,而且会使程序员
养不好的编程习惯。
5、操作自定义变量
例:
#!/bin/sh
echo linux $version
echo "set default-value"
echo linux ${version:-2.6.12} #设置变量的默认值
echo the value is :$version #变量本身的值并没有改变
version="new version" #将变量赋值
echo linux ${version:-2.6.12} #再次输出该变量的值
./test.sh
linux
set default-value
linux 2.6.12
the value is :
linux new version 6、位置变量
在运行一个shell脚本时可以向脚本传递命令参数,这些命令行参数可以在shell脚本内部被引用到。根据每一个命令参数的位置,在shell中可以使用$1-$9来表示。$0表示当前执行进程的文件名,也就是程序的执行文件名。
例:
#!/bin/sh
echo No.0 $0
echo No.1 $1
echo No.2 $2
echo No.3 $3
echo No.4 $4
echo No.5 $5
echo No.6 $6
echo No.7 $7
echo No.8 $8
echo No.9 $9
$ ./test.sh 1 2 3 4 5 6 7 8 9 10
No.0 ./test.sh
No.1 1
No.2 2
No.3 3
No.4 4
No.5 5
No.6 6
No.7 7
No.8 8
No.9 9
由此可知,空余的位置变量会被设置为空值,而多余的命令行参数则不能被保存在位置变量中。位置变量的作用是很大的,活用位置变量将大大提高shell脚本的功能。
7、重新分配位置变量使用shift命令会重新分配位置参数,该操作把所有的位置参数都向左移动一个位置,也就是说原来的$2变成了$1,而$9变成了$8,原来的$1就消失了,但是$0(shell脚本文件名称)是不会改变的。如果传递了大量的位置参数到脚本中,那么shift命令允许用户访问超过位置变量所能表示的命令行参数。
例:
#!/bin/sh
echo No.0 $0
echo No.1 $1
echo No.2 $2
echo No.3 $3
echo No.4 $4
echo No.5 $5
echo No.6 $6
echo No.7 $7
echo No.8 $8
echo No.9 $9
shift
echo No.0 $0
echo No.1 $1
echo No.2 $2
echo No.3 $3
echo No.4 $4
echo No.5 $5
echo No.6 $6
echo No.7 $7
echo No.8 $8
echo No.9 $9
./test.sh 1 2 3 4 5 6 7 8 9 10No.0 ./test.sh
No.1 1
No.2 2
No.3 3
No.4 4
No.5 5
No.6 6
No.7 7
No.8 8
No.9 9
No.0 ./test.sh
No.1 2
No.2 3
No.3 4
No.4 5
No.5 6
No.6 7
No.7 8
No.8 9
No.9 10
8、只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
例:
#!/bin/sh
myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"
运行脚本,结果如下:
./test.sh: 行 5: myUrl: 只读变量
9、获取字符串长度
#!/bin/sh
string="abcd"
echo ${#string}
./test.sh
4
10、Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
11、提取子字符串
从左边开始
#!/bin/sh
string="runoob is a great site"
echo ${string:0:1}
echo ${string:1:1}
echo ${string:1:4}
echo ${string:3:5}
$ ./test.sh
r
u
unoo
oob i
从右边开始
#!/bin/sh
string="123456789"
echo ${string:0-0:1}
echo ${string:0-0}
echo ${string:0-1:1}
echo ${string:0-2:1}
echo ${string:0-5:4}
echo ${string:0-4:5}
echo ${string:0-8}
$ ./test.sh
1
123456789
9
8
5678
6789
23456789
12、查找子字符串
#!/bin/sh
string="runoob is a great company"
echo `expr index "$string" ge`
echo `expr index "$string" ru`
echo `expr index "$string" is`
注意:
以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。
13
1
8
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
14、读取数组
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}