Shell 的变数功能--变数的取用与设定:echo, 变数..
时间:2009-01-15 来源:poplar.xu
变数的取用与设定:echo, 变数设定规则, unset
说的口沫横飞的,也不知道‘变数’与‘变数代表的内容’有啥关系? 当然啦,那我们就将‘变数’的‘内容’拿出来给您瞧瞧就好了。利用 echo 这个指令来取用变数, 但是,变数在被取用时,前面必须要加上 $ 才行,举例来说,要知道 PATH 的内容,该如何是好?
[root@linux ~]# echo $variable
[root@linux ~]# echo $PATH
/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
[root@linux ~]# echo ${PATH}
变数的取用就如同上面的范例,利用 ehco 就能够读出,只是需要在变数名称前面加上 $ , 或者是以 ${variable} 的方式来取用都可以!当然啦,那个 echo 的功能可是很多的, 我们这里单纯是拿 echo 来读出变数的内容而已,更多的 echo 使用,请自行给他 man echo 吧! ^_^
例题一:请在萤幕上面显示出您的环境变数 HOME 与 MAIL:
答:
echo $HOME
echo $MAIL
OK!现在我们知道了变数与变数内的之间的相关性了,好了,那么我要如何‘设定’或者是‘修改’ 某个变数的内容啊?!很简单啦!用‘等号(=)’连接变数与他的内容就好啦!举例来说: 我要将 myname 这个变数名称的内容设定为 VBird ,那么:
[root@linux ~]# echo $myname
<==这里并没有任何资料~因为这个变数尚未被设定!是空的!
[root@linux ~]# myname=VBird
[root@linux ~]# echo $myname
VBird <==出现了!因为这个变数已经被设定了!
瞧!如此一来,这个变数名称 myname 的内容就带有 VBird 这个资料啰~ 而由上面的例子当中,我们也可以知道: 当一个变数名称尚未被设定时,预设的内容是‘空’的。 另外,变数在设定时,还是需要符合某些规定的,否则会设定失败喔! 这些规则如下所示啊!
1. 变数与变数内容以等号‘=’来连结;
2. 等号两边不能直接接空白字元;
3. 变数名称只能是英文字母与数字,但是数字不能是开头字元;
4. 若有空白字元可以使用双引号‘ " ’或单引号‘ ' ’来将变数内容结合起来,但须要特别留意, 双引号内的特殊字元可以保有变数特性,但是单引号内的特殊字元则仅为一般字元;
5. 必要时需要以跳脱字元‘ \ ’来将特殊符号 ( 如 Enter, $, \, 空白字元, ' 等 ) 变成一般符号;
6. 在一串指令中,还需要藉由其他的指令提供的资讯,可以使用 quote ‘ ` command` ’;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)
7. 若该变数为扩增变数内容时,则需以双引号及 $变数名称 如:‘ "$PATH":/home’继续累加内容;
8. 若该变数需要在其他子程序执行,则需要以 export 来使变数变成环境变数, 如‘export PATH’;
9. 通常大写字元为系统预设变数,自行设定变数可以使用小写字元,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;
10. 取消变数的方法为:‘unset 变数名称’。
底下我们举几个例子来让您试看看,就知道怎么设定好您的变数啰!
范例一:设定一变数 name ,且内容为 VBird 。
[root@linux ~]# 12name=VBird
-bash: 12name=VBird: command not found <==萤幕会显示错误!因为不能以数字开头!
[root@linux ~]# name = VBird <==还是错误!因为有空白!
[root@linux ~]# name=VBird <==OK 的啦!
范例二:承上题,若变数内容为 VBird's name 呢?
[root@linux ~]# name=VBird's name
# 因为单引号可以将 Enter 这个特殊字符取消,所以,您可以继续在下一行输入内容~
# 不过,这与我们要达到的功能不同,所以,算是失败的啦!
[root@linux ~]# name="VBird's name" <==OK 的啦!
[root@linux ~]# name=VBird\'s\ name
# 利用反斜线 (\) 跳脱特殊字元,例如单引号与空白键,这也是 OK 的啦!
范例三:我要在 PATH 这个变数当中‘累加’:/home/dmtsai/bin 这个目录
[root@linux ~]# PATH=$PATH:/home/dmtsai/bin
[root@linux ~]# PATH="$PATH":/home/dmtsai/bin
# 上面这两种格式在 PATH 里头的设定都是 OK 的!但是底下的例子就不见得啰!
范例四:呈范例三,我要将 name 的内容多出 "yes" 呢?
[root@linux ~]# name=$nameyes
# 知道了吧?如果没有双引号,那么变数成了啥?name 的内容是 $nameyes 这个变数!
# 呵呵!我们可没有设定过 nameyes 这个变数呐!所以,应该是底下这样才对!
[root@linux ~]# name="$name"yes
[root@linux ~]# name=${name}yes
范例五:如何让我刚刚设定的 name=VBird 可以用在下个 shell 的程序?
[root@linux ~]# name=VBird
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==嘿嘿!并没有刚刚设定的内容喔!
[root@linux ~]# exit <==离开刚刚的子程序
[root@linux ~]# export name
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==出现了设定值了!
[root@linux ~]# exit <==离开刚刚的子程序
# 什么是‘子程序’呢?就是说,在我目前这个 shell 的情况下,
# 去启用另一个新的 shell ,新的那个 shell 就是子程序啦!
#在一般的状态下,父程序的自订变数是无法在子程序内使用的。但是透过 export 将变数变成
# 环境变数后,就能够在子程序底下应用了!很不赖吧!至于程序的相关概念,
# 我们会在‘程序与资源管理’章节当中提到的喔!
范例六:如何进入到您目前核心的模组目录?
[root@linux ~]# cd /lib/modules/`uname -r`/kernel
# 每个作业系统核心版本都不相同,以 FC4 为例,他的预设核心版本是
# 2.6.11-1.1369_FC4 所以,他的模组目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 。
# 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令
# 先取得版本资讯,所以啰,就可以透过上面指令当中的内含指令 `uname -r`
# 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程式所放置
# 的目录啰!很方便吧!
范例七:取消刚刚设定的 name 这个变数内容
[root@linux ~]# unset name
根据上面的案例你可以试试看!就可以瞭解变数的设定啰!这个是很重要的呦!请勤加练习!! 其中,较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字元、钱字号、quote 符号等等,底下的例题想一想吧!
例题二:在变数的设定当中,单引号与双引号的用途有何不同?
答:
单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变数, name=VBird ,现在想以 name 这个变数的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
[root@linux ~]# name=VBird
[root@linux ~]# echo $name
VBird
[root@linux ~]# myname="$name its me"
[root@linux ~]# echo $myname
VBird its me
[root@linux ~]# myname='$name its me'
[root@linux ~]# echo $myname
$name its me
发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变数内容, 仅为一般字元的显示型态而已!这里必需要特别小心在意!
例题三:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
答:
在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入资讯!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以‘ cd 目录’到该目录下,当然也可以执行如同上面范例六的执行内容啰。
另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:
[root@linux ~]# ls -l `locate crontab`
如此一来,先以 locate 将档名资料都列出来,再以 ls 指令来处理的意思啦!瞭了吗? ^_^
说的口沫横飞的,也不知道‘变数’与‘变数代表的内容’有啥关系? 当然啦,那我们就将‘变数’的‘内容’拿出来给您瞧瞧就好了。利用 echo 这个指令来取用变数, 但是,变数在被取用时,前面必须要加上 $ 才行,举例来说,要知道 PATH 的内容,该如何是好?
[root@linux ~]# echo $variable
[root@linux ~]# echo $PATH
/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
[root@linux ~]# echo ${PATH}
变数的取用就如同上面的范例,利用 ehco 就能够读出,只是需要在变数名称前面加上 $ , 或者是以 ${variable} 的方式来取用都可以!当然啦,那个 echo 的功能可是很多的, 我们这里单纯是拿 echo 来读出变数的内容而已,更多的 echo 使用,请自行给他 man echo 吧! ^_^
例题一:请在萤幕上面显示出您的环境变数 HOME 与 MAIL:
答:
echo $HOME
echo $MAIL
OK!现在我们知道了变数与变数内的之间的相关性了,好了,那么我要如何‘设定’或者是‘修改’ 某个变数的内容啊?!很简单啦!用‘等号(=)’连接变数与他的内容就好啦!举例来说: 我要将 myname 这个变数名称的内容设定为 VBird ,那么:
[root@linux ~]# echo $myname
<==这里并没有任何资料~因为这个变数尚未被设定!是空的!
[root@linux ~]# myname=VBird
[root@linux ~]# echo $myname
VBird <==出现了!因为这个变数已经被设定了!
瞧!如此一来,这个变数名称 myname 的内容就带有 VBird 这个资料啰~ 而由上面的例子当中,我们也可以知道: 当一个变数名称尚未被设定时,预设的内容是‘空’的。 另外,变数在设定时,还是需要符合某些规定的,否则会设定失败喔! 这些规则如下所示啊!
1. 变数与变数内容以等号‘=’来连结;
2. 等号两边不能直接接空白字元;
3. 变数名称只能是英文字母与数字,但是数字不能是开头字元;
4. 若有空白字元可以使用双引号‘ " ’或单引号‘ ' ’来将变数内容结合起来,但须要特别留意, 双引号内的特殊字元可以保有变数特性,但是单引号内的特殊字元则仅为一般字元;
5. 必要时需要以跳脱字元‘ \ ’来将特殊符号 ( 如 Enter, $, \, 空白字元, ' 等 ) 变成一般符号;
6. 在一串指令中,还需要藉由其他的指令提供的资讯,可以使用 quote ‘ ` command` ’;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)
7. 若该变数为扩增变数内容时,则需以双引号及 $变数名称 如:‘ "$PATH":/home’继续累加内容;
8. 若该变数需要在其他子程序执行,则需要以 export 来使变数变成环境变数, 如‘export PATH’;
9. 通常大写字元为系统预设变数,自行设定变数可以使用小写字元,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;
10. 取消变数的方法为:‘unset 变数名称’。
底下我们举几个例子来让您试看看,就知道怎么设定好您的变数啰!
范例一:设定一变数 name ,且内容为 VBird 。
[root@linux ~]# 12name=VBird
-bash: 12name=VBird: command not found <==萤幕会显示错误!因为不能以数字开头!
[root@linux ~]# name = VBird <==还是错误!因为有空白!
[root@linux ~]# name=VBird <==OK 的啦!
范例二:承上题,若变数内容为 VBird's name 呢?
[root@linux ~]# name=VBird's name
# 因为单引号可以将 Enter 这个特殊字符取消,所以,您可以继续在下一行输入内容~
# 不过,这与我们要达到的功能不同,所以,算是失败的啦!
[root@linux ~]# name="VBird's name" <==OK 的啦!
[root@linux ~]# name=VBird\'s\ name
# 利用反斜线 (\) 跳脱特殊字元,例如单引号与空白键,这也是 OK 的啦!
范例三:我要在 PATH 这个变数当中‘累加’:/home/dmtsai/bin 这个目录
[root@linux ~]# PATH=$PATH:/home/dmtsai/bin
[root@linux ~]# PATH="$PATH":/home/dmtsai/bin
# 上面这两种格式在 PATH 里头的设定都是 OK 的!但是底下的例子就不见得啰!
范例四:呈范例三,我要将 name 的内容多出 "yes" 呢?
[root@linux ~]# name=$nameyes
# 知道了吧?如果没有双引号,那么变数成了啥?name 的内容是 $nameyes 这个变数!
# 呵呵!我们可没有设定过 nameyes 这个变数呐!所以,应该是底下这样才对!
[root@linux ~]# name="$name"yes
[root@linux ~]# name=${name}yes
范例五:如何让我刚刚设定的 name=VBird 可以用在下个 shell 的程序?
[root@linux ~]# name=VBird
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==嘿嘿!并没有刚刚设定的内容喔!
[root@linux ~]# exit <==离开刚刚的子程序
[root@linux ~]# export name
[root@linux ~]# bash <==进入到所谓的子程序
[root@linux ~]# echo $name <==出现了设定值了!
[root@linux ~]# exit <==离开刚刚的子程序
# 什么是‘子程序’呢?就是说,在我目前这个 shell 的情况下,
# 去启用另一个新的 shell ,新的那个 shell 就是子程序啦!
#在一般的状态下,父程序的自订变数是无法在子程序内使用的。但是透过 export 将变数变成
# 环境变数后,就能够在子程序底下应用了!很不赖吧!至于程序的相关概念,
# 我们会在‘程序与资源管理’章节当中提到的喔!
范例六:如何进入到您目前核心的模组目录?
[root@linux ~]# cd /lib/modules/`uname -r`/kernel
# 每个作业系统核心版本都不相同,以 FC4 为例,他的预设核心版本是
# 2.6.11-1.1369_FC4 所以,他的模组目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 。
# 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令
# 先取得版本资讯,所以啰,就可以透过上面指令当中的内含指令 `uname -r`
# 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程式所放置
# 的目录啰!很方便吧!
范例七:取消刚刚设定的 name 这个变数内容
[root@linux ~]# unset name
根据上面的案例你可以试试看!就可以瞭解变数的设定啰!这个是很重要的呦!请勤加练习!! 其中,较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字元、钱字号、quote 符号等等,底下的例题想一想吧!
例题二:在变数的设定当中,单引号与双引号的用途有何不同?
答:
单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变数, name=VBird ,现在想以 name 这个变数的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢?
[root@linux ~]# name=VBird
[root@linux ~]# echo $name
VBird
[root@linux ~]# myname="$name its me"
[root@linux ~]# echo $myname
VBird its me
[root@linux ~]# myname='$name its me'
[root@linux ~]# echo $myname
$name its me
发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变数内容, 仅为一般字元的显示型态而已!这里必需要特别小心在意!
例题三:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
答:
在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入资讯!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以‘ cd 目录’到该目录下,当然也可以执行如同上面范例六的执行内容啰。
另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:
[root@linux ~]# ls -l `locate crontab`
如此一来,先以 locate 将档名资料都列出来,再以 ls 指令来处理的意思啦!瞭了吗? ^_^
相关阅读 更多 +