linux shell变量

1,关于shell编程中的变量,shell编程中的变量分为4种
 
本地变量:只对本系统本用户自己的shell有用
 
环境变量:对本系统的所有shell都有用  用export来声明变量  例如:export
 
          A=1  另外:查看系统能用的shell的命令是cat /etc/shells
 
           查看系统当前用户正使用的shell的命令:echo $SHELL
 
特殊变量:是bash内置的变量,用于调用bash脚本编程环境的一些特殊的执行结果
  
          比如:$?  它的作用是表明上一个命令是否执行成功,在linux中 0 表
 
          示成功,非零的都是错误,不同的值表示的错误不一样
 
位置变量:可以直接向脚本中传递参数并且被脚本调用的变量,例如 $1  $2  $3...
 
能够进行算术运算的几个特殊符号:$[]  $(( )) 例如:a=3 b=5 echo "$[$a+$b]"
 
 
2,关于PS1  echo $PS1  export PS1='[\u@\h \w]\$'
         
 
3,变量的文件一般都是放在一下几个文件里的
 
  按控制范围分为:
 
  全局变量:/etc/profile  /etc/profile.d/*,/etc/bash.rc
 
  局部变量:~/.bash_profile ~/.bash.rc  ~/.bash_logout
 
  按作用类型分为:
 
  profile类:设置环境变量   和    运行用户登录要运行的一些命令
 
  bashrc 类:设置别名       和     设置本地变量
 
 
 
解决关于脚本为什么有时候不能用的问题 
 
  shell分为交互式登录shell 和非登录shell
 
  所谓登录shell就是在用户进入系统的时候才开始执行的shell
 
  读取顺序:/etc/profile-->/etc/profile.d/*-->~/.bash_profile--
 
  >~/.bashrc/-->/etc/bashrc(越往后优先级越高)
 
   非登录shell就是用户还没有进入系统的时候就已经开始执行的shell
 
   ~/.bashrc-->/etc/bashrc-->/etc/profile.d/*(越往后优先级越高)

###### shell 局部变量、全局变量、环境变量
环境变量通常又称全局变量,以区别于局部变量,通常,环境变量应该大写,环境变量是已经用export内置命令导出的变量。子shell继承当前父shell的环境变量,并能一直传承下去,但是不可逆向传递。
格式:
export 变量=值
declare -x 变量=值

(1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。

例1:脚本变量的作用域
#!/bin/bash
#define the function ltx_func
ltx_func()
{
   echo $v1
   #modify the variable v1
   v1=200
}
#define the variable v1
v1=100
#call the function ltx_func
ltx_func
echo $v1

结果:
100
200
解析:脚本变量v1的作用域从被定义的地方开始,到shell结束。调用函数ltx_func的地方在变量v1的作用域内,所以能够访问并修改变量v1。

(2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。

例2:函数定义的global变量
#!/bin/bash
#define the function ltx_func
ltx_func()
{
   #define the variable v2
   v2=200
}
#call the function ltx_func
ltx_func
echo $v2

结果:
200
解析:函数变量v2默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束为止。注意,不是从定义函数的地方开始,而是从调用函数的地方开始。打印命令在变量v2的作用域内,所以能够访问变量v2。

例3:函数定义的local变量
#!/bin/bash
#define the function ltx_func
ltx_func()
{
   #define the local variable v2
   local v2=200
}
#call the function ltx_func
ltx_func
echo $v2

结果:
(空)
解析:函数变量v2显示定义为local的,其作用域局限于函数内。打印命令在函数外,不在变量v2的作用域内,所以能够不能访问变量v2。

例4:函数参数是local变量
#!/bin/bash
#define the function ltx_func
ltx_func()
{
   echo "param 1: $1"
}
#call the function ltx_func
ltx_func 100

结果:
100
解析:函数参数是local的,通过位置变量来访问。打印命令输出函数的第一个参数。

(3)如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。

例5:同名local变量屏蔽global变量
#!/bin/bash
#define the function ltx_func
ltx_func()
{
   echo $v1
   #define the local variable v1
   local v1=200
   echo $v1
}
#define the global variable v1
v1=100

#call the function ltx_func
ltx_func
echo $v1

结果:
100
200
100
解析:global变量v1的作用域从被定义的地方开始,到shell结束。调用函数ltx_func的地方在变量v1的作用域内,所以能够变量v1。函数又定义了同名的local变量v1,同名local变量屏蔽global变量,所以函数第二次打印访问的是local变量。退出函数后再次打印v1,此时函数定义的local变量已经消失,访问的是global变量。


###在shell中,管道里边改变量是无效的。 
脚本一:
#!/bin/bash
number=0
cat file | while read line;do
    echo $line
   ((number+=1))
   echo "number1=$number"                         //循环内输出number值
done 
echo "number2=$number"                          //循环外取得number值
 
输出结果
number1=9
number2=0
 
可以用另一种方法
脚本二:
#!/bin/bash
number=0
while read line;do
echo $line
((number+=1))
echo "number1=$number"
done < file
echo "number2=$number"
 
输出结果
number1=9
number2=9
 
这次number赋值在循环外就生效了。
请使用浏览器的分享功能分享到微信等