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

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

今天来看一下Shell中的一些变量。

变量类型:

  Shell中有以下几种变量:

  1) 本地变量

  2) 环境变量

  3) 位置变量

  4) 标准变量

  5) 特殊变量

  

  1) 本地变量

   本地变量在用户现在的Shell生命周期的脚本中使用。

    用法: variable-name=value

   set: 可以显示本地所有的变量

   注意,本地变量如果加上readonly,则该本地变量不能被修改,也就是说该变量仅仅是可读的,另外,可以直接输入readonly或readonly -p打印出所的的本地变量,例如:

[email protected]:~$ TIP="Hello World!"
[email protected]:~$ set | grep TIP
TIP='Hello World!'
[email protected]:~$ echo $TIP
Hello World!
[email protected]:~$ echo ${TIP}}
Hello World!}
[email protected]:~$ TIP="hello world!"
[email protected]:~$ echo $TIP
hello world!
[email protected]:~$ readonly TIP
[email protected]:~$ TIP="hello shell!"
bash: TIP: 只读变量
[email protected]:~$ 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"
[email protected]:~$ 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命令,就可以查看所有的环境变量,如:

[email protected]:~$ export NAME="jesson20121020"
[email protected]:~$ 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

   运行以上脚本得到:

[email protected]:~/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这个文件,就可以这样做:

[email protected]:~/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号。

    [email protected]: 与$#相同,但是使用时加引号,并在引号中返回每个参数。

    $-: 显示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 "显示前一命令运行的状态:" $?

  运行一下,结果如下:

[email protected]:~/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,则设置其值并显示

   以下例子演示了这几个变量替换使用方法和效果

[email protected]:~$ var="hello world!"
[email protected]:~$ echo $var
hello world!
[email protected]:~$ echo ${var}
hello world!
[email protected]:~$ echo ${var:+"hello shell!"}
hello shell!
[email protected]:~$ echo ${var1:+"hello shell!"}

[email protected]:~$ echo ${var:?"define"}
hello world!
[email protected]:~$ echo ${var:-"hello shell!"}
hello world!
[email protected]:~$ echo ${var1:-"hello shell!"}
hello shell!
[email protected]:~$ echo $var1

[email protected]:~$ echo ${var:="hello shell!"}
hello world!
[email protected]:~$ echo ${var1:="hello shell!"}
hello shell!
[email protected]:~$ echo $var1
hello shell!

   既然有变量替换,那么相应的肯定有变量清除了。

  变量清除

   可以清除已设置的变量。

     用法: unset variable-name

[email protected]:~$ echo $var1
hello shell!
[email protected]:~$ unset var1
[email protected]:~$ 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

   运行结果:

[email protected]:~/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

   运行结果如下:

[email protected]:~/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
时间: 2024-10-29 19:11:52

linux学习之shell脚本 ------- 变量的相关文章

linux学习之shell脚本 ------- 输入与输出

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 前面介绍了Shell脚本的基础和运算符等,今天再来看一下关于Shell脚本的输入与输出. Shell输入与输出的一些命令: echo read cat 管道 tee exec Shell输入与输出的一些概念: 文件重定向 标准输入.输出和错误 合并标准输出和标准错误 使用文件描述符 下面,我们挨个看每个命令的用法: 输入输出命令的用法: 1. echo 该命令的作用是可以显

linux学习之shell脚本

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] Shell脚本基本元素: #!/bin/bash --- 第一行 # --- 注释 变量 流程控制结构 看一个简单的例子,学任何语言,我想大多数情况下都是从helloworld程序开始的,shell也是一门语言,我们也从helloworld开始. 新建一个名为helloworld.sh的文件,在里面写入: helloworld.sh #!/bin/sh #这是一个很简单的打

linux学习笔记:shell脚本编程相关(上)

前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的. 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例. shell脚本的格式 首行shebang机制: bash脚本,首行添加#!/bin/bash [options] csh脚本,首行添加#!/bin/csh [options] ksh脚本,首行添加#!/bin/ksh [options] -- 描述脚本的注释部分: 包括Author,

linux学习之shell脚本 ------- 脚本参数传递

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天再来看一下如何向shell脚本传递参数,需要掌握两个命令,一个是 shift命令,另一个是getopts. 脚本参数传递 shift命令 用法: shift n 每次将参数位置向左偏移n位 假如我们要实现统计多个文件的总行数,就可以用到这个shift命令了,如下: opt2.sh #!/bin/bash #op2 static files total lines; st

Linux学习日记—shell脚本基础

在Linux的日常维护中,shell脚本是我们必不可少的日常管理之一:其作用是解决服务器的自动化维护工作,减轻管理员的工作量:如果想提高shell脚本的编写速度,必须要熟练使用vi编辑器的各种快捷键. [什么是shell]    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使

Linux学习-高级shell脚本编程(一)函数

引文: 通常编写shell脚本时,你会发现很多地方都要用到相同的代码或者说是相同的功能.如果是一段小代码,那无所谓.可如果多次使用而且还是相同的代码,我想你也会感觉很烦的.为了能够让代码重用,这就使用到函数了. 温馨提示 变量赋值的格式为: 变量名=变量值 注意事项: 变量名前面不应加美元"$"符号.(和PHP不同)等号"=" 前后不可以有空格.和C语言不同,Shell中不需要显式的语法来声明变量. 变量名不可以直接和其他字符相连,如果想相连,必须用括号:echo

Linux学习日记—Shell脚本与计划任务

本篇文章将以实现MySQL数据库的定期自动备份为目标,介绍Shell脚本与计划任务的完美协作过程.其中,Shell脚本负责具体的备份操作,Crond服务器负责控制备份周期. [确认备份方案] 备份主机:IP地址为192.168.4.110,通过机柜内网络连接目标主机. 数据库服务器:IP地址为192.168.4.11,MySQL服务监听端口为3306. 备份内容:对MySQL服务器中的studydb,coursdb库进行远程备份,每天凌晨2:30执行,每个库备份独立的.sql文件,然后压缩为.t

linux学习19 shell脚本基础-bash脚本编程基础及配置文件

一.shell脚本编程 1.编程语言的分类,根据运行方式 a.编译运行:源代码 --> 编译器(编译) --> 程序文件 C语言: b.解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行:即源代码本身并不能运行,而是启动一个解释器的进程,把整个源代码的内容当做解释器的参数.因为其是边解释边运行因此运行过程中比起编译运行速度会差一些. c.无论是编译器还是解释器中间总需要另外一个程序,即在运行过程中全程参与,这就是我们说的翻译官,他需要将我们人能识别的代码转换成机器所能识别的

linux学习18 shell脚本基础-bash变量和逻辑运行

一.回顾 1.用户管理,权限管理,install,mktemp 2.用户管理: 3.权限管理: mode,ownership mode: user group other r w x 4.命令:install,mktemp 二.bash特性及bash脚本编程初步 1.终端:附着在终端的接口程序 GUI:KDE,GNome,Xfce CLI:/etc/shells 2.bash的特性: a.命令行展开:~,{} b.命令别名:alias,unalias c.命令历史:history d.文件名通配