bash shell 内置参数
PPID:该bash的呼叫者process ID.
PWD:目前的工作目录。每次使用cd命令更改目录时,该值也会随之变化。
OLDPWD:上一个工作目录。
REPLY:当read命令没有参数时,直接设在REPLY上。
UID:User ID,密码文件账号中的第三个域值
EUID:Effective User ID,有效的使用者ID。表示当前用户有效的用户ID号,当启动Shell时,根据/etc/passwd 文件中的用户项进行赋值。
BASH:该变量包含了Bash命令的完整路径。其值通常为/bin/bash。
BASH_VERSION:表示当前Bash命令版本的一个数字。
BASHPID:当前bash进程的进程号。
SHLVL:每次有Bash执行时,数字加一。
RANDOM:每次这个参数被用到时,就会产生一个乱数在RANDOM上。
SECONDS:从这个Shell一开始启动後的时间。
LINENO:Script的行数。
HISTCMD:历史记录数。
OPTARG:getopts处理的最後一个选项参数。
OPTIND:下一个要由getopts所处理的参数号码。
HOSTTYPE:机器种类。
OSTYPE:作业系统名称,用来识别当前操作系统。对于Fedora Linux根据所使用的Shell类型的不同,其值可以是linux或者linux-gnu(此外,Bash 也可以在其他操作系统上运行)。
IFS:Internal Field Separator。
PATH:命令搜寻路径。该变量值为冒号分隔的目录列表,主要用来查找需要输入的命令的相关路径集,不同用户可能不同。
PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
HOME:目前使用者的home directory;
CDPATH:cd命令的搜寻路径。
ENV:如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。
MAIL:如果这个参数被设定,而且MAILPATH没有被设定,那麽有信件进来时,bash会通知使用者。
MAILCHECK:设定多久时间检查邮件一次。
MAILPATH:一串的邮件检查路径。
MAIL_WARNING:如果有设定的话,邮件被读取後,将会显示讯息。
PS1:提示讯息设定,内定为"bash$ "。该变量设置了Shell 提示符的值。可以将许多项目读取到提示符中(比如日期、时间、用户名、主机名等)。但有时一条命令需要额外的提示符,此时可以使用变量PS2、PS3 等进行设置。
PS2:第二提示讯息设定,内定为">; "。
PS3:select命令所使用的提示讯息。
PS4:执行追踪时用的提示讯息设定,内定为"+ "。
HISTSIZE:命令历史记录量,内定为500。
HISTFILE:历史记录档,内定~/.bash_history。
HISTFILESIZE:历史记录档行数最大值,内定500。
OPTERR:如果设为1,bash会显示getopts的错误。
PROMPT_COMMAND:如果设定的话,该值会在每次执行命令前都显示。
IGNOREEOF:将EOF值当成输入,内定为10。
TMOUT:如果设为大于零的数字,该值被解译为输入等待秒数。表示Shell可以空闲的秒数,在秒数到达后 Shell 将会退出。该安全功能能够减少无人值守的Shell被未授权用户访问的可能性(该变量必须在登录Shell中设置,实际上导致Shell注销用户)。
FCEDIT:fc命令的内定编辑器。
FIGNORE:请详见READLINE。
INPUTRC:readline的startup file,内定~/.inputrc
CDPATH:cd命令的搜寻路径
FCEDITOR:fc命令默认的比较器,如果设置了该变量,则表示fc命令用来编辑history命令的文本编辑器。如果没有设置则使用vi命令。
FIGNORE:在进行命令补齐时,如若想忽略的扩展名列表
FUNCNAME:在函数执行时,此变量内容即为函数式的名称
GLOBIGNORE:
GROUPS:这是一个数组变量,包含了当前用户所属组的组ID号
HISTCMD:当前指令执行完后,在历史指令中的排列编号;该变量返回历史命令列表中当前命令的数量
HISTCONTROL:控制指令是否存入历史脚本文件中
HISTFILE:设定历史脚本文件的路径文件名,表示历史命令文件的位置,该位置通常位于SHOME/bash_ history。
HISTFILESIZE:历史脚本文件存储指令的最大行数,当达到该数量时,最早的命令将被丢弃;其默认值为1000。
HISTIGNORE:不存入历史脚本文件的指令样式
HISTSIZE:历史脚本文件存储指令的最大行数
HOME:用户的家目录位置,即每次登录后或者输入带有任何选项的cd命令时的当前工作目录。
HOSTFILE:包含自动补齐主机名的数据文件
HOSTNAME:当前主机的主机名称
HOSTTYPE:主机架构形态,该变量值描述了Linux系统正在运行的计算机系统结构。对于与Intel兼容的PC,其值为i[3-6]86 或者与i386-linux相类似的值。而对于AMD 64位计算机,其值为x86_64。
IFS:定义字段分割符号
INPUTRC:设定命令行函数式库readline的启动配置文件,可覆盖~/.inputrc的设定
LANG:目前语系的名称
LC_ALL:目前的locale
LC_COLLATE:locale字母排序
LC_CTYPE:locale字符分类
LC_MESSAGES:locale信息显示的转换
LINENO:script已执行到的行数
MACHTYPE:描述主机形态的GNU格式,如像:i486-pc-linux-gnu
MAIL:邮件文件的名称,表示邮箱文件的位置。该文件通常是/ar/spoo/mail目录中的用户名。
MAILCHECK:每隔多久就检查一次邮件,默认是60秒
MAILPATH:设定检查邮件的文件名,如果有两个以上,用:分割
PWD:当前工作目录
OLDPWD:前一个工作目录,表示修改当前工作目录之前的工作目录
OPTARG:使用getopts处理选项时,取得的选项的参数。
OPTIND:使用getopts处理选项时,选项的索引值
OPTERR:如果把OPTERR设置为1,则getopts发生错误时,不管选项第一个字符是否为:,仍然显示错误信息。
OSTYPE:执行bash的操作系统种类。
PATH:命令的搜寻路径
PPID:父进程的进程编号,表示启动了当前Shell的命令的进程ID(例如,包含了Shell 的Terminal窗口)。
PROMPT_COMMAND:可以将该变量设置为一个命令名,以便在每次Shell提示符显示之前运行该命令;如果将该变量设置为PROMPT_COMMAND=date,那么在提示符出现之前会列出当前日期时间。
RANDOM:随机函数,返回0~32767之间的随机数;访问该变量将会生成一个随机数。
REPLY:select和read没有设定读取变量时,默认的变量名称为REPLY。
SECONDS:目前bash shell已执行的时间,表示自Shell启动之后的秒数。
SHELL:shell文件的路径
SHELLOPTS:本变量的内容是经过set -o 设定为已开启的shell选项,以:分隔
SHLVL:子shell的层级数;表示与当前Shell会话相关联的Shell级别数。当登录到Shell时,SHLVL 为1。每执行一次Bash命令后(例如,使用su命令成为一名新用户,或者输入bash),该级别数将递增。
TIMEFORMAT:设定time统计运行时间的格式
TMOUT:如果tmout的大于0,则bash会等待tmout秒后,自动结束目前的bash shell;上文有提及。
位置变量
参数$0代表脚本名称
参数$#统计脚本参数的个数
参数$1...$9代表输入第一至第九个参数
参数$?代表脚本返回值:正确返回0,不正确返回非0
参数$*代表将命令行输入的所有参数作为一个字符串处理
参数$@代表将命令行输入的所有参数看作多个独立的变量处理
正常情况下,$@和$*在正常使用的时候是没有区别的,但是当在for循环中就显示出差异了,因此在工作中还需要注意区分才是,同时在使用的时候需要用双引号引起来。
$*与$@的区别
shift代表参数号偏移
位置变量的使用一般体现在脚本中,其使得在脚本中的命令可以调用运行脚本时不同位置的参数,参数一般使用空格分隔,$0代表当前Shell程序的文件名称,$1代表运行Shell程序时的第一个参数,$2为第二个参数,依此类推(范围为$1~$9)。使用Shell位置变量有助于我们查看很多相关信息,$#代表Shell程序所有参数的个数;$*与$@均代表所有参数的内容,区别是$*将所有的参数作为一个整体,而$@将所有的参数分别作为个体看待;$$代表当前进程的ID号码,$?表示程序的退出代码(返回0一般代表命令执行成功,非0代表命令执行失败)。
S1-$n:位置参数
$*:代表所有的位置参数,并且视为一个字符串
$@:代表所有的位置参数,代表各位置参数组成的串行
$#:位置参数的个数
$_:bash的绝对路径 或者 上一个命令执行时,最后一个位置参数
$?:上一个命令执行结束后的传回值,0表示执行成功,非0表示执行有误
$$:目前bash shell的进程编号
$!:上一个后台程序的进程编号
$-:bash shell目前使用的功能选项
notify:如果设定了,bash立即报告被终结的背景程式。
history_control, HISTCONTROL:history使用。
command_oriented_history:存入多行指令。
glob_dot_filenames:如果设定了,bash将会把"."包含入档案路径中。
allow_null_glob_expansion:如果设定了,bash允许路径明称为null string。
histchars:history使用。
nolinks:如果设定了,执行指令时,不会跟随symbolic links。
hostname_completion_file, HOSTFILE:包含与/etc/hosts相同格式的档名。
noclobber:如果设定了,Bash不会覆写任何由">;"、">;&"及"<>;"所操作的档案。
auto_resume:请见任务控制一节。
no_exit_on_failed_exec:如果该值存在,非互动的shell不会因为exec失败而跳出。
cdable_vars:如果启动,而cd命令找不到目录,可切换到参数形态指定的目录下。
参数扩展速查表(Cheat Sheet)
1. 基本语法和常用操作符
:-,:=,:+,:? 只有 := 操作会实际修改变量的值,其他三种都只是进行条件判断和值替换。
2. 子字符串操作
注意:offset 从 0 开始计算。如果 offset 为负数,表示从末尾开始算起(-1开始计算),需要加空格或使用括号,如 ${var: -3} 或 ${var:(-3)}。
3. 模式匹配(删除)
这类扩展用于从字符串的开头或结尾删除匹配指定模式的部分。模式是通配符模式,不是正则表达式。
记忆技巧:
# 是从头开始(因为通常在注释开头)。
% 是从尾开始(百分比的百分号在最后)。
一个符号 #, % 表示最短匹配(非贪婪)。
两个符号 ##, %% 表示最长匹配(贪婪)。
4. 查找与替换
5. 大小写转换 (Bash 4.0+)
PWD:目前的工作目录。每次使用cd命令更改目录时,该值也会随之变化。
OLDPWD:上一个工作目录。
REPLY:当read命令没有参数时,直接设在REPLY上。
UID:User ID,密码文件账号中的第三个域值
EUID:Effective User ID,有效的使用者ID。表示当前用户有效的用户ID号,当启动Shell时,根据/etc/passwd 文件中的用户项进行赋值。
BASH:该变量包含了Bash命令的完整路径。其值通常为/bin/bash。
BASH_VERSION:表示当前Bash命令版本的一个数字。
BASHPID:当前bash进程的进程号。
SHLVL:每次有Bash执行时,数字加一。
RANDOM:每次这个参数被用到时,就会产生一个乱数在RANDOM上。
SECONDS:从这个Shell一开始启动後的时间。
LINENO:Script的行数。
HISTCMD:历史记录数。
OPTARG:getopts处理的最後一个选项参数。
OPTIND:下一个要由getopts所处理的参数号码。
HOSTTYPE:机器种类。
OSTYPE:作业系统名称,用来识别当前操作系统。对于Fedora Linux根据所使用的Shell类型的不同,其值可以是linux或者linux-gnu(此外,Bash 也可以在其他操作系统上运行)。
IFS:Internal Field Separator。
PATH:命令搜寻路径。该变量值为冒号分隔的目录列表,主要用来查找需要输入的命令的相关路径集,不同用户可能不同。
PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
HOME:目前使用者的home directory;
CDPATH:cd命令的搜寻路径。
ENV:如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。
MAIL:如果这个参数被设定,而且MAILPATH没有被设定,那麽有信件进来时,bash会通知使用者。
MAILCHECK:设定多久时间检查邮件一次。
MAILPATH:一串的邮件检查路径。
MAIL_WARNING:如果有设定的话,邮件被读取後,将会显示讯息。
PS1:提示讯息设定,内定为"bash$ "。该变量设置了Shell 提示符的值。可以将许多项目读取到提示符中(比如日期、时间、用户名、主机名等)。但有时一条命令需要额外的提示符,此时可以使用变量PS2、PS3 等进行设置。
PS2:第二提示讯息设定,内定为">; "。
PS3:select命令所使用的提示讯息。
PS4:执行追踪时用的提示讯息设定,内定为"+ "。
HISTSIZE:命令历史记录量,内定为500。
HISTFILE:历史记录档,内定~/.bash_history。
HISTFILESIZE:历史记录档行数最大值,内定500。
OPTERR:如果设为1,bash会显示getopts的错误。
PROMPT_COMMAND:如果设定的话,该值会在每次执行命令前都显示。
IGNOREEOF:将EOF值当成输入,内定为10。
TMOUT:如果设为大于零的数字,该值被解译为输入等待秒数。表示Shell可以空闲的秒数,在秒数到达后 Shell 将会退出。该安全功能能够减少无人值守的Shell被未授权用户访问的可能性(该变量必须在登录Shell中设置,实际上导致Shell注销用户)。
FCEDIT:fc命令的内定编辑器。
FIGNORE:请详见READLINE。
INPUTRC:readline的startup file,内定~/.inputrc
CDPATH:cd命令的搜寻路径
FCEDITOR:fc命令默认的比较器,如果设置了该变量,则表示fc命令用来编辑history命令的文本编辑器。如果没有设置则使用vi命令。
FIGNORE:在进行命令补齐时,如若想忽略的扩展名列表
FUNCNAME:在函数执行时,此变量内容即为函数式的名称
GLOBIGNORE:
GROUPS:这是一个数组变量,包含了当前用户所属组的组ID号
HISTCMD:当前指令执行完后,在历史指令中的排列编号;该变量返回历史命令列表中当前命令的数量
HISTCONTROL:控制指令是否存入历史脚本文件中
HISTFILE:设定历史脚本文件的路径文件名,表示历史命令文件的位置,该位置通常位于SHOME/bash_ history。
HISTFILESIZE:历史脚本文件存储指令的最大行数,当达到该数量时,最早的命令将被丢弃;其默认值为1000。
HISTIGNORE:不存入历史脚本文件的指令样式
HISTSIZE:历史脚本文件存储指令的最大行数
HOME:用户的家目录位置,即每次登录后或者输入带有任何选项的cd命令时的当前工作目录。
HOSTFILE:包含自动补齐主机名的数据文件
HOSTNAME:当前主机的主机名称
HOSTTYPE:主机架构形态,该变量值描述了Linux系统正在运行的计算机系统结构。对于与Intel兼容的PC,其值为i[3-6]86 或者与i386-linux相类似的值。而对于AMD 64位计算机,其值为x86_64。
IFS:定义字段分割符号
INPUTRC:设定命令行函数式库readline的启动配置文件,可覆盖~/.inputrc的设定
LANG:目前语系的名称
LC_ALL:目前的locale
LC_COLLATE:locale字母排序
LC_CTYPE:locale字符分类
LC_MESSAGES:locale信息显示的转换
LINENO:script已执行到的行数
MACHTYPE:描述主机形态的GNU格式,如像:i486-pc-linux-gnu
MAIL:邮件文件的名称,表示邮箱文件的位置。该文件通常是/ar/spoo/mail目录中的用户名。
MAILCHECK:每隔多久就检查一次邮件,默认是60秒
MAILPATH:设定检查邮件的文件名,如果有两个以上,用:分割
PWD:当前工作目录
OLDPWD:前一个工作目录,表示修改当前工作目录之前的工作目录
OPTARG:使用getopts处理选项时,取得的选项的参数。
OPTIND:使用getopts处理选项时,选项的索引值
OPTERR:如果把OPTERR设置为1,则getopts发生错误时,不管选项第一个字符是否为:,仍然显示错误信息。
OSTYPE:执行bash的操作系统种类。
PATH:命令的搜寻路径
PPID:父进程的进程编号,表示启动了当前Shell的命令的进程ID(例如,包含了Shell 的Terminal窗口)。
PROMPT_COMMAND:可以将该变量设置为一个命令名,以便在每次Shell提示符显示之前运行该命令;如果将该变量设置为PROMPT_COMMAND=date,那么在提示符出现之前会列出当前日期时间。
RANDOM:随机函数,返回0~32767之间的随机数;访问该变量将会生成一个随机数。
REPLY:select和read没有设定读取变量时,默认的变量名称为REPLY。
SECONDS:目前bash shell已执行的时间,表示自Shell启动之后的秒数。
SHELL:shell文件的路径
SHELLOPTS:本变量的内容是经过set -o 设定为已开启的shell选项,以:分隔
SHLVL:子shell的层级数;表示与当前Shell会话相关联的Shell级别数。当登录到Shell时,SHLVL 为1。每执行一次Bash命令后(例如,使用su命令成为一名新用户,或者输入bash),该级别数将递增。
TIMEFORMAT:设定time统计运行时间的格式
TMOUT:如果tmout的大于0,则bash会等待tmout秒后,自动结束目前的bash shell;上文有提及。
位置变量
参数$0代表脚本名称
参数$#统计脚本参数的个数
参数$1...$9代表输入第一至第九个参数
参数$?代表脚本返回值:正确返回0,不正确返回非0
参数$*代表将命令行输入的所有参数作为一个字符串处理
参数$@代表将命令行输入的所有参数看作多个独立的变量处理
正常情况下,$@和$*在正常使用的时候是没有区别的,但是当在for循环中就显示出差异了,因此在工作中还需要注意区分才是,同时在使用的时候需要用双引号引起来。
$*与$@的区别
shift代表参数号偏移
位置变量的使用一般体现在脚本中,其使得在脚本中的命令可以调用运行脚本时不同位置的参数,参数一般使用空格分隔,$0代表当前Shell程序的文件名称,$1代表运行Shell程序时的第一个参数,$2为第二个参数,依此类推(范围为$1~$9)。使用Shell位置变量有助于我们查看很多相关信息,$#代表Shell程序所有参数的个数;$*与$@均代表所有参数的内容,区别是$*将所有的参数作为一个整体,而$@将所有的参数分别作为个体看待;$$代表当前进程的ID号码,$?表示程序的退出代码(返回0一般代表命令执行成功,非0代表命令执行失败)。
S1-$n:位置参数
$*:代表所有的位置参数,并且视为一个字符串
$@:代表所有的位置参数,代表各位置参数组成的串行
$#:位置参数的个数
$_:bash的绝对路径 或者 上一个命令执行时,最后一个位置参数
$?:上一个命令执行结束后的传回值,0表示执行成功,非0表示执行有误
$$:目前bash shell的进程编号
$!:上一个后台程序的进程编号
$-:bash shell目前使用的功能选项
notify:如果设定了,bash立即报告被终结的背景程式。
history_control, HISTCONTROL:history使用。
command_oriented_history:存入多行指令。
glob_dot_filenames:如果设定了,bash将会把"."包含入档案路径中。
allow_null_glob_expansion:如果设定了,bash允许路径明称为null string。
histchars:history使用。
nolinks:如果设定了,执行指令时,不会跟随symbolic links。
hostname_completion_file, HOSTFILE:包含与/etc/hosts相同格式的档名。
noclobber:如果设定了,Bash不会覆写任何由">;"、">;&"及"<>;"所操作的档案。
auto_resume:请见任务控制一节。
no_exit_on_failed_exec:如果该值存在,非互动的shell不会因为exec失败而跳出。
cdable_vars:如果启动,而cd命令找不到目录,可切换到参数形态指定的目录下。
参数扩展速查表(Cheat Sheet)
1. 基本语法和常用操作符
| 分类 | 语法形式 | 功能描述 | 示例 (var="hello") |
| 基础扩展 | ${param} | 获取变量的值,等同于 $param,但更安全。 | ${var} -> hello |
| 间接扩展 | ${!param} | 获取一个以 param 值为名字的变量的值。 | foo=bar; var=foo; echo ${!var} -> bar |
| 获取长度 | ${#param} | 获取变量值的字符串长度。 | ${#var} -> 5 |
| 默认值 | ${param:-word} | 如果 param 未设置或为空,则使用 word,否则使用 param 的值。 | ${var:-world} -> hello; ${unset_var:-world} -> world |
| 赋值默认值 | ${param:=word} | 如果 param 未设置或为空,则使用 word 并赋值给 param,否则使用 param 的值。 | ${unset_var:=world} -> world (且 unset_var 被赋值为 world) |
| 替代非空值 | ${param:+word} | 如果 param 已设置且非空,则使用 word,否则使用空值。 | ${var:+world} -> world ; ${unset_var:+world} -> 空 |
| 错误检查 | ${param:?word} | 如果 param 未设置或为空,则将 word 写入标准错误并退出。 | ${unset_var:?Error} -> 输出 "bash: unset_var: Error" 并退出 |
:-,:=,:+,:? 只有 := 操作会实际修改变量的值,其他三种都只是进行条件判断和值替换。
2. 子字符串操作
| 语法形式 | 功能描述 | 示例 (var="abcdefgh") |
| ${param:offset} | 从 offset 开始截取到末尾。 | ${var:3} -> defgh |
| ${param:offset:length} | 从 offset 开始截取 length 长度的子串。 | ${var:3:2} -> de; ${var: -3} -> fgh |
注意:offset 从 0 开始计算。如果 offset 为负数,表示从末尾开始算起(-1开始计算),需要加空格或使用括号,如 ${var: -3} 或 ${var:(-3)}。
3. 模式匹配(删除)
这类扩展用于从字符串的开头或结尾删除匹配指定模式的部分。模式是通配符模式,不是正则表达式。
| 语法形式 | 功能描述 | 示例 (var="file.txt.bak") |
| ${param#pattern} | 从开头检查,删除最短匹配的 pattern | ${var#*.} -> txt.bak (删除 file.) |
| ${param##pattern} | 从开头检查,删除最长匹配的 pattern | ${var##*.} -> bak (删除 file.txt.) |
| ${param%pattern} | 从结尾检查,删除最短匹配的 pattern | ${var%.*} -> file.txt (删除 .bak) |
| ${param%%pattern} | 从结尾检查,删除最长匹配的 pattern | ${var%%.*} -> file (删除 .txt.bak) |
记忆技巧:
# 是从头开始(因为通常在注释开头)。
% 是从尾开始(百分比的百分号在最后)。
一个符号 #, % 表示最短匹配(非贪婪)。
两个符号 ##, %% 表示最长匹配(贪婪)。
4. 查找与替换
| 语法形式 | 功能描述 | 示例 (var="I love apple, apple is good") |
| ${param/pattern/str} | 将第一个匹配的 pattern 替换为 str | ${var/apple/orange} -> I love orange, apple is good |
| ${param//pattern/str} | 将所有匹配的 pattern 替换为 str | ${var//apple/orange} -> I love orange, orange is good |
| ${param/#pattern/str} | 只有当 pattern 匹配开头时才替换 | ${var/#I/You} -> You love apple, apple is good |
| ${param/%pattern/str} | 只有当 pattern 匹配结尾时才替换 | ${var/%good/great} -> I love apple, apple is great |
5. 大小写转换 (Bash 4.0+)
| 语法形式 | 功能描述 | 示例 (var="Hello World") |
| ${param^^} | 将所有字符转换为大写 | ${var^^} -> HELLO WORLD |
| ${param,,} | 将所有字符转换为小写 | ${var,,} -> hello world |
| ${param^} | 将第一个字符转换为大写 | ${var^} -> Hello World (本身已大写,无变化) |
| ${param,} | 将第一个字符转换为小写 | ${var,} -> hello World |