linux学习之shell脚本 ------- 变量
2015-01-17 23:59
477 查看
[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
今天来看一下Shell中的一些变量。
1) 本地变量
2) 环境变量
3) 位置变量
4) 标准变量
5) 特殊变量
1) 本地变量
本地变量在用户现在的Shell生命周期的脚本中使用。
用法: variable-name=value
set: 可以显示本地所有的变量
注意,本地变量如果加上readonly,则该本地变量不能被修改,也就是说该变量仅仅是可读的,另外,可以直接输入readonly或readonly -p打印出所的的本地变量,例如:
“export 变量” 可以将该变量设置为环境变量,另外,可以直接输入export命令或env命令,就可以查看所有的环境变量,如:
parm.sh
再看一个脚本,实现按文件名查找当前目录下的文件
searchfile.sh
5) 特殊变量
$#: 传递到脚本的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可以超过9个。
$$: 脚本运行的当前进程ID号。
$!: 后台运行的最后一个进程的进程ID号。
$@: 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$-: 显示shell使用的当前选项,与set命令功能相同。
$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
我们修改上述的parm.sh脚本如下:
parm.sh
在变量名前加$,使用echo $变量名 就可以打印出该变量的值。
变量替换有以下几种方式:
以下例子演示了这几个变量替换使用方法和效果
用法: unset variable-name
影响变量的命令
declare
设置或显示变量
-f: 只显示函数名
-r: 创建只读变量(declare和typeset)
-x: 创建转出变量
-i: 创建整数变量
使用+替代-,可以颠倒选项的含义
export
用于创建传给子shell的变量
--: 表明选项结束,所有后续参数都是实参。
-f: 表明在"名-值"对中名字是函数名
-n: 把全局变量转换成局部变量。换名话说,命令的变量不再传递给shell。
-p: 显示全局变量列表
readonly
用于显示或设置只读变量
--: 表明选项结束
-f: 创建只读变量
set
设置或重设各种shell
shift
用于移动位置变量,调整位置变量。
typeset
用于显示或设置变量
是declare的同义词
unset
用于取消变量的定义
-- 表明选项结束
-f: 删除只读变量,但不能取消从Shell环境中删除指定的变量和函数,如PATH,PSI,PS2,PPID,UID,EUDI等。
其实,这些变量大多数已使用过,我们重点看一下shift的用法及意义,如下:
parm.sh
parm.sh
今天来看一下Shell中的一些变量。
变量类型:
Shell中有以下几种变量:1) 本地变量
2) 环境变量
3) 位置变量
4) 标准变量
5) 特殊变量
1) 本地变量
本地变量在用户现在的Shell生命周期的脚本中使用。用法: variable-name=value
set: 可以显示本地所有的变量
注意,本地变量如果加上readonly,则该本地变量不能被修改,也就是说该变量仅仅是可读的,另外,可以直接输入readonly或readonly -p打印出所的的本地变量,例如:
jesson@jesson-K43SV:~$ TIP="Hello World!" jesson@jesson-K43SV:~$ set | grep TIP TIP='Hello World!' jesson@jesson-K43SV:~$ echo $TIP Hello World! jesson@jesson-K43SV:~$ echo ${TIP}} Hello World!} jesson@jesson-K43SV:~$ TIP="hello world!" jesson@jesson-K43SV:~$ echo $TIP hello world! jesson@jesson-K43SV:~$ readonly TIP jesson@jesson-K43SV:~$ TIP="hello shell!" bash: TIP: 只读变量 jesson@jesson-K43SV:~$ readonly declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d" declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")' declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")' declare -ir EUID="1000" declare -ir PPID="2162" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -r TIP="hello world!" declare -ir UID="1000" jesson@jesson-K43SV:~$ readonly -p declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d" declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")' declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")' declare -ir EUID="1000" declare -ir PPID="2162" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -r TIP="hello world!" declare -ir UID="1000"
2) 环境变量
环境变量用于所有的用户进程(通常称为子进程),登录进程称为父进程。Shell中执行的用户进程均称为子进程。本地变量仅用于本地用户的进程,而环境变量则可用于所有的子进程,包括编辑器,脚本和应用。“export 变量” 可以将该变量设置为环境变量,另外,可以直接输入export命令或env命令,就可以查看所有的环境变量,如:
jesson@jesson-K43SV:~$ export NAME="jesson20121020" jesson@jesson-K43SV:~$ env | grep NAME NAME=jesson20121020
3) 位置变量
在Shell中位置有变量有9个,即$1,...,$9,超过9个就要用其他的方式实现,参考以下脚本:parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9运行以上脚本得到:
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数:
再看一个脚本,实现按文件名查找当前目录下的文件
searchfile.sh
#!/bin/bash #searchfile find . -name $1 -print如果我们要查找当前目录下的parm.sh这个文件,就可以这样做:
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./searchfile.sh parm.sh ./parm.sh可以看到,查找到了,并打印出来了。
4) 标准变量
bash默认建立了一些标准的环境变量,可以在/etc/profile中定义,主要有EXINIT,HOME(家目录),IFS(默认分隔符),LOGNAME,MAIL,MAILCHECK(默认为60),MAILPATH,PATH,PSI,PS2(用于一行运行多个命令时),SHELL,TERM(终端),TZ(时区),PWD(当前目录),MANPATH(帮助文档存放目录),TERMINFO,EDITOR等。 5) 特殊变量
$#: 传递到脚本的参数个数$*: 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可以超过9个。
$$: 脚本运行的当前进程ID号。
$!: 后台运行的最后一个进程的进程ID号。
$@: 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$-: 显示shell使用的当前选项,与set命令功能相同。
$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
我们修改上述的parm.sh脚本如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9echo "显示参数个数:" $#运行一下,结果如下:
echo "显示脚本全部参数:" $*
echo "显示当前脚本的进程ID号:" $$
echo "显示前一命令运行的状态:" $?
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 30089 显示前一命令运行的状态: 0shell中的变量基本就这5种,下面我们再看一些与变量相关的命令吧。
与变量相关的命令:
变量替换
变量替换即用变量的值替换它的名子。在变量名前加$,使用echo $变量名 就可以打印出该变量的值。
变量替换有以下几种方式:
变量替换方式 | 说明 |
$variable-name | 引用实际值到variable-name |
${variable-name} | 同上 |
${variable-name:+value} | 如果设置了variable-name,则显示其值,否则,为空 |
${variable-name:?value} | 如果未设置variable-name,则显示用户自定义的错误信息。 |
${variable-name:-value} | 如果未设置variable-name,则显示其值 |
${variable-name:=value} | 如果未设置variable-name,则设置其值并显示 |
jesson@jesson-K43SV:~$ var="hello world!" jesson@jesson-K43SV:~$ echo $var hello world! jesson@jesson-K43SV:~$ echo ${var} hello world! jesson@jesson-K43SV:~$ echo ${var:+"hello shell!"} hello shell! jesson@jesson-K43SV:~$ echo ${var1:+"hello shell!"} jesson@jesson-K43SV:~$ echo ${var:?"define"} hello world! jesson@jesson-K43SV:~$ echo ${var:-"hello shell!"} hello world! jesson@jesson-K43SV:~$ echo ${var1:-"hello shell!"} hello shell! jesson@jesson-K43SV:~$ echo $var1 jesson@jesson-K43SV:~$ echo ${var:="hello shell!"} hello world! jesson@jesson-K43SV:~$ echo ${var1:="hello shell!"} hello shell! jesson@jesson-K43SV:~$ echo $var1 hello shell!既然有变量替换,那么相应的肯定有变量清除了。
变量清除
可以清除已设置的变量。用法: unset variable-name
jesson@jesson-K43SV:~$ echo $var1 hello shell! jesson@jesson-K43SV:~$ unset var1 jesson@jesson-K43SV:~$ echo $var1
影响变量的命令
declare设置或显示变量
-f: 只显示函数名
-r: 创建只读变量(declare和typeset)
-x: 创建转出变量
-i: 创建整数变量
使用+替代-,可以颠倒选项的含义
export
用于创建传给子shell的变量
--: 表明选项结束,所有后续参数都是实参。
-f: 表明在"名-值"对中名字是函数名
-n: 把全局变量转换成局部变量。换名话说,命令的变量不再传递给shell。
-p: 显示全局变量列表
readonly
用于显示或设置只读变量
--: 表明选项结束
-f: 创建只读变量
set
设置或重设各种shell
shift
用于移动位置变量,调整位置变量。
typeset
用于显示或设置变量
是declare的同义词
unset
用于取消变量的定义
-- 表明选项结束
-f: 删除只读变量,但不能取消从Shell环境中删除指定的变量和函数,如PATH,PSI,PS2,PPID,UID,EUDI等。
其实,这些变量大多数已使用过,我们重点看一下shift的用法及意义,如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9echo "显示参数个数:" $#运行结果:
echo "显示脚本全部参数:" $*
echo "显示当前脚本的进程ID号:" $$
echo "显示前一命令运行的状态:" $?
shift
echo "脚本的第一个参数:" $1
echo "脚本的第二个参数:" $2
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 31218 显示前一命令运行的状态: 0 脚本的第一个参数: B 脚本的第二个参数: C接着,我们再改动一下,在shift 后加上2,如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9echo "显示参数个数:" $#运行结果如下:
echo "显示脚本全部参数:" $*
echo "显示当前脚本的进程ID号:" $$
echo "显示前一命令运行的状态:" $?
shift 2
echo "脚本的第一个参数:" $1
echo "脚本的第二个参数:" $2
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 31366 显示前一命令运行的状态: 0 脚本的第一个参数: C 脚本的第二个参数: D
相关文章推荐
- Linux之shell脚本学习(1)简介和变量
- linux学习第六十三篇:Shell脚本介绍,Shell脚本结构和执行,date命令用法,Shell脚本中的变量
- Linux学习之shell脚本——变量
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- Shell脚本学习笔记(二)--变量
- linux 基础学习之四:shell脚本学习(1)
- Linux系统shell脚本判断变量文件目录+l脚本的字符串截取(转)
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- linux 将文件内容赋值给shell脚本中的变量
- linux 基础学习之五:shell脚本学习(2)——基本语法
- Linux系统Shell脚本的入门学习
- 【shell脚本学习】2.linux shell变量
- Linux新手生存笔记[8]——shell脚本基础1-变量
- Linux学习(九)-----shell脚本学习 条件判断和循环
- 一本不错的Linux/Unix Shell脚本学习教程
- 轻松学习Linux之Shell预定义变量
- Linux学习心得:细细品味shell脚本中的细节与用户体验 ^_^
- shell脚本学习:特殊变量和C语言格式循环
- [Linux] shell bash 脚本特殊变量 [大三TJB_708]
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等