曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5720|回复: 5
打印 上一主题 下一主题

变量

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2008-12-15 13:50:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、本地变量
LOCAL_TEST="test"          //给本地变量 LOCAL_TEST 赋值 test
echo $LOCAL_TEST         //也可以 echo ${LOCAL_TEST}
set | grep LOCAL_TEST   //用 set 命令查看本地变量(再重启终端后本地变量消失)

把本地变量生命为 readonly,无法赋值,无法取消
readonly LOCALTEST

仅执行 readonly 可以查看当前终端里所有设置的只读变量

二、环境变量

环境变量用于所有用户进程(经常被称为子进程)。登录进程称为父进程。shell 中执行的用户进程均称为子进程。不像本地变量(只用于现在的 shell )环境变量可用于所有子进程,这包括编辑器、脚本和应用。

RedHat 环境下,在用户的家目录下 $HOME/.bash_profile 文件中可以设置一些环境变量。
在  /etc/profile  中设置的环境变量可以为所有的用户使用

设置环境变量使用命令: export (不带参数的 export 命令亦可看到已设的环境变量)
查看环境变量使用命令: evn

设置一个环境变量:
export MYTEST="are you ok"

输出刚才设置的环境变量:
beyes@linux-beyes:~> echo $MYTEST
are you ok

删除掉已经设置的环境变量(非 readonly 声明的环境变量):
unset MYTEST

2.1 环境变量的替换

${Variable name}显示实际值到 variable name
${Variable name:+value}
如果设置了 variable name,则显示其值为 value,否则为空
${Variable name:?value}
如果未设置 varialbe name,则显示用户定义的错误信息 value
${Variable name:-value}
如果未设置 varialbe name,则显示其指 value
${Varialble name:=value}
如果未设置 variable name,则设置其值为 value,并显示

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
沙发
 楼主| 发表于 2008-12-15 15:11:00 | 只看该作者

位置变量

一般允许的位置变量有 10 个。

所谓的位置变量,就是在输入命令时传递给脚本的以空格隔开的参数,类似于传递给 C 程序中 main( int arvc,char *arvg[] ) 里的 arvg 中的参数。

位置变量的表示:
$0
$1
$2$3$4$5$6$7$8$9
脚本名字
A
B

C
D
E
F
G
H

示例脚本(parm.sh):
#!/bin/bash
#parm
echo "This is script name       : $0"
echo "This is script 1 parameter: $1"
echo "This is script 2 parameter: $2"
echo "This is script 3 parameter: $3"
echo "This is script 4 parameter: $4"
echo "This is script 5 parameter: $5"
echo "This is script 6 parameter: $6"
echo "This is script 7 parameter: $7"
echo "This is script 8 parameter: $8"
echo "This is script 9 parameter: $9"

如果只是执行 ./parm.sh 则输出:
This is script name       : ./parm.sh
This is script 1 parameter:
This is script 2 parameter:
This is script 3 parameter:
This is script 4 parameter:
This is script 5 parameter:
This is script 6 parameter:
This is script 7 parameter:
This is script 8 parameter:
This is script 9 parameter:

传递参数给 parm.sh
./parm.sh A B C D EEFF
脚本输出:
This is script name       : ./parm.sh
This is script 1 parameter: A
This is script 2 parameter: B
This is script 3 parameter: C
This is script 4 parameter: D
This is script 5 parameter: EEFF
This is script 6 parameter:
This is script 7 parameter:
This is script 8 parameter:
This is script 9 parameter:
由上可见,在 shell 中输入给 parm 的参数就被依次的输了出来。

又如另外一个脚本的内容为:
#!/bin/bash
#parm-1
ls -lh /home/beyes/$1


假设 /home/beyes 下有一个名为:TomatoWinXP_SP3_V1.21.iso 的文件,则:
beyes@linux-beyes:~/shell_sript> sh parm-1.sh TomatoWinXP_SP3_V1.21.iso
-rw-r--r-- 1 beyes users 687M 12-08 18:18 /home/beyes/TomatoWinXP_SP3_V1.21.iso

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
板凳
 楼主| 发表于 2008-12-15 21:39:31 | 只看该作者

标准变量

bash 默认建立了一些标准环境变量,在 /etc/profile 中有定义:

TERM  --- 终端类型

PATH  ---- 在此设定的路径中找到可执行程序

PS1 ---- 终端里的提示符格式
beyes@linux-beyes:~/桌面> echo $PS1
$(ppwd \\l)\\u@\\h:\\w>

PS2 ---- 运行多个命令时,有时需要分行进行,则每起新的一行前的提示符号
beyes@linux-beyes:~/桌面> echo $PS2
>

PWD ---- 显示当前目录

SHELL ---- 解析器(bash..csh..等)

MANPATH ----- 帮助文档所在的路径
beyes@linux-beyes:~> echo $MANPATH
/usr/lib/mpi/gcc/openmpi/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
地板
 楼主| 发表于 2008-12-16 02:01:29 | 只看该作者

特殊变量

