Linux Shell之二 变量与数组

一、什么是变量

Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。

SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。

例如在脚本里面定义A=123 ,定义这样一个变量,前面变量名,后面是变量的值。

引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下:

#!/bin/bash
#Author Jacken 2015-04-28
A=123
echo  “The number is  $A”
执行脚本:bash test.sh,结果将会显示:
The number is 123

简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了.

二、变量的操作与类型

定义变量

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

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

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

3、不能使用标点符号。

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

5、变量是严格区分大小写的。

使用变量

echo 把所在行输出到屏幕。

使用一个定义过的变量,只要在变量名前面加美元符号($)

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

[[email protected] ~]# A=hi
[[email protected] ~]# echo $A
hi
[[email protected] ~]# echo $Ahello
[[email protected] ~]# echo ${A}hello
hihello
[[email protected] ~]#

推荐给所有变量加上花括号,这是个好的编程习惯。

重新定义变量

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

[[email protected] ~]# cat test.sh 
#!/bin/bash
#
#
A=hi
echo "The First variable is $A"
A=hello
echo "The Second variabe is $A"
[[email protected] ~]# bash  test.sh 
The First variable is hi
The Second variabe is hello
[[email protected] ~]#

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:

[[email protected] ~]# cat test.sh 
#!/bin/bash
#
#
A=hi
B=hi2
readonly A B
A="hello"
B="hello2"
echo "The First variable is $A $B"
[[email protected] ~]# bash test.sh 
test.sh: line 7: A: readonly variable
test.sh: line 8: B: readonly variable
The First variable is hi hi2
[[email protected] ~]#

删除变量

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

[[email protected] ~]# cat test.sh 
#!/bin/bash
#
A=hi
B=hi2
readonly A
unset A B
A="hello"
B="hello2"
echo "The First variable is $A $B"
[[email protected] ~]# bash test.sh 
test.sh: line 6: unset: A: cannot unset: readonly variable
test.sh: line 7: A: readonly variable
The First variable is hi hello2
[[email protected] ~]#

变量名称    =        等号右边为空,代表将变量值设为null

unset   变量名称    不加任何选项,会先尝试取消变量,若失败,再试着取消与该变量同名的函数

unset -v 变量名称    -v 表示要取消的是变量

unset -f 函数名称    -f 表示要取消的是函数

"declare -x 变量名称" 和 “export 变量名称” 都可以把变量变成环境变量。

[email protected] ~]# A=hi
[[email protected] ~]# B=hello
[[email protected] ~]# declare -x A   //把A变成环境变量
[[email protected] ~]# vim test.sh 
[[email protected] ~]# cat test.sh 
#!/bin/bash
#
echo "The  first variable is  $A"
echo "The  second variable is  $B"
[[email protected] ~]# bash test.sh 
The  first variable is  hi
The  second variable is   
[[email protected] ~]# 
或 
[[email protected] ~]# C=one
[[email protected] ~]# D=two
[[email protected] ~]# export C    //把C变成环境变量
[[email protected] ~]# bash
[[email protected] ~]# echo $C
one
[[email protected] ~]# echo $D
[[email protected] ~]#

readonly        变量名称 把变量设为只读变量

-f  函数名称 设定该函数式不可修改

-a  数组变量 -a后的数组变量名称是只读数组

declare -r      变量名称 把变量设为只读变量

-a  变量名称设定变量是一个数组

-p  变量名称显示变量的属性       

-i  变量名称变量是一个整数

-x  变量名称变成环境变量

alias 别名=指令

1、等号两边不能有空白

2、等号右边有空白字符,需要用引号‘‘,文件位置在家目录下.bashrc

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

特殊变量

\ 转义,把具有特殊含义的字符转为无代表意义的字符串。

变量含义

$0 当前脚本的文件名

$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$# 传递给脚本或函数的参数个数。

$* 传递给脚本或函数的所有参数(一个整体的字符串)。

[email protected] 传递给脚本或函数的所有参数(一个个字符串)。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$? 上个命令的退出状态,或函数的返回值。

$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

[[email protected] ~]# chmod +x test.sh 
[[email protected] ~]# ./test.sh one two three four
当前脚本的文件名标识符 $0 ./test.sh
传递给脚本的参数 $n  one three
传递给脚本的个数$# 4
传递给脚本的所有参数$* one two three four
传递给脚本的所有参数[email protected] one two three four
上一个命令的状态返回值$? 0
当前shell的进程ID$$ 17820
[[email protected] ~]# cat test.sh 
#!/bin/bash
#
echo "当前脚本的文件名标识符 \$0 $0"
echo "传递给脚本的参数 \$n  $1 $3"
echo "传递给脚本的个数\$# $#"
echo "传递给脚本的所有参数\$* $*"
echo "传递给脚本的所有参数\[email protected] [email protected]"
echo "上一个命令的状态返回值\$? $?"
echo "当前shell的进程ID\$$ $$"
[[email protected] ~]#

$* 和 [email protected] 的区别

从上边的例子中,看起来$*和[email protected]输出结果是一样的,其实不然,$*输出的是"one two three four"一个整体的字符串,而[email protected]输出的是one、two、three、four四个字符串。

Other

在写脚本的时候,为了怕打错变量名称,造成排错上的困难,我们可以规定:变量一律要先经过设定的程序才能使用。

shopt -s -o nounset

-s 是打开选项的意思;

-o 是指可用set -o设定的选项

