查看: 300|回复: 2

Shell编程的几个环境变量和参数变量)

 关闭 [复制链接]

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

发表于 2009-5-22 19:58 | 显示全部楼层 |阅读模式
1. 环境变量
在Shell脚本程序开始执行的时候,一些变量会根据环境中的值进行初始化. 这些变量通常使用大写的字母做名字,用户在脚本程序里定义的变量一般使用小写字母做名字.
下面是一些比较常见的变量:
$HOME 当前用户的登陆目录
$PATH 用冒号分隔的命令搜索目录清单
$PS1 命令行提示符,通常是\"$\"字符
$PS2 辅助提示符,用来提示后续输入,通常是\">\"字符
$IFS 输入分隔符. 当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常是空格,制表符,和换行符.
$0 shell脚本程序的名字.
$# 传递到脚本程序的参数个数.
$$ 该shell脚本程序的进程ID,脚本一般会使用他来创建唯一的临时文件,比如/tmp/tmpfile_$$

2. 参数变量
如果脚本程序在调用时还带有参数的话,就会产生一些变量. 即使脚本没有传递任何参数,上面提到的$#也是存在的,只不过它的值是0.
常见的参数变量如下:
$1,$2,$3...脚本程序的参数
$* 一个全体参数组成的清单,这是个单独的变量,各个参数间用环境变量IFS中的第一个字符分隔开.
$@ 它是\"$*\" 的一种变量,它不使用IFS环境变量
\"$*\" 和 \"$@\"两个参数间的区别在X/Open的技术规范里有详细解释.
当双括号里的字符发生名-值替换的时候,\"$*\"整体扩展为一个数据域,各个参数间用IFS(\"Internal Field Separator\") 的第一个字符分隔开;如果取消了对IFS的设置.就用一个空格加以分隔. 如果IFS被设置为一个空字符(这与取消对它的设置不同),参数的值就会接合在一起. 例如:
$IFS=''
$set foo bar bam
$echo \"$@\"
foo bar bam
$echo \"$*\"
foobarbam
$unset IFS
$echo \"$*\"
foo bar bam
从上面的例子可以看出,双引号里面的 \"$@\" 把各个参数依然扩展为彼此分开的数据,不受IFS的变量值的影响. 一般来说,如果你想访问脚本程序的参数,用\"$@\"是个比较好的选择.

附:Shell变量

本地变量 通过set命令可以查看
环境变量 通过env命令可以查看
位置变量 $0,$1,...,$9
特定变量参数 $*,$@,$#,$$,$!,$-,$?


上一条命令

!! 全部的上一条命令
!* 上一条命令的全部参数
!$ 上一条命令的最后一个参数
$? 上一条命令的返回值
0 true
1 false

$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$* 不保存引用
$@ 保存引用
$- 使用set及执行时传递给shell的标志位
PCOS系统下载站:http://zhuangji.wang

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-5-22 19:58 | 显示全部楼层

Shell编程的几个环境变量和参数变量)

1. 环境变量
在Shell脚本程序开始执行的时候,一些变量会根据环境中的值进行初始化. 这些变量通常使用大写的字母做名字,用户在脚本程序里定义的变量一般使用小写字母做名字.
下面是一些比较常见的变量:
$HOME 当前用户的登陆目录
$PATH 用冒号分隔的命令搜索目录清单
$PS1 命令行提示符,通常是\"$\"字符
$PS2 辅助提示符,用来提示后续输入,通常是\">\"字符
$IFS 输入分隔符. 当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常是空格,制表符,和换行符.
$0 shell脚本程序的名字.
$# 传递到脚本程序的参数个数.
$$ 该shell脚本程序的进程ID,脚本一般会使用他来创建唯一的临时文件,比如/tmp/tmpfile_$$

