博客
关于我
shell脚本变量
阅读量:75 次
发布时间:2019-02-26

本文共 1757 字,大约阅读时间需要 5 分钟。

Shell 变量与脚本编写指南

Shell 变量是脚本编写中不可或缺的重要工具,熟练掌握变量的使用方法能够显著提升脚本的灵活性和实用性。本文将详细介绍 Shell 变量的相关知识,包括自定义变量、位置变量、内嵌变量、环境变量以及数组变量等。

自定义变量

在 Shell 中,变量的命名和赋值操作非常灵活。与其他编程语言不同,Shell 不需要事先声明变量,变量在使用时就会被定义。因此,在赋值时需要注意以下几点:

  • 空格敏感性:Shell 对空格高度敏感,变量名和赋值之间必须严格遵守格式要求。
  • 范围确定:使用花括号 {} 可以明确变量的作用范围,避免命名冲突。

正确的赋值格式应为:

$NEWENV=123

如果格式不正确,Shell 将无法识别变量。

此外,变量范围可以通过以下方式限定:

$BRACE=123$echo $BRACEEEE$echo ${BRACE}EEE123EEE

通过这种方式,可以确保变量值不会因上下文变化而受到影响。

位置变量

位置变量用于访问脚本执行时的命令参数,具体包括以下几个特殊变量:

  • $0:表示脚本的名称。
  • $1$9:分别表示脚本的第 1 到第 9 个参数。
  • ${10}:表示第 10 个参数及之后的所有参数(需要使用花括号)。
  • 在函数定义中,参数列表中的 $1$n 用于接收外部传递的参数,而 $0 仍然表示脚本名称。

示例:

$cat ./shell.sh#!/bin/bashecho "$10"echo "${10}"./*.sh 11 22 33 44 55 66 77 88 99 0011000

当脚本接收多个参数时,使用位置变量能够实现灵活的参数处理。

内嵌变量

内嵌变量用于获取当前进程的信息,常见的内嵌变量包括:

  • #:表示当前进程的参数个数,通常用于循环控制。
  • @:表示命令行传递的所有参数。如果放在双引号内,会展开为单个参数列表。
  • *:表示命令行传递的所有参数,和 $@ 的效果类似,但没有展开功能。

示例:

while [ $# != 0 ] do  case $1 in    ...  esac  shiftdone

此外,$? 用于获取前一个命令的退出状态,$$ 表示当前进程的进程 ID。

环境变量

环境变量是一组预定义的变量,用于配置系统的运行环境。常见的环境变量包括:

  • HOME:表示用户的家目录。
  • PATH:表示可执行文件的路径。
  • IFS:表示字段分隔符,默认为空格或 tab。
  • LINENO:表示脚本中刚执行的行号。
  • PPID:表示父进程的进程 ID。

环境变量的值通常通过 export 命令传递给子进程。例如:

$echo $LANG en_AU.UTF-8$echo "$LINENO" 8$echo "$PATH" /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/linux/toolchain/gcc-4.6.4/bin:.$echo "$PPID" 2647$ps auxUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDlinux     2647  0.0  2.2 110152 11540 ?        Rl   07:51   0:01 gnome-terminal$echo "$PWD" /home/linux

数组变量

Shell 支持数组变量,其定义方式为:

$arr=(0 1 2 var)

通过 ${arr[n]} 可以访问数组中指定位置的元素,$arr[@] 则表示数组的所有元素。

数组元素可以单独赋值:

$arr[3]=qq

并通过以下命令查看数组信息:

$echo "${arr[@]}" 0 1 2 qq$echo "${arr[*]}" 0 1 2 qq

数组的长度可以通过 ${#arr[@]}${#arr[*]} 查询。

通过以上知识,读者可以更高效地编写 Shell 脚本,充分发挥 Shell 的强大功能。

转载地址:http://sccz.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0072---Protobuf内容小结
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0081---编解码器和处理器链梳理
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty心跳检测
查看>>
Netty心跳检测机制
查看>>
Netty核心模块组件
查看>>
Netty框架内的宝藏:ByteBuf
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—3.Reactor线程模型三
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>