shell中特殊符号
- 格式:docx
- 大小:22.73 KB
- 文档页数:7
shell脚本--echo和printf打印输出bash&shell系列⽂章:注:本⽂关于引号等特殊符号的处理仅仅只是⼏个例⼦,想要彻底搞明⽩shell对特殊符号的解析,见另⼀篇⽂章。
1.2.1 echo引号和感叹号问题关于echo的⽤法,注意点就是单引号和双引号的特殊情况。
另外,在bash环境下,感叹号只能通过单引号包围来输出,因为此时感叹号表⽰引⽤历史命令,除⾮设置"set +H"关闭历史命令的引⽤。
⽽在shell脚本中不会出现这类问题。
以打印“Hello World!”为例。
[root@xuexi tmp]# echo Hello World!Hello World![root@xuexi tmp]# echo'Hello World!'Hello World![root@xuexi tmp]# echo"Hello World!" #双引号不能打印感叹号-bash: !": event not found[root@xuexi tmp]# echo Hello World!;echo'Hello World!'-bash: !: event not found[root@xuexi tmp]# echo'Hello World!';echo Hello World! #感叹号可以在最结尾Hello World!Hello World!从上⾯⼏个实验发现,在bash环境下,要输出感叹号必须使⽤单引号。
这是因为默认情况下开启了使⽤感叹号引⽤内存中的历史命令的设置,可以使⽤set +H 关闭该设置,这时可以使⽤感叹号输出。
[root@xuexi tmp]# set +H[root@xuexi tmp]# echo"Hello World!"Hello World!或者使⽤多对引号分别包围echo的参数,其中感叹号使⽤单引号包围,如下。
shell 命令变量替换规则Shell命令变量替换是Shell编程中常用的一种技巧,可以通过替换变量的方式来生成命令或者文件的内容。
本文将介绍Shell命令变量替换的规则及其应用场景。
一、什么是Shell命令变量替换Shell命令变量替换是指在Shell脚本中,通过使用特定的符号和语法,将变量的值替换到命令或者文件中的特定位置。
它可以将变量的值嵌入到命令中,实现动态生成命令的效果,提高脚本的灵活性和可扩展性。
二、Shell命令变量替换的规则在Shell脚本中,有多种方式可以进行命令变量替换,常用的有以下几种:1. 使用${}符号:${变量名}:将变量的值替换到命令或者字符串中。
2. 使用$()符号:$(命令):将命令的输出结果替换到命令或者字符串中。
三、Shell命令变量替换的应用场景Shell命令变量替换在Shell编程中有着广泛的应用场景,下面将介绍其中的几个常见场景。
1. 动态生成文件名:在Shell脚本中,我们经常需要根据当前日期或者其他条件来动态生成文件名,使用命令变量替换可以很方便地实现这个功能。
例如,我们可以使用以下命令来创建一个以当前日期命名的文件:```shellfilename="file_$(date +%Y%m%d).txt"touch $filename```2. 批量操作文件:在处理大量文件时,使用命令变量替换可以很方便地批量生成命令。
例如,我们可以使用以下命令来批量重命名文件:```shellfor file in $(ls *.txt); domv $file ${file%.txt}.bakdone```3. 动态生成命令参数:在执行命令时,有时需要根据变量的值来动态生成命令的参数。
使用命令变量替换可以很方便地实现这个功能。
例如,我们可以使用以下命令来根据输入参数来动态生成命令:```shellif [ $# -eq 1 ]; thenecho "Hello, $1!"elseecho "Usage: $0 <name>"fi```四、Shell命令变量替换的注意事项在使用Shell命令变量替换时,需要注意以下几点:1. 使用双引号:为了避免变量值中的特殊字符对命令替换造成影响,建议在使用命令变量替换时,将变量放在双引号中。
PowerShell ISE(Integrated Scripting Environment)是微软提供的一个用于编写、测试和调试PowerShell 脚本的图形化工具。
以下是一些在PowerShell ISE 中常用的基本符号:1. $:在PowerShell 中,美元符号($) 用于标识变量名。
2. > 或|:管道符号(|) 用于将一个命令的输出传递给另一个命令作为输入。
输出重定向符号(>) 用于将命令的输出写入到文件中。
3. <:输入重定向符号(<) 用于从文件中读取输入并将其提供给命令。
4. &:执行运算符(&) 用于执行命令、脚本或表达式。
5. ;:分号(;) 用于在同一行内分隔多个命令。
6. 逗号(,):逗号用于在数组、哈希表或参数列表中分隔元素。
7. 括号():圆括号用于定义命令块或者在表达式中改变运算优先级。
8. 方括号[]:方括号用于索引数组元素、访问哈希表中的键值对,或者在字符串中进行替换操作。
9. 花括号{}:花括号用于创建代码块、定义脚本函数或者在字符串中嵌入表达式。
10. 引号('' 或""):单引号和双引号用于创建字符串。
双引号允许扩展变量和子表达式。
11. 注释符号(#):符号# 开始一行注释,该行余下的内容将被PowerShell 忽略。
12. 点号(.):点号用于调用对象的方法或属性。
这些符号在PowerShell ISE 中和其他PowerShell 环境中都是通用的,理解并熟练使用这些符号对于编写和调试PowerShell 脚本至关重要。
shell命令cd的用法Shell命令cd的用法Shell是一种命令行解释器,它是Linux和Unix系统中最常用的命令行工具之一。
其中,cd命令是Shell中最基本的命令之一,它用于改变当前工作目录。
本文将介绍cd命令的用法。
1. 基本用法cd命令的基本用法是将当前工作目录切换到指定的目录。
例如,要将当前工作目录切换到/home/user目录,可以使用以下命令:cd /home/user这将把当前工作目录切换到/home/user目录。
2. 相对路径和绝对路径在使用cd命令时,可以使用相对路径或绝对路径。
相对路径是相对于当前工作目录的路径,而绝对路径是从根目录开始的完整路径。
例如,假设当前工作目录是/home/user,要切换到/home/user/documents目录,可以使用以下命令:cd documents这是一个相对路径。
如果要使用绝对路径,可以使用以下命令:cd /home/user/documents这是一个绝对路径。
3. 特殊符号在使用cd命令时,还可以使用一些特殊符号。
例如,使用“~”符号可以切换到当前用户的主目录。
例如,要切换到当前用户的主目录,可以使用以下命令:cd ~使用“..”符号可以切换到上一级目录。
例如,如果当前工作目录是/home/user/documents,要切换到/home/user目录,可以使用以下命令:cd ..4. 其他用法除了基本用法之外,cd命令还有一些其他用法。
例如,使用“-”符号可以切换到上一个工作目录。
例如,如果当前工作目录是/home/user/documents,要切换到上一个工作目录,可以使用以下命令:cd -cd命令还可以与其他命令结合使用。
例如,可以使用以下命令将当前工作目录切换到最近修改的文件所在的目录:cd $(dirname $(ls -t | head -1))这将使用ls命令列出当前目录中的所有文件,并使用head命令选择最近修改的文件。
shell的参数
Shell的参数主要分为以下几类:
1. 位置参数:位置参数是指在命令行中按照顺序传递给Shell 脚本的参数。
在脚本中可以通过特殊变量$0、$1、$2等来引用这些参数。
$0表示脚本自身的名称,$1表示第一个参数,$2表示第二个参数,以此类推。
2. 特殊参数:特殊参数是指在Shell脚本中具有特殊含义的参数,如$-、$#、$@、$*等。
$-表示当前Shell选项,如$-a表示所有选项都被启用;$#表示传递给脚本的参数个数;$@表示所有传递给脚本的参数列表;$*表示所有传递给脚本的参数集合。
3. 环境变量:环境变量是指在操作系统中定义的一些变量,这些变量可以在Shell脚本中被引用和使用。
环境变量可以通过Shell脚本中的`$ENV`变量来引用,也可以通过`getenv()`函数来获取。
4. 用户定义的变量:用户定义的变量是指在Shell脚本中由用户自行定义和赋值的变量。
用户定义的变量可以在脚本中被引用和使用,例如`$VAR`或`${VAR}`。
5. 命令行选项:命令行选项是指在Shell命令行中使用的一些特殊标记或参数,用于指定脚本的行为或设置某些选项。
例如,`-v`用于输出详细信息,`-i`用于交互模式等。
这些参数在Shell脚本中具有不同的用途和含义,根据实际需求选择使用。
shell命令中的空格符Shell命令中的空格符在编写和执行命令时起着重要的作用。
空格符用于分隔命令的不同部分,如命令名、参数和选项。
在本文中,我们将一步一步回答关于Shell命令中空格符的问题,并解释它们的运行方式和使用方法。
1. 空格符在Shell命令中的作用是什么?空格符在Shell命令中用于分隔不同的命令部分。
它们用于划分命令名称、参数和选项,并在命令的正确解析和执行中起着关键的作用。
2. 空格符在Shell命令中的位置有什么要求?空格符通常位于命令中不同部分的之间。
在命令名称和参数之间、参数和选项之间,以及选项之间都使用空格符进行分隔。
不遵守这些空格符的要求可能会导致命令不被正确解析或执行。
3. 空格符在命令名称和参数之间的使用方法是什么?在命令名称和参数之间,我们使用一个或多个空格符来分隔它们。
这样,Shell知道命令名称在哪里结束,参数在哪里开始。
例如,执行"ls -l"命令时,空格符将命令名称"ls"和选项"-l"分隔开。
4. 空格符在参数和选项之间的使用方法是什么?在参数和选项之间,我们也使用一个或多个空格符来分隔它们。
这样,Shell知道哪些部分是参数,哪些部分是选项。
通常,选项会以一个或两个连字符开头,并且位于参数之前。
例如,执行"ls -l -t"命令时,空格符将选项"-l"和"-t"与参数分隔开。
5. 空格符在选项之间的使用方法是什么?在选项之间,我们同样使用一个或多个空格符来分隔它们。
这样,Shell 能够正确地解析和执行每一个选项。
空格符确保选项被正确识别,并避免混淆选项及其参数。
例如,执行"find -type f -name "*.txt""命令时,空格符将选项"-type"、"-name"和参数"*.txt"分隔开。
shell if [[]] 的用法-回复if [[]] 是Unix/Linux shell 中的条件语句,用于在脚本中执行基于条件的操作。
中括号内的内容用于定义条件,并且可以根据条件结果执行不同的代码块。
在本文中,我们将详细解释if [[]] 的用法,并提供一些示例来帮助理解。
让我们开始吧。
一、if [[]] 语法if [[ condition ]]; then# 在条件为true 时要执行的命令else# 在条件为false 时要执行的命令fi二、中括号内的条件1. 字符串比较:- 字符串相等:[[ str1 == str2 ]]- 字符串不相等:[[ str1 != str2 ]]- 字符串为空:[[ -z str ]]- 字符串不为空:[[ -n str ]]2. 数字比较:- 相等:[[ num1 -eq num2 ]]- 不相等:[[ num1 -ne num2 ]]- 大于:[[ num1 -gt num2 ]]- 大于等于:[[ num1 -ge num2 ]] - 小于:[[ num1 -lt num2 ]]- 小于等于:[[ num1 -le num2 ]]3. 文件比较:- 文件存在:[[ -e file ]]- 文件可读:[[ -r file ]]- 文件可写:[[ -w file ]]- 文件可执行:[[ -x file ]]- 文件是目录:[[ -d file ]]- 文件是符号链接:[[ -L file ]]三、if [[]] 示例1. 字符串比较:shellstr1="Hello"str2="World"if [[ str1 == str2 ]]; thenecho "两个字符串相等" elseecho "两个字符串不相等" fi输出:两个字符串不相等2. 数字比较:shellnum1=10num2=5if [[ num1 -gt num2 ]]; thenecho "num1 大于num2"elseecho "num1 小于或等于num2" fi输出:num1 大于num23. 文件比较:shellfile="/home/user/test.txt"if [[ -e file ]]; thenecho "文件存在"elseecho "文件不存在"fi输出:文件存在四、复合条件我们也可以在if [[]] 语句中使用复合条件,包括逻辑与(&&)和逻辑或()。
Shell⼊门-Shell变量数值计算Shell变量数值计算算术运算符Shell中常见的算术运算符号+:加法-:减法或负号*:乘法/:除法%:取余**:幂运算++:增加--:减少!:逻辑⾮&&:逻辑与||:逻辑或< <= > >=:⽐较符号== != =:⽐较符号,对于字符串“=”也可以表⽰相当于<< >>:向左移位、向右移位~:按位取反|:按位异或&:按位与^:按位或= += -= *= /= %=:赋值运算算术运算命令(()):⽤于整数运算let:⽤于整数运算,类似于(())expr:⽤于整数运算bc:适合整数及⼩数运算$[]:⽤于整数运算awk:适合整数及⼩数运算declare:定义变量值和属性(())双⼩括号(())的作⽤是进⾏数值运算与数值⽐较。
简单的数值运算:[root@localhost shell]# echo $((1+1))2[root@localhost shell]# echo $((6-3))3[root@localhost shell]# ((i=5))[root@localhost shell]# ((i=i*2))[root@localhost shell]# echo $i10[root@localhost shell]#复杂的综合运算[root@localhost shell]# ((a=1+2**3-4%3))[root@localhost shell]# echo $a8[root@localhost shell]# b=$((1+2**3-4%3))[root@localhost shell]# echo $b8[root@localhost shell]# echo $((1+2**3-4%3))8[root@localhost shell]# a=$((100*(100+1)/2))[root@localhost shell]# echo $a5050[root@localhost shell]# echo $((100*(100+1)/2))5050[root@localhost shell]#特殊运算符号[root@localhost shell]# a=8[root@localhost shell]# echo $((a=a+1))9[root@localhost shell]# echo $((a+=1))10[root@localhost shell]# echo $((a**2))100⽐较及判断[root@localhost shell]# echo $((3<8))1[root@localhost shell]# echo $((8<3))[root@localhost shell]# echo $((8=8))-bash: 8=8: 尝试给⾮变量赋值(错误符号是 "=8")[root@localhost shell]# echo $((8==8))1[root@localhost shell]# if ((8>7&&5==5))> then> echo yes> fiyes[root@localhost shell]#++ --的使⽤,和Java中的类似[root@localhost shell]# a=10[root@localhost shell]# echo $a10[root@localhost shell]# echo $((a++))10[root@localhost shell]# echo $a11[root@localhost shell]# echo $((a--))11[root@localhost shell]# echo $a10[root@localhost shell]# echo $((++a))11[root@localhost shell]# echo $a11[root@localhost shell]# echo $((--a))10[root@localhost shell]# echo $a10[root@localhost shell]#总结:1. (())表达式在命令⾏执⾏时不需要加$符号,直接使⽤((6%2))形式即可,但是如果需要输出,就要加$符,例如:echo $((6%2))。
shell浮点数的乘法Shell是一种命令行解释器,也是一种脚本语言,在计算机领域中有着广泛的应用。
本文将探讨Shell中的浮点数乘法运算。
在Shell中,浮点数的乘法运算可以通过使用特定的命令或符号来实现。
其中,常用的命令包括`expr`和`bc`,而常用的符号则是`*`。
下面将分别介绍这两种方法。
一、使用`expr`命令进行浮点数乘法运算`expr`命令可以用于执行基本的算术运算,包括浮点数的乘法。
使用`expr`命令进行浮点数乘法运算的一般语法如下:```result=`expr $num1 \* $num2````其中,`$num1`和`$num2`分别表示待乘的两个浮点数,`\*`表示乘法运算,`result`是用来存储结果的变量。
通过将乘法运算的结果赋值给`result`变量,我们就可以在后续的操作中使用这个结果了。
下面是一个具体的例子:```num1=3.14num2=2.5result=`expr $num1 \* $num2`echo "浮点数乘法的结果是:$result"```运行上述代码,将输出结果为:```浮点数乘法的结果是:7.85```需要注意的是,在使用`expr`命令进行浮点数乘法运算时,需要对乘号`*`进行转义,即使用`\*`代替`*`,以避免Shell将其解释为通配符。
二、使用`bc`命令进行浮点数乘法运算`bc`命令是一款用于执行精确数学运算的工具。
使用`bc`命令进行浮点数乘法运算的一般语法如下:```result=$(echo "scale=2; $num1 * $num2" | bc)```其中,`scale=2`表示结果保留两位小数,`$num1`和`$num2`分别表示待乘的两个浮点数,`echo`用于生成一个字符串,`|`表示将前一个命令的输出作为后一个命令的输入,`bc`用于执行精确的数学运算,`$()`用于捕获命令的输出结果。
shell中特殊符号 在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string' | ! $ ${} $? $$ $* "string" * ** ? : ^ $# $@ `command` {} [] [[]] () (()) || && {xx,yy,zz,...} ~ ~+ ~- & \<...\> + - % = == != 输出/输入重导向 > >> < << : > &> 2&> 2<>>& >&2 # 井号 (comments) 这几乎是个满场都有的符号,除了先前已经提过的"第一行" #!/bin/bash 井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。 # This line is comments. echo "a = $a" # a = 0 由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了。这常用在撰写过程中。 #echo "a = $a" # a = 0 如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。
~ 帐户的 home 目录 算是个常见的符号,代表使用者的 home 目录:cd ~;也可以直接在符号后加上某帐户的名称:cd ~user 或者当成是路径的一部份:~/bin;~+ 当前的工作目录,这个符号代表当前的工作目录,她和内建指令 pwd 的作用是相同的。 # echo ~+/var/log~- 上次的工作目录,这个符号代表上次的工作目录。 # echo ~-/etc/httpd/logs
; 分号 (Command separator) 在 shell 中,担任"连续指令"功能的符号就是"分号"。譬如以下的例子:cd ~/backup ; mkdir startup ; cp ~/.* startup/.
;; 连续分号 (Terminator) 专用在 case 的选项,担任 Terminator 的角色。 case "$fop" inhelp) echo "Usage: Command -help -version filename" ;;version) echo "version 0.1" ;;esac
. 逗号 (dot) 在 shell 中,使用者应该都清楚,一个 dot 代表当前目录,两个 dot 代表上层目录。 CDPATH=.:~:/home:/home/web:/var:/usr/local 在上行 CDPATH 的设定中,等号后的 dot 代表的就是当前目录的意思。 如果档案名称以 dot 开头,该档案就属特殊档案,用 ls 指令必须加上 -a 选项才会显示。除此之外,在 regular expression 中,一个 dot 代表匹配一个字元。
'string' 单引号 (single quote) 被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。 heyyou=homeecho '$heyyou' # We get $heyyou
"string" 双引号 (double quote) 被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。 heyyou=homeecho "$heyyou" # We get home `command` 倒引号 (backticks) 在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。 fdv=`date +%F`echo "Today $fdv" 在倒引号内的 date +%F 会被视为指令,执行的结果会带入 fdv 变数中。
, 逗点 (comma) 这个符号常运用在运算当中当做"区隔"用途。如下例 #!/bin/bashlet "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 / 3))"echo "t1 = $t1, a = $a, b = $b"
/ 斜线 (forward slash) 在路径表示时,代表目录。 cd /etc/rc.dcd ../..cd / 通常单一的 / 代表 root 根目录的意思;在四则运算中,代表除法的符号。 let "num1 = ((a = 10 / 2, b = 25 / 5))"
\ 倒斜线 () 在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。 # type rmrm is aliased to `rm -i'# \rm ./*.log 上例,我在 rm 指令前加上 escape 字元,作用是暂时取消别名的功能,将 rm 指令还原。 # bkdir=/home# echo "Backup dir, \$bkdir = $bkdir"Backup dir, $bkdir = /home 上例 echo 内的 \$bkdir,escape 将 $ 变数的功能取消了,因此,会输出 $bkdir,而第二个 $bkdir 则会输出变数的内容 /home。
| 管道 (pipeline) pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。 who | wc -l 善用这个观念,对精简 script 有相当的帮助。 ! 惊叹号(negate or reverse) 通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于" if [ "$?" != 0 ]thenecho "Executes error"exit 1fi 在规则表达式中她担任 "反逻辑" 的角色 ls a[!0-9] 上例,代表显示除了a0, a1 .... a9 这几个文件的其他文件。
: 冒号 在 bash 中,这是一个内建指令:"什么事都不干",但返回状态值 0。 : echo $? # 回应为 0 : > f.$$ 上面这一行,相当于 cat /dev/null > f.$$。不仅写法简短了,而且执行效率也好上许多。 有时,也会出现以下这类的用法 : ${HOSTNAME?} ${USER?} ${MAIL?} 这行的作用是,检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if 这类的做法,基本上也可以处理,但都比不上上例的简洁与效率。 除了上述之外,还有一个地方必须使用冒号 PATH=$PATH:$HOME/fbin:$HOME/fperl:/usr/local/mozilla 在使用者自己的HOME 目录下的 .bash_profile 或任何功能相似的档案中,设定关于"路径"的场合中,我们都使用冒号,来做区隔。
? 问号 (wild card) 在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。 # ls a?a1 善用她的特点,可以做比较精确的档名匹配。
* 星号 (wild card) 相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元。 # ls a*a a1 access_log 在运算时,它则代表 "乘法"。 let "fmult=2*3" 除了内建指令 let,还有一个关于运算的指令 expr,星号在这里也担任"乘法"的角色。不过在使用上得小心,他的前面必须加上escape 字元。
** 次方运算 两个星号在运算时代表 "次方" 的意思。 let "sus=2**3"echo "sus = $sus" # sus = 8
$ 钱号(dollar sign) 变量替换(Variable Substitution)的代表符号。 vrs=123echo "vrs = $vrs" # vrs = 123 另外,在 Regular Expressions 里被定义为 "行" 的最末端 (end-of-line)。这个常用在 grep、sed、awk 以及 vim(vi) 当中。
${} 变量的正规表达式 bash 对 ${} 定义了不少用法。以下是取自线上说明的表列 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word} ${parameter:offset} ${parameter:offset:length} ${!prefix*} ${#parameter} ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word} ${parameter/pattern/string} ${parameter//pattern/string}
$*引用script 的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。引用变量的代表方式如下: $0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}..... 个位数的,可直接使用数字,但两位数以上,则必须使用 {} 符号来括住。 $* 则是代表所有引用变量的符号。使用时,得视情况加上双引号。 echo "$*" 还有一个与 $* 具有相同作用的符号,但效用与处理方式略为不同的符号。
$@ $@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点。 符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。 $# 这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。 echo "$#"
$? 状态值 (status variable) 一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。 一般指令程序倘若执行成功,其回传值为 0;失败为 1。 tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho "$?"$$ 由于进程的ID是唯一的,所以在同一个时间,不可能有重复性的 PID。有时,script 会需要产生临时文件,用来存放必要的资料。而此script 亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$ 或许可以符合这种需求。它代表当前shell 的 PID。 echo "$HOSTNAME, $USER, $MAIL" > ftmp.$$ 使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。 ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法,如果 script 执行完毕后仍不加以清除,会产生其他问题。 () 指令群组 (command group) 用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ; echo $vcgh),指令群组有一个特性,shell会以产生 subshell 来执行这组指令。