跳转到内容
新建笔记

Shell 变量

  • shell 变量名只能包含数字、字⺟和下划线。
  • 局部变量:在脚本或命令中定义,仅在当前 shell 实例中有效。

在 Bash 中,变量名前不需要添加$。但是,当引用一个变量时,你需要添加$,Shell 支持以下三种定义变量的方式:

终端窗口
变量名=变量值
variable='变量值' #原样输出 变量和命令,命令需要反引,一般不这么做,而是用$(包含命令的语句)
variable="变量值"
# 注意,赋值号的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

使用变量时才能加$变量名 或者${变量名} 推荐后者,这样的话有边界

终端窗口
url=http://c.biancheng.net
echo $url
name='C语言中文网'
echo $name
author="严长生"
echo $author

例如

#!/bin/sh
a="hello world"
echo $a
echo 'a is ${a}'

readonly 定义变量只读。 unset 删除变量。 echo -e "Value of a is $a \n" 使转义字符\n生效,可以使用的转义符:\\ \a \b \f \n \r \t \v。

特殊变量说明
$0当前脚本的文件名
$n位置参数。第一个为 $1,第二个为 $2;第十个及以后使用 ${10} 等形式。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。"$@" 分别保留每个参数,与 "$*" 不同。
$?上个命令的退出状态,或函数的返回值。
$$当前 Shell 的进程 ID;在某些子 Shell 场景中仍保留父 Shell 值。

$0是脚本的名字,$1到$9是传递给脚本的前九个参数。$#是传递给脚本的参数数量。

#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "Total number of arguments: $#"
Shell特殊变量描述
$0当前脚本的文件名
$1第一个位置参数(脚本的第一个参数)
$2第二个位置参数(脚本的第二个参数)
$3第三个位置参数(脚本的第三个参数)
……
$9第九个位置参数(脚本的第九个参数)
$10第十个位置参数(需要用大括号{},如${10})
$*所有位置参数,"$1 $2 ..."
$@所有位置参数,每个参数被双引号包围,"$1" "$2" ...
$#位置参数的数量
$?上一个命令的退出状态
$$当前脚本的进程ID
$!上一个后台命令的进程ID
$-显示Shell使用的当前选项,与set命令输出相同
$_上一个命令的最后一个参数
$?上一个命令的退出状态
$LINENO当前行号
$FUNCNAME当前函数名
$BASH包含当前Bash版本信息
$BASH_SOURCE当前脚本或函数的源文件名(数组形式)
$BASH_VERSION当前Bash版本
$SHELLOPTS显示当前Shell选项
$OPTIND选项参数的索引
$REPLYread命令的默认变量
$SECONDS脚本开始运行以来的秒数
$HOSTNAME当前主机名
$HOSTTYPE机器类型(如x86_64)
$MACHTYPE机器类型(如i386)
$OSTYPE操作系统类型(如linux-gnu)
$PWD当前工作目录
$OLDPWD上一个工作目录
$HOME用户的主目录
$LOGNAME当前用户的登录名
$USER当前用户的用户名
$EUID当前用户的有效用户ID
$UID当前用户的用户ID
$GROUPS以空格分隔的用户所属组列表
$SHLVLShell的层级
$IFS内部字段分隔符(默认为空格、制表符和换行符)
$PATH命令搜索路径
$PS1主提示符
$PS2次级提示符
$PS3选择列表提示符
$PS4调试模式下的提示符
$COLUMNS终端的列数
$LINES终端的行数
$HISTSIZE历史列表的大小
$HISTFILE历史文件的路径
$IGNOREEOF忽略EOF的设置
$CDPATH改变目录时的搜索路径
$MAIL邮件文件的路径
$MAILCHECK检查新邮件的间隔时间
$RANDOM0到32767之间的伪随机数