假设有如下内容的脚本(其中如 $#, $*, $$, $? 这些都是特殊变量):
#!/bin/bash
#parm
echo "这是脚本的名称: $0"
echo "这是脚本的第1个位置参数:$1"
echo "这是脚本的第2个位置参数:$2"
echo "这是脚本的第3个位置参数:$3"
echo "这是脚本的第4个位置参数:$4"
echo "这是脚本的第5个位置参数:$5"
echo "这是脚本的第6个位置参数:$6"
echo "这是脚本的第7个位置参数:$7"
echo "这是脚本的第8个位置参数:$8"
echo "这是脚本的第9个位置参数:$9"

echo "显示参数的个数:$#"
echo "显示脚本全部参数:$*"
echo "显示进程ID:$$"
echo "显示前一命令运行后状态:$?"

运行示例-1:
beyes@linux-beyes:~/shell_sript> ./parm-2.sh A beyes home
这是脚本的名称: ./parm-2.sh
这是脚本的第1个位置参数:A
这是脚本的第2个位置参数:beyes
这是脚本的第3个位置参数:home
这是脚本的第4个位置参数:
这是脚本的第5个位置参数:
这是脚本的第6个位置参数:
这是脚本的第7个位置参数:
这是脚本的第8个位置参数:
这是脚本的第9个位置参数:
显示参数的个数:3
显示脚本全部参数:A beyes home
显示进程ID:6342
显示前一命令运行后状态:0


$#  传递到脚本的参数个数

$*   以一个字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过 9 个

$$   脚本运行的当前进程 ID 号

$!    后台运行的最后一个进程的进程 ID 号

$@  与 $* 基本相同,但有所差别,可参考:http://www.groad.net/bbs/read.php?tid-3499.html

$-    显示 shell 使用的当前选项,与 set 命令功能相同

$?    显示最后命令的退出状态。0 表示没有错误; 其他值表明有错误

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
5#
 楼主| 发表于 2008-12-16 02:22:00 | 只看该作者

影响变量的命令

declare --- 设置或显示变量

-f   只显示函数名
-r   创建只读变量( declare 和 typeset )
-x  创建转出变量
-i   创建整数变量

使用 + 替代 - ,可以电脑选项的含义


export --- 用于创建传给 shell 的变量

-- 表明选项结束,所有后续参数都是实参

-f  表明在 “名-值” 对中的名字是函数名

-n 把全局变量转换成局部变量

-p 显示全局变量列表

readonly   ---- 用于显示或设置只读变量
 -- 表明选项结束
 -f  创建只读变量

set  ---- 设置或重设各种 shell

shift [n] ---- 用于移动位置变量,调整位置变量。如 使 $3 的值赋予 $2,$2 的值赋予 $1

假设脚本内容为:
#!/bin/bash
#parm
echo "这是脚本的名称: $0"
echo "这是脚本的第1个位置参数:$1"
echo "这是脚本的第2个位置参数:$2"
echo "这是脚本的第3个位置参数:$3"
echo "这是脚本的第4个位置参数:$4"
echo "这是脚本的第5个位置参数:$5"
echo "这是脚本的第6个位置参数:$6"
echo "这是脚本的第7个位置参数:$7"
echo "这是脚本的第8个位置参数:$8"
echo "这是脚本的第9个位置参数:$9"

echo "显示参数的个数:$#"
echo "显示脚本全部参数:'$@'"
echo "显示进程ID:$$"
echo "显示前一命令运行后状态:$?"

shift
echo "这是脚本的第1个位置参数:$1"
echo "这是脚本的第2个位置参数:$2"

则如下执行:
./parm-2.sh one two three four
显示:
beyes@linux-beyes:~/shell_sript> ./parm-2.sh one two three four
这是脚本的名称: ./parm-2.sh
这是脚本的第1个位置参数:one
这是脚本的第2个位置参数:two
这是脚本的第3个位置参数:three
这是脚本的第4个位置参数:four
这是脚本的第5个位置参数:
这是脚本的第6个位置参数:
这是脚本的第7个位置参数:
这是脚本的第8个位置参数:
这是脚本的第9个位置参数:
显示参数的个数:4
显示脚本全部参数:'one two three four'
显示进程ID:6676
显示前一命令运行后状态:0
这是脚本的第1个位置参数:two
这是脚本的第2个位置参数:three                //被移位了!

:shift 后面可以加整数参数,表示移位的位数。

typeset  ---  用于显示活设置变量,是 declare 的同义词

unset  --- 用于取消变量的定义
   --  表明选项结束
   -f   删除只读变量,但不能取消从 shell 环境中删除指定的变量和函数。如 PATH,PS1,PS2,PPID,UID,EUID 等的设置

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
6#
 楼主| 发表于 2008-12-16 02:54:10 | 只看该作者

引用的必要性

1、双引号
双引号可引用除字符 $`  ,  \\  外的任意字符或字符串

假设在 /home/beyes/linux-script 中有如下的几个文件:
com-change.sh hello.sh parm-1.sh parm-2.sh parm.sh

执行: echo  * 后:
com-change.sh hello.sh parm-1.sh parm-2.sh parm.sh

执行:echo "*" 后:
*

再执行以下命令:
 echo -e  "ert, $SHELL '\\n* home `echo beyes`"

结果为(可以说明,双引号无法屏蔽上述的几个特殊符号)
ert, /bin/bash '
* home beyes

2、单引号

单引号与双引号类似,不同的是 shell 会忽略任何引用值。也就是说,特殊含义字符被屏蔽了,这就将引号里的所有字符,包括引号都作为一个字符串。

3、反引号
shell 将反引号中的内容作为一个系统命令,并执行其内容。

4、反斜杠
如果一个字符有特殊含义,反斜杠则会防止 shell 误解其含义,即屏蔽起特殊含义。
一下字符包含有特殊含义:
& * + ^ $ ` " | ?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-29 08:49 , Processed in 0.088104 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表