shell变量

来源:互联网 发布:网络著作权侵权行为 编辑:程序博客网 时间:2024/06/06 07:38

1、用户自定义变量

在编写shell脚本的过程中,用户可以使用自定义的变量来保存数据。这一点类似于c语言中的变量。下面程序段简单示意了shell中变量的定义。

number=1a=2b=3c=$a+$bfilename="test.txt"string="hello world"

因为大部分Linux命令使用的是小写字母,而大多数的shell中的环境变量是使用大写字母表示的。因此,在shell脚本中出现的用户自定义变量最好使用小字母,这样可以很好地区别shell中的环境变量。shell中变量的赋值是由左至右进行的,下面实例演示了在shell脚本中使用多重赋值

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

   >首个字符必须为字母(a-z,A-Z)。

   >中间不能有空格,可以使用下划线(_)。

   >不能使用标点符号。

   >不能使用bash里的关键字(可用help命令查看保留关键字)。

#!/bin/shx=2 y=$xecho "x is $x, y is $y"$chmod u+x var.sh./var.shx 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 stringecho $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/sha=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/shecho linux $versionecho "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/shecho No.0 $0echo No.1 $1echo No.2 $2echo No.3 $3echo No.4 $4echo No.5 $5echo No.6 $6echo No.7 $7echo No.8 $8echo 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/shecho No.0 $0echo No.1 $1echo No.2 $2echo No.3 $3echo No.4 $4echo No.5 $5echo No.6 $6echo No.7 $7echo No.8 $8echo No.9 $9shiftecho No.0 $0echo No.1 $1echo No.2 $2echo No.3 $3echo No.4 $4echo No.5 $5echo No.6 $6echo No.7 $7echo No.8 $8echo 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
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/shmyUrl="http://www.w3cschool.cc"readonly myUrlmyUrl="http://www.runoob.com"
运行脚本,结果如下:

./test.sh: 行 5: myUrl: 只读变量

9、获取字符串长度

#!/bin/shstring="abcd"echo ${#string}
./test.sh

4

10、Shell 字符串

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

11、提取子字符串

从左边开始

#!/bin/shstring="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/shstring="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/shstring="runoob is a great company"echo `expr index "$string" ge`echo `expr index "$string" ru`echo `expr index "$string" is`
注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。
$ ./test.sh
13
1
8

13、Shell 数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)或者array_name=(value0value1value2value3)
还可以单独定义数组的各个分量:
array_name[0]=value0array_name[1]=value1array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。

14、读取数组
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

15、获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}







原创粉丝点击