nounset表示变量一定要先设定过,才能使用

三、数组

数组是一种数据结构,由相关的数据项组成。每个数据项称为,称为数组的元素,且可使用索引的方式取得各元素的值。

bash的数组,其元素的个数没有限制,数组的索引由0开始,但不一定要连续(可以跳号)。

显示或取得某一元素的值${数组[索引值]},例 数组A的第3个元素为${A[2]}。索引是可以做算术运算的。

使用数组的索引时,第一个元素由0开始,第n个元素的索引值为n-1

echo ${数组[@]} 取出所有元素,得到的是以空格隔开的字符

echo ${数组[*]} 取出所有元素,得到的是一串字符串

echo${#数组[@]}或echo ${#数组[*]}取得数组元素的个数

unset 数组 取消数组

unset 数组[2]   取消数组中的第3个元素

[[email protected] ~]# cat test.sh 
#!/bin/bash
#
A[0]=5
A[1]=15
A[3]=17
A[4]=19
echo "\${A[@]}代表数组A的所有元素(空格隔开的字符串)${A[@]}"
echo "\${A[*]}代表数组A的所有元素(代表一个整体字符串)${A[*]}"
echo "\${#A[@]}代表数组A的元素个数${#A[@]}"
echo "\${#A[*]}代表数组A的元素个数${#A[*]}"
[[email protected] ~]# 
[[email protected] ~]# bash test.sh 
${A[@]}代表数组A的所有元素(空格隔开的字符串)5 15 17 19
${A[*]}代表数组A的所有元素(代表一个整体字符串)5 15 17 19
${#A[@]}代表数组A的元素个数4
${#A[*]}代表数组A的元素个数4
[[email protected] ~]#
时间: 2024-12-23 21:43:36

Linux Shell之二 变量与数组的相关文章

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

Linux Shell之三 高级变量及字符串

高级变量包含三个部分1.变量扩展2.命令替换3.算术扩展在Bash Shell中,$算符会触发到上述三种扩展,基本形式如下:    基本型             扩展种类            例子            ${变量名称}            变量扩展        ${filename}$(命令)                命令替换        $(ls /)$((算术式))            算术扩展        $((5+3))变量存在表示变量有值(包含空)一

linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读

这个年代, 大家写点书, 也无非就是为了搞点钱, 基本都是罗列一些知识点, 基本都是写给已经会了的人看的. 真正用心写书的人, 不多. 如果真正用心写书, 且站在读者的角度去写, 那就少之又少了. 关于linux shell环境变量, 我看了四本linux相关书的介绍, 结果, 没有一本书的讲解让我完全满意, 总感觉没有说清楚.所以呢, 我打算自己来写一下,如有不当指出, 请大家指正. 一. 永久环境变量(实际上属于文件, 而不属于shell, 每打开一个shell, 都会加载/导入到shell

【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读

2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于: 分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允许不得转载. 这个年代, 大家写点书, 也无非就是为了搞点钱, 基本都是罗列一些知识点, 基本都是写给已经会了的人看的. 真正用心写书的人, 不多. 如果真正用心写书, 且站在读者的角度去写, 那就少之又少了. 关于linux shell环境变量, 我看了四本lin

linux shell脚本之-变量极速入门与进阶(2)

1,$$:显示当前的进程id号 [email protected]:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ sleep 3000 [email protected]:~/linux/shell/how_to_use_var$ bash show_pid.sh & [1] 9401 [email protected]:~/linux/shell/how_to_use_var$ 9401 [email pro

1.Linux Shell中的变量

1. Shell变量类型 Shell是一种动态类型语言(不使用显式的数据声明)和弱类型语言(变量的类型操作根据需求而不同).Shell中的变量是不分类型的(都是字符串类型),但是依赖于具体的上下文,Shell编程也允许比较操作和整数操作. 2. Shell变量的分类 Shell中有3种变量:用户变量.位置变量(Processing Parameter).环境变量. 1.用户变量:用户在Shell编程过程中定义的变量,分为全局变量和局部变量.默认情况下,用户定义的Shell变量为全局变量,如果要指

Linux Shell基础 环境变量配置文件

source命令:使环境变量配置文件强制生效 source 命令会强制执行脚本中的全部命令,而忽略脚本文件的权限.该命令主要用于让重新配置的环境变量配置文件强制生效.source 命令格式如下: [[email protected] ~]# source 配置文件 或 [[email protected] ~]#.配置文件 "."就是 source 命令 环境变量配置文件 在环境变量配置文件中保存了对系统的操作环境生效的系统默认环境变量,比如 PATH.HISTSIZE.PS1.HOS

Linux Shell编程二

以"``"符号包含的内容不是字符串,而是代表这是一个shell命令. echo "today is" `date` 前面是字符,后面`date`表示执行date这个命令. PDATE=`date` 代表定义一个变量PDATE,将date执行完成输出的结果放入变量PDATE中. 以单引号,双引号包含的字符全部会被shell认为是字符串 echo "today is " 'date' #打印 today is date "expr"

linux shell 学习笔记--变量声明与赋值,循环

Bash 变量是不分类型的 ------------------------ 不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串. 但是依赖于上下文,Bash 也允许比较操作和算术操作.决定这些的关键因素就是,变量中的值 是否只有数字. 赋值 a=123 a="sdsd" #注意=左右不要有空格,否则就变成比较字符串操作 引用 $a #借助$符 操作字符串 字符穿连接 a="sdfs" b="dsd