2. 参数变量
如果脚本程序在调用时还带有参数的话,就会产生一些变量. 即使脚本没有传递任何参数,上面提到的$#也是存在的,只不过它的值是0.
常见的参数变量如下:
$1,$2,$3...脚本程序的参数
$* 一个全体参数组成的清单,这是个单独的变量,各个参数间用环境变量IFS中的第一个字符分隔开.
$@ 它是\"$*\" 的一种变量,它不使用IFS环境变量
\"$*\" 和 \"$@\"两个参数间的区别在X/Open的技术规范里有详细解释.
当双括号里的字符发生名-值替换的时候,\"$*\"整体扩展为一个数据域,各个参数间用IFS(\"Internal Field Separator\") 的第一个字符分隔开;如果取消了对IFS的设置.就用一个空格加以分隔. 如果IFS被设置为一个空字符(这与取消对它的设置不同),参数的值就会接合在一起. 例如:
$IFS=''
$set foo bar bam
$echo \"$@\"
foo bar bam
$echo \"$*\"
foobarbam
$unset IFS
$echo \"$*\"
foo bar bam
从上面的例子可以看出,双引号里面的 \"$@\" 把各个参数依然扩展为彼此分开的数据,不受IFS的变量值的影响. 一般来说,如果你想访问脚本程序的参数,用\"$@\"是个比较好的选择.

附:Shell变量

本地变量 通过set命令可以查看
环境变量 通过env命令可以查看
位置变量 $0,$1,...,$9
特定变量参数 $*,$@,$#,$$,$!,$-,$?


上一条命令

!! 全部的上一条命令
!* 上一条命令的全部参数
!$ 上一条命令的最后一个参数
$? 上一条命令的返回值
0 true
1 false

$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$* 不保存引用
$@ 保存引用
$- 使用set及执行时传递给shell的标志位
PCOS系统下载站:http://zhuangji.wang

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-5-22 19:58 | 显示全部楼层

Shell编程的几个环境变量和参数变量)

1. 环境变量
在Shell脚本程序开始执行的时候,一些变量会根据环境中的值进行初始化. 这些变量通常使用大写的字母做名字,用户在脚本程序里定义的变量一般使用小写字母做名字.
下面是一些比较常见的变量:
$HOME 当前用户的登陆目录
$PATH 用冒号分隔的命令搜索目录清单
$PS1 命令行提示符,通常是\"$\"字符
$PS2 辅助提示符,用来提示后续输入,通常是\">\"字符
$IFS 输入分隔符. 当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常是空格,制表符,和换行符.
$0 shell脚本程序的名字.
$# 传递到脚本程序的参数个数.
$$ 该shell脚本程序的进程ID,脚本一般会使用他来创建唯一的临时文件,比如/tmp/tmpfile_$$

2. 参数变量
如果脚本程序在调用时还带有参数的话,就会产生一些变量. 即使脚本没有传递任何参数,上面提到的$#也是存在的,只不过它的值是0.
常见的参数变量如下:
$1,$2,$3...脚本程序的参数
$* 一个全体参数组成的清单,这是个单独的变量,各个参数间用环境变量IFS中的第一个字符分隔开.
$@ 它是\"$*\" 的一种变量,它不使用IFS环境变量
\"$*\" 和 \"$@\"两个参数间的区别在X/Open的技术规范里有详细解释.
当双括号里的字符发生名-值替换的时候,\"$*\"整体扩展为一个数据域,各个参数间用IFS(\"Internal Field Separator\") 的第一个字符分隔开;如果取消了对IFS的设置.就用一个空格加以分隔. 如果IFS被设置为一个空字符(这与取消对它的设置不同),参数的值就会接合在一起. 例如:
$IFS=''
$set foo bar bam
$echo \"$@\"
foo bar bam
$echo \"$*\"
foobarbam
$unset IFS
$echo \"$*\"
foo bar bam
从上面的例子可以看出,双引号里面的 \"$@\" 把各个参数依然扩展为彼此分开的数据,不受IFS的变量值的影响. 一般来说,如果你想访问脚本程序的参数,用\"$@\"是个比较好的选择.

附:Shell变量

本地变量 通过set命令可以查看
环境变量 通过env命令可以查看
位置变量 $0,$1,...,$9
特定变量参数 $*,$@,$#,$$,$!,$-,$?


上一条命令

!! 全部的上一条命令
!* 上一条命令的全部参数
!$ 上一条命令的最后一个参数
$? 上一条命令的返回值
0 true
1 false

$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$* 不保存引用
$@ 保存引用
$- 使用set及执行时传递给shell的标志位
PCOS系统下载站:http://zhuangji.wang

本版积分规则