linux学习之shell脚本 ------- 变量

时间:2022-06-25 05:19:41

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]

今天来看一下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 "脚本的第九个参数:" $9
echo "显示参数个数:" $#
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
显示前一命令运行的状态: 0
   shell中的变量基本就这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 [n]

    用于移动位置变量,调整位置变量。

   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 "脚本的第九个参数:" $9
echo "显示参数个数:" $#
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 "脚本的第九个参数:" $9
echo "显示参数个数:" $#
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