:变量访问 内部变量(内建变量位置参数其他特殊参数)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:变量访问 内部变量(内建变量位置参数其他特殊参数)相关的知识,希望对你有一定的参考价值。
原文:http://shouce.jb51.net/shell/
第一章:Shell编程 第二章:Sha-Bang(#!
)开始
第七章:测试(if/then)、文件测试操作符、比较操作符(整数比较、字符串比较、混合比较)
第八章:操作符(expr、let操作符、计算操作符、位操作符、逻辑操作符、逗号操作符、自定义进制BASE#NUMBER)
文章目录
- 9.1. 内部变量
- 内建变量
- $BASH(Bash二进制程序文件的路径)
- $BASH_ENV(Bash启动文件路径)
- $BASH_SUBSHELL(指示子shell(subshell)等级的变量)
- $BASH_VERSINFO[n](Bash版本的信息)
- $BASH_VERSION(Bash版本)
- $DIRSTACK(在目录堆栈里面最顶端的值(它受pushd和popd的控制))
- $EDITOR(由脚本调用的默认的编辑器,一般是vi或是emacs.)
- $EUID(有效用户ID)
- $FUNCNAME(当前函数的名字)
- $GLOBIGNORE(由通配符(globbing)扩展的一列文件名模式)?
- $GROUPS(目前用户所属的组)
- $HOME(用户的家目录,通常是`/home/username` (参考例子 9-14))
- $HOSTNAME(在系统启动时由一个初始化脚本中用hostname命令给系统指派一个名字)
- $HOSTTYPE(机器类型)
- $IFS(内部字段分隔符,此变量决定Bash如何分割字段,或是解释字符串时的字标识分割)
- $IGNOREEOF(忽略EOF:在退出控制台前有多少文件结尾标识(end-of-files,control-D)会被shell忽略)
- $LC_COLLATE(控制文件名扩展和模式匹配的展开顺序)
- $LC_CTYPE(这个内部变量控制通配符(globbing)和模式匹配中的字符解释。)
- $LINENO(这个变量表示在本shell脚本中该变量出现时所在的行数。)
- $MACHTYPE(机器类型:识别系统的硬件类型。)
- $OLDPWD(上一次工作的目录)
- $OSTYPE(操作系统类型)
- `$PATH`(可执行程序文件的搜索路径。)(添加目录:`PATH=$PATH:[path]`,脚本中可临时添加 )(子进程不能改变父进程的环境)
- $PIPESTATUS(此数组变量保存了最后执行的前台管道的退出状态。)?
- $PPID(保存父进程的进程ID(pid))
- `$PROMPT_COMMAND`(这个变量在主提示符前(`$PS1`显示之前)执行它的值里保存的命令。)?
- $PS1(这是主提示符(第一提示符),它能在命令行上看见。)
- $PS2(副提示符(第二提示符),它在期望有附加的输入时能看见。它显示像">"的提示。)
- $PS3(第三提示符。它在一个select循环里显示 (参考例子 10-29).)
- $PS4(第四提示符,它在用`-x`选项调用一个脚本时的输出的每一行开头显示。它通常显示像`"+"`的提示。)
- $PWD(工作目录(即你现在所处的目录))
- $REPLY(没有变量提供给read命令时的默认变量.这也适用于select命令的目录,但只是提供被选择的变量项目编号而不是变量本身的值.)(读取用户输入,read命令后面不加变量时,这个参数就会更新)
- $SECONDS(脚本已运行的秒数.)
- $SHELLOPTS(已经激活的shell选项列表,它是一个只读变量.)
- $SHLVL(SHELL的嵌套级别.指示了Bash被嵌套了多深.)
- `$TMOUT`(如果`$TMOUT`环境变量被设为非零值时间值time,那么经过time这么长的时间后,shell提示符会超时.这将使此shell退出登录.)
- $UID(用户ID号)
- 变量`$ENV`, `$LOGNAME`, `$MAIL`, `$TERM`, `$USER`, 和`$USERNAME`,`$ENV`,都不是Bash内建的。然而常常在Bash的启动文件之一里作为环境变量设置。`$SHELL`变量是用户的登录shell的名字,它可以在`/etc/passwd`文件里设置或是在一个“初始化”的脚本里设置,并且它同样不是Bash内建的。
- 位置参数
- $0, $1, $2,等等(位置参数由命令行传给脚本或传给一个函数,或设置(set)给一个变量(参考例子 4-5和例子 11-15))
- $#(命令行参数[2]或者是位置参数的数量(参考例子 33-2))
- `$*`(所有的位置参数都被当成单个单元)("`$*`"必须被引号引起来)
- `$@`(和`$*`相同,但每个参数都是一个引起的字符串。那是说,参数都是没有被解析或扩展,是完整无缺地被传递的。这是说在参数列表中的每一个参数都被看作是一个单独的单元)
- 例子 9-6. arglist: 用`$*`和`$@`列出参数来(想要把参数一个个提取出来时,`$*`不要用引号引起来)
- 在一个shift命令的后面,变量`$@`会保存除掉先前参数列表的位置参数`$1`后剩下的命令行参数。
- 例子 9-7. `$*`和`$@`的不一致(依赖于`$IFS`变量的设置,`$*`和`$@`变量有时会表现不一致的令人迷惑的行为。)(set命令给脚本设置传入参数)
- 例子 9-8. 当`$IFS`为空时的`$*`和`$@`(`$@`和`$*`仅仅在被双引号引住时不同)(当`$IFS`为空时,`$*`和`$@`的行为依赖于Bash或是sh正在运行,因此在一个脚本里使用这种“特性”是失策的。)
- 其它的特殊参数
变量使用得当,可以使脚本变得更加强大和有弹性。但这要求我们学习变量的精妙之处及其细微的差别。
9.1. 内部变量
内建变量
影响Bash脚本行为的变量。
$BASH(Bash二进制程序文件的路径)
bash$ echo $BASH
/bin/bash
$BASH_ENV(Bash启动文件路径)
该环境变量保存一个,当启动一个脚本程序时会去读该环境变量指定的文件。
[root@ubuntu /arnold_test/20220105_TEST/20220608]53# echo $BASH_ENV
[root@ubuntu /arnold_test/20220105_TEST/20220608]54#
空的
$BASH_SUBSHELL(指示子shell(subshell)等级的变量)
一个指示子shell(subshell)等级的变量。它是Bash版本3新加入的。
参考例子 20-1的用法.
$BASH_VERSINFO[n](Bash版本的信息)
这个数组含有6个元素,指示了安装的Bash版本的信息。它和$BASH_VERSION
相似,但它们还是有一些小小的不同。
# Bash版本信息:
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n] = $BASH_VERSINFO[$n]"
done
# BASH_VERSINFO[0] = 3 # 主版本号.
# BASH_VERSINFO[1] = 00 # 次版本号.
# BASH_VERSINFO[2] = 14 # 补丁级.
# BASH_VERSINFO[3] = 1 # 编译版本.
# BASH_VERSINFO[4] = release # 发行状态.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # 结构体系
# (和变量$MACHTYPE相同).
运行结果:
[root@localhost arnold_test]# ./scriptname.sh
BASH_VERSINFO[0] = 4
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 46
BASH_VERSINFO[3] = 2
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu
[root@localhost arnold_test]#
$BASH_VERSION(Bash版本)
安装在系统里的Bash版本。
bash$ echo $BASH_VERSION
3.00.14(1)-release
[root@localhost arnold_test]# echo $BASH_VERSION
4.2.46(2)-release
[root@localhost arnold_test]#
tcsh% echo $BASH_VERSION
BASH_VERSION: Undefined variable.
检查$BASH_VERSION
是检测哪个shell在运行的好办法。$SHELL
变量不一定能给出正确的答案。
[root@localhost arnold_test]# echo $SHELL
/bin/bash
[root@localhost arnold_test]#
$DIRSTACK(在目录堆栈里面最顶端的值(它受pushd和popd的控制))
这个内建的变量和dirs命令相符,但dirs是给出整个目录堆栈的内容。
[root@localhost arnold_test]# echo $DIRSTACK
/ky_volume/arnold_test
[root@localhost arnold_test]#
$EDITOR(由脚本调用的默认的编辑器,一般是vi或是emacs.)
[root@localhost arnold_test]# echo $EDITOR
[root@localhost arnold_test]#
$EUID(有效用户ID)
当前用户无论是什么标识都会被认为是这个有效用户ID,这可能依赖于su.
变量$UID
不一定和$EUID
相同。
[root@localhost arnold_test]# echo $EUID
0
[root@localhost arnold_test]#
$FUNCNAME(当前函数的名字)
#!/bin/bash
xyz23()
echo "$FUNCNAME now executing." # 打印:xyz23 now executing.
xyz23 # xyz23 now executing.
echo "FUNCNAME = $FUNCNAME" # FUNCNAME =
# 在一个函数体外则没有值输出.
$GLOBIGNORE(由通配符(globbing)扩展的一列文件名模式)?
[root@localhost arnold_test]# echo $GLOBIGNORE
[root@localhost arnold_test]#
$GROUPS(目前用户所属的组)
它是当前用户在/etc/passwd
文件中记录的所属的组列表(数组)。
root# echo $GROUPS
0
root# echo $GROUPS[1]
1
root# echo $GROUPS[5]
6
$HOME(用户的家目录,通常是/home/username
(参考例子 9-14))
[root@localhost arnold_test]# echo $HOME
/root
[root@localhost arnold_test]#
$HOSTNAME(在系统启动时由一个初始化脚本中用hostname命令给系统指派一个名字)
在系统启动时由一个初始化脚本中用hostname命令给系统指派一个名字。然而,gethostname()函数能设置Bash内部变量E$HOSTNAME。参考例子 9-14.
[root@localhost arnold_test]# echo $HOSTNAME
localhost.localdomain
[root@localhost arnold_test]#
$HOSTTYPE(机器类型)
像$MACHTYPE
一样标识系统硬件。
bash$ echo $HOSTTYPE
i686
[root@localhost arnold_test]# echo $HOSTTYPE
x86_64
[root@localhost arnold_test]#
$IFS(内部字段分隔符,此变量决定Bash如何分割字段,或是解释字符串时的字标识分割)
$IFS
默认是空白字符(空格,制表符和新行符),它可以被重新设置。例如,在解释一个以逗号分割的数据文件里可设置成逗号分割。注意$*
使用了保存在$IFS
中的第一个字符。 参考例子 5-1.
bash$ echo $IFS | cat -vte
$
bash$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
$IFS
处理空白字符和其他的字符不相同。
例子 9-1. $IFS和空白符
#!/bin/bash
# $IFS处理空白字符和其他字符不相同。
output_args_one_per_line()
for arg
do echo "[$arg]"
done
echo; echo "IFS=\\" \\""
echo "-------"
IFS=" "
var=" a b c "
output_args_one_per_line $var # output_args_one_per_line函数相当于`echo " a b c "`
#
# [a]
# [b]
# [c]
echo; echo "IFS=:"
echo "-----"
IFS=:
var=":a::b:c:::" # 像上面一样, 但用":"代替了" ".
output_args_one_per_line $var
#
# []
# [a]
# []
# [b]
# [c]
# []
# []
# []
# 在awk中字段分隔符"FS"也有相同的特性.
# 多谢Stephane Chazelas.
echo
exit 0
运行结果:跟作者的还有点不一样。。。
[root@localhost arnold_test]# ./scriptname.sh
IFS=" "
-------
[a]
[b]
[c]
IFS=:
-----
[]
[a]
[]
[b]
[c]
[]
[]
[root@localhost arnold_test]#
(多谢S.C.澄清了问题和举的例子)
参考例子 12-37来看一个关于理解$IFS的教学例子。
$IGNOREEOF(忽略EOF:在退出控制台前有多少文件结尾标识(end-of-files,control-D)会被shell忽略)
$LC_COLLATE(控制文件名扩展和模式匹配的展开顺序)
它常常在.bashrc
或/etc/profile
文件里被设置,它控制文件名扩展和模式匹配的展开顺序。如果设置不当,LC_COLLATE会在文件名通配符(filename globbing)里引起不可预料的结果。
到Bash2.05版本止,文件名通配符不再区分在方括号里的字符串范围中的大小写了。例如,ls [A-M]*
会匹配File1.txt
和file1.txt
。为了保持方括号区分大小写的惯例,在/etc/profile
文件和/
或在~/.bashrc
文件里由命令export LC_COLLATE=C
把LC_COLLATE环境变量设置成C可以达到目的。
$LC_CTYPE(这个内部变量控制通配符(globbing)和模式匹配中的字符解释。)
$LINENO(这个变量表示在本shell脚本中该变量出现时所在的行数。)
它只在脚本中它出现时有意义,它一般可用于调试。
#!/bin/bash
# *** 开始调试代码块 ***
last_cmd_arg=$_ # 保存.
echo "At line number $LINENO, variable \\"v1\\" = $v1"
echo "Last command argument processed = $last_cmd_arg"
# *** 调试代码结束 ***
运行结果:
[root@ubuntu /arnold_test/20220105_TEST/20220608]1# ./scriptname.sh
At line number 5, variable "v1" =
Last command argument processed = ./scriptname.sh
[root@ubuntu /arnold_test/20220105_TEST/20220608]2#
$MACHTYPE(机器类型:识别系统的硬件类型。)
bash$ echo $MACHTYPE
i686
ubuntu测试:
[root@ubuntu /arnold_test/20220105_TEST/20220608]4# echo $MACHTYPE
x86_64-pc-linux-gnu
[root@ubuntu /arnold_test/20220105_TEST/20220608]5#
$OLDPWD(上一次工作的目录)
(“OLD-print-working-directory”,你上一次进入工作的目录)
[root@ubuntu /arnold_test/20220105_TEST/20220608]6# cd ..
[root@ubuntu /arnold_test/20220105_TEST]7# echo $OLDPWD
/arnold_test/20220105_TEST/20220608
[root@ubuntu /arnold_test/20220105_TEST]8#
$OSTYPE(操作系统类型)
bash$ echo $OSTYPE
linux
[root@ubuntu /arnold_test/20220105_TEST]8# echo $OSTYPE
linux-gnu
[root@ubuntu /arnold_test/20220105_TEST]9#
$PATH
(可执行程序文件的搜索路径。)(添加目录:PATH=$PATH:[path]
,脚本中可临时添加 )(子进程不能改变父进程的环境)
一般有/usr/bin/
, /usr/X11R6/bin/
, /usr/local/bin
,等等。
当给出一个命令时,shell会自动在一个哈希表里搜索由PATH变量里所列的路径寻找该命令程序。$PATH
变量被保存在环境变量里,是一串由冒号(:)
分割的目录名的列表。通常,系统把此变量的值在/etc/profile
文件和/
或在~/.bashrc
文件中被定义赋值。(参考附录 G).
bash$ echo $PATH
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/sbin:/usr/sbin
[root@ubuntu /arnold_test/20220105_TEST]9# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
[root@ubuntu /arnold_test/20220105_TEST]10#
PATH=$PATH:/opt/bin
能把/opt/bin
目录加到当前现有的目录列表中去。在一个脚本
中,它可以用这种方法临时地加一个目录到目录列表中去。当一个脚本退出时,此变量会恢复回原先的$PATH
值(一个子进程[比如一个脚本],不能改变父进程的环境变量[比如启动脚本的shell])
。
保存在$PATH
目录列表中的当前"工作目录"(./
)通常因为会引发安全漏洞而被忽略。
$PIPESTATUS(此数组变量保存了最后执行的前台管道的退出状态。)?
相当有趣的是,它不一定和最后执行的命令的退出状态一样。
bash$ echo $PIPESTATUS
0
bash$ ls -al | bogus_command
bash: bogus_command: command not found
bash$ echo $PIPESTATUS
141
bash$ ls -al | bogus_command
bash: bogus_command: command not found
bash$ echo $?
127
我ubuntu怎么这样啊?
[root@ubuntu /arnold_test/20220105_TEST]10# echo $PIPESTATUS
0
[root@ubuntu /arnold_test/20220105_TEST]11# ls -al | bogus_command
bogus_command:未找到命令
[root@ubuntu /arnold_test/20220105_TEST]12# echo $PIPESTATUS
0
[root@ubuntu /arnold_test/20220105_TEST]13#
[root@ubuntu /arnold_test/20220105_TEST]13# ls -al | bogus_command
bogus_command:未找到命令
[root@ubuntu /arnold_test/20220105_TEST]14# echo $?
127
[root@ubuntu /arnold_test/20220105_TEST]15#
$PIPESTATUS
数组的成员保存了每一个在管道里执行的命令各自的退出状态。$PIPESTATUS[0]
保存了管道里第一个命令的退出状态,$PIPESTATUS[1]
保存了管道里第二个命令的退出状态,以此类推。
在一个登录的shell里$PIPESTATUS
变量可能包含了一个无用的0值。(在Bash 3.0以前)
tcsh% bash
bash$ who | grep nobody | sort
bash$ echo $PIPESTATUS[*]
0
如果在一个脚本包含上面的命令,就会产生0 1 0
的输出。
多谢Wayne Pollock指出这一点并提供上面的例子。
在某些上下文中,$PIPESTATUS
变量会给出一些不可预料的结果。
bash$ echo $BASH_VERSION
3.00.14(1)-release
bash$ $ ls | bogus_command | wc
bash: bogus_command: command not found
0 0 0
bash$ echo $PIPESTATUS[@]
141 127 0
Chet Ramey贡献了上面描述ls输出的行为的例子。如果ls写到一个没有进程在读的管道,SIGPIPE信号会杀死它并使它的退出状态为141。否则ls的退出状态为预料之中的0。这个和tr的情况一样。
$PIPESTATUS
是一个"挥发性"变量。它需要在管道结束之后并在任何命令干涉之前立即查询。
bash$ $ ls | bogus_command | wc
bash: bogus_command: command not found
0 0 0
bash$ echo $PIPESTATUS[@]
0 127 0
bash$ echo $PIPESTATUS[@]
0
$PPID(保存父进程的进程ID(pid))
一个进程的$PPID变量保存它的父进程的进程ID(pid)。[1]
[root@ubuntu /arnold_test/20220105_TEST]15# echo $PPID
30003
[root@ubuntu /arnold_test/20220105_TEST]16# ps
PID TTY TIME CMD
30003 pts/20 00:00:00 su
30004 pts/20 00:00:00 bash
30561 pts/20 00:00:01 ps
[root@ubuntu /arnold_test/20220105_TEST]17#
用这个变量和pidof
命令比较。
$PROMPT_COMMAND
(这个变量在主提示符前($PS1
显示之前)执行它的值里保存的命令。)?
$PS1(这是主提示符(第一提示符),它能在命令行上看见。)
[root@ubuntu /arnold_test/20220105_TEST]17# echo $PS1
\\[\\e[37;40m\\][\\[\\e[32;40m\\]\\u\\[\\e[37;40m\\]@\\h \\[\\e[36;40m\\]\\w\\[\\e[0m\\]]\\#\\$
[root@ubuntu /arnold_test/20220105_TEST]18#
$PS2(副提示符(第二提示符),它在期望有附加的输入时能看见。它显示像">"的提示。)
[root@ubuntu /arnold_test/20220105_TEST]18# echo $PS2
>
[root@ubuntu /arnold_test/20220105_TEST]19#
$PS3(第三提示符。它在一个select循环里显示 (参考例子 10-29).)
[root@ubuntu /arnold_test/20220105_TEST]19# echo $PS3
[root@ubuntu /arnold_test/20220105_TEST]20#
$PS4(第四提示符,它在用-x
选项调用一个脚本时的输出的每一行开头显示。它通常显示像"+"
的提示。)
[root@ubuntu /arnold_test/20220105_TEST]20# echo $PS4
+
[root@ubuntu /arnold_test/20220105_TEST]21#
$PWD(工作目录(即你现在所处的目录))
它类似于内建命令pwd
。
#!/bin/bash
E_WRONG_DIRECTORY=73
clear # 清屏.
TargetDirectory=/home/bozo/projects/GreatAmericanNovel
cd $TargetDirectory
echo "Deleting stale files in $TargetDirectory."
if [ "$PWD" != "$TargetDirectory" ]
then # 防止意外工作在错误的目录中.
echo "Wrong directory!"
echo "In $PWD, rather than $TargetDirectory!"
echo "Bailing out!"
exit $E_WRONG_DIRECTORY
fi
rm -rf *
rm .[A-Za-z0-9]* # 删除点文件.
# rm -f .[^.]* ..?* 删除以多个点开始为文件名的文件.
# (shopt -s dotglob; rm -f *) 也可以.
# 多谢S.C.指出来.
# 文件名除了"/"字符外可以包含ASCII值在0 - 255范围的所有字符
# 删除以奇怪的字符开头的文件作为练习由读者实现.
# 如果需要,这儿有多种其他的操作.
echo
echo "Done."
echo "Old files deleted in $TargetDirectory."
echo
exit 0
$REPLY(没有变量提供给read命令时的默认变量.这也适用于select命令的目录,但只是提供被选择的变量项目编号而不是变量本身的值.)(读取用户输入,read命令后面不加变量时,这个参数就会更新)
#!/bin/bash
# reply.sh
# REPLY 是一个read命令的默认变量.
echo
echo -n "What is your favorite vegetable? "
read
echo "Your favorite vegetable is $REPLY."
# 如果没有变量提供且仅在这种情况,REPLY保存"read"命令上次读到的值
#
echo
echo -n "What is your favorite fruit? "
read fruit
echo "Your favorite fruit is $fruit."
echo "but..."
echo "Value of \\$REPLY is still $REPLY."
# $REPLY仍然被设置了它先前的值,
#+ 因为变量$fruit保存了新的"read"读到的值.
echo
exit 0
运行结果:
[root@ubuntu /arnold_test/20220105_TEST/20220608]25# ./scriptname.sh
What is your favorite vegetable? carrot
Your favorite vegetable is carrot.
What is your favorite fruit? apple
Your favorite fruit is apple.
but...
Value of $REPLY is still carrot.
[root@ubuntu /arnold_test/20220105_TEST/20220608]26#
$SECONDS(脚本已运行的秒数.)
#!/bin/bash
TIME_LIMIT=10
INTERVAL=1
echo
echo "Hit Control-C to exit before $TIME_LIMIT seconds."
echo
while [ "$SECONDS" -le "$TIME_LIMIT" ]
do
if [ "$SECONDS" -eq 1 ] # 判断second用单数还是复数哈哈
then
units=second
else
units=seconds
fi
echo "This script has been running $SECONDS $units."
# 在一个缓慢或负担过重的机器上,
#+ 脚本可能偶尔会跳过一个计数.
sleep $INTERVAL
done
echo -e "\\a" # Beep!(BB声) # 没听到有声音啊,?
exit 0
运行结果:
[root@ubuntu /arnold_test/20220105_TEST/20220608]28# ./scriptname.sh
Hit Control-C to exit before 10 seconds.
This script has been running 0 seconds.
This script has been running 1 second.
This script has been running 2 seconds.
This script has been running 3 seconds.
This script has been running 4 seconds.
This script has been running 5 seconds.
This script has been running 6 seconds.
This script has been running 7 seconds.
This script has been running 8 seconds.
This script has been running 9 seconds.
This script has been running 10 seconds.
[root@ubuntu /arnold_test/20220105_TEST/20220608]29#
$SHELLOPTS(已经激活的shell选项列表,它是一个只读变量.)
bash$ echo $SHELLOPTS
braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs
[root@ubuntu /arnold_test/20220105_TEST/20220608]29# echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
[root@ubuntu /arnold_test/20220105_TEST/20220608]30#
$SHLVL(SHELL的嵌套级别.指示了Bash被嵌套了多深.)
在命令行里,$SHLVL
是1,因此在一个脚本里,它是2.
命令行:
[root@ubuntu /arnold_test/20220105_TEST/20220608]30# echo $SHLVL
2
[root@ubuntu /arnold_test/20220105_TEST/20220608]31#
脚本:
#!/bin/bash
echo $SHLVL
[root@ubuntu /arnold_test/20220105_TEST/20220608]31# ./scriptname.sh
3
[root@ubuntu /arnold_test/20220105_TEST/20220608]32#
$TMOUT
(如果$TMOUT
环境变量被设为非零值时间值time,那么经过time这么长的时间后,shell提示符会超时.这将使此shell退出登录.)
在Bash版本2.05b以上,可以在脚本中把$TMOUT
和read
命令结合使用.
#!/bin/bash
# 在Bash版本2.05b以上运行.
TMOUT=3 # 提示输入时间为三秒.
echo "What is your favorite song?"
echo "Quickly now, you only have $TMOUT seconds to answer!"
read song
if [ -z "$song" ]
then
song="(no answer)"
# 默认输出.
fi
echo "Your favorite song is $song."
运行结果:
[root@ubuntu /arnold_test/20220105_TEST/20220608]32# ./scriptname.sh
What is your favorite song?
Quickly now, you only have 3 seconds to answer!
aa
Your favorite song is aa.
[root@ubuntu /arnold_test/20220105_TEST/20220608]33#
[root@ubuntu /arnold_test/20220105_TEST/20220608]33#
[root@ubuntu /arnold_test/20220105_TEST/20220608]33#
以上是关于:变量访问 内部变量(内建变量位置参数其他特殊参数)的主要内容,如果未能解决你的问题,请参考以下文章