红联Linux门户
Linux帮助

使用 Shell 一些诀窍

发布时间:2011-03-09 21:04:30来源:红联作者:wst021
[align=center]使用 Shell 一些诀窍[/align]


尝试在使用 echo 输出短消息时加引号:

$ echo "Hello, world"
Hello, world


Shell 引用(无论在命令行还是在脚本中加注)是一种将字符串传递给 Shell 的方法,可以避免对字符串中可能包含的任何特殊元字符产生混淆。当字符串包含一个以上的单词或者段落包含空格字符时使用引用。如果单个字符恰好是 Shell 元字符,并且您想去除它的特殊含义,就可以在两边加上引号,例如,当您要传递一个美元符号 ($) 作为字面上的美元符号字符而不是作为变量名前的特殊元字符时。

在引用的文本内部发生各种扩展。例如,在双引号括起来的文本中,变量被展开为它们的值,而单引号括起来的文本内部引用的变量名则不展开。

有三种重要的引用类型需要了解:

1.

通过在前面加反斜杠 (\) 引用单个字符。这样只会传替字符的字面含义,而非它可能包含的任何特殊含义,比如空格符或 Shell 元字符。例如,使用 \* 引用一个星号 (*),它是 Shell 元字符。要引用真正的反斜杠字符,可以使用 \\。
2.

通过在文本字符串两边加双引号 (") 来传递扩展的引用。美元符号 ($) 和单引号 (') 字符会保留其自身含义。因此,和其他字符一起在引用中出现的任何变量名都会被它们的值所替代。新行或特定字符 ($`"\) 前的反斜杠被移除,但是引用的字符会被传递。
3.

使用单引号 (') 将文本括起来以传递文本字符串的字面引用,所有的变量名、元字符等都作为文字字符,而不它们的含义或值来传递。

请注意在不同的 Shell 中引用的确切规则会有所区别。参考您所使用的特殊 Shell 的 man 页面来了解准确规则。

分配一个变量,然后尝试使用各种引用格式输出该变量,如清单 1 中所示。

清单 1. 使用 echo 演示 Shell 变量引用格式


$ myvar = "Hello, world"
$ echo $myvar
Hello, world
$ echo "$myvar"
Hello, world
$ echo '$myvar'
$myvar
$ echo \$myvar
$myvar
$ echo \'$myvar\'
'Hello, world'
$ echo "'$myvar'"
'Hello, world'
$ echo '"$myvar"'
"$myvar"
$ echo \"$myvar\"
"Hello, world"


注意解释变量的方式取决于所使用的引用格式。

注释

在 Shell 中,以井号 (#) 开始一个注释行。井号及其后面跟随的同一行的所有内容都被忽略。尝试输入几行夹杂注释的文本,如清单 2 中所示:

清单 2. 在 Shell 中使用注释


$ # a comment does nothing
$ echo "Hello, world" # This text is ignored
Hello, world
$ echo # This will not output

$ echo 'But a hash (#) can be quoted'
But a hash (#) can be quoted
$ echo "# Even in double quotes"
# Even in double quotes
$


创建 Shell 脚本

正如您所看到的,您可以直接在命令行测试这些 Shell 编程结构。但是,当您完成了单行命令的学习并且真正开始构建更长的程序时,您需要将程序写入称为脚本的文件。脚本 是一个设置了可执行位的文本文件,并且包含由 Shell 语言命令组成的程序。UNIX Shell 是一种解释性语言,这意味着它的程序不经过编译,而是由解释器读取,解释器本身是 Shell 可执行程序,比如 /bin/sh、/bin/bsh 或 /bin/bash。

Shell 脚本的第一行通常都是相同的:

#!/bin/sh


这是 Shell 自己使用的一种特殊注释,用于确定文件的语言或目录。感叹号在 UNIX 和排版术语中常常被称为 bang,后面跟随的路径名告诉 Shell 应该使用来执行该文件的解释器。在本例中是 /bin/sh,它在许多系统中代表 Bourne Shell 可执行程序本身。举例来说,特别为 Korn Shell 编写的脚本应该以 #!/usr/bin/ksh 开始,正如 Ruby 脚本将以 #!/usr/bin/ruby 开始。安装 bash 之后,/bin/sh 通常是到 bash 二进制程序的符号链接。并且考虑到兼容性,使用 /bin/sh 比使用 /bin/bash 更可取。在一些系统中,比如 IBM AIX 5L™,Bourne Shell 可执行程序的名称是 bsh,并且位于 /usr/bin/bsh。

清单 3 提供了 Shell 脚本的简短示例。

清单 3. Shell 脚本示例


#!/bin/sh
# This is a shell script
message = "Hello, world!"
echo "The message is '"$message"'"


按照本系列教程前面文章中的说明,使用 vi 编辑器键入该脚本并保存到名为 myscript 的文件中(请参见参考资料部分)。然后使用 chmod 设置该文件的执行权限,使该文件可以执行:

$ chmod u+x myscript



此命令使该文件只能由您执行。如果希望系统中的所有用户都能执行该文件,那么您还可以为所有用户设置执行权限:

$ chmod a+x myscript



现在您可以运行该脚本。给出该文件的名称和相对于当前工作目录的路径,在路径中使用一个点字符 (.) 来表示:

$ ./myscript
The message is 'Hello, world!'
$


Shell 变量 PATH 包含一组以冒号分隔的目录。它就是您的路径,Shell 总是会“看到”这些目录中的所有文件。UNIX Path 的目的是为了便于运行二进制文件。这就是为什么您只需要键入命令的基本文件名,比如 ls 和 echo,而不用提供它们的完整或相对路径名。如果您将脚本移动到 Path 中的目录,那么只需键入它的名字就可以运行。具体的 Path 取决于您的 UNIX 实现和本地设置,但 Path 中的目录通常包括 /bin、/usr/bin 和 /usr/local/bin。

一些用户对它们的 Shell 进行配置,从而使 PATH 变量包括当前的工作目录,这在 Path 中以点字符 (".") 表示。如此一来,要在当前目录下运行脚本,只需要键入它的名称,不需要指出相对目录。,Shell 按给定的顺序搜索 Path中的目录,从而避免中木马或发生异常情况,一种极其不明智的做法是把当前工作目录放在 Path 的末尾。

要查看您的 Path,可以使用 echo 显示 PATH 变量的内容,如清单 4 所示。

清单 4. 更改 PATH


$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11
$ myscript
myscript: command not found
$ PATH = $PATH":."
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
$ myscript
The message is 'Hello, world!'
$


在解释器名称的后面可以附加特殊选项或标志,比如 /usr/bin/bsh -n,这用于调试目的。连字符关闭选项,加号则打开选项。特殊的内置环境变量 -(一个连字符)包含当前 Shell 的完整选项列表。

尝试在您当前的交互式 Shell 中设置了哪些选项。通过使用 echo 显示 - 变量的内容来完成这项任务:

$ echo $-
himBH
$


参考您使用的 Shell 的 man 页面来获取当前的标志和选项列表。表 1 提供了 AIX® 上的 Bourne Shell 的常用标志列表,以及对每种标志作用的简要说明。

表 1. AIX Bourne Shell 的常用选项
标志 描述
-a 导出所有已分配值的变量。
-c Variable 执行从变量 中读取的命令。
-e 当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是 while、until 或 if 结构的一部分;命令不经过 AND 或 OR 检测;或者命令不是管道前加感叹号。
-f 禁用所有文件名替

换。
-h 定义函数时,定位和记住函数内部调用的所有命令。
-i 指定交互式 Shell。
-k 将所有关键字 都放入命令的环境。
-n 读取命令,但是不执行它们。
-r 调用受限制的 Shell。
-s 从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出)。
-t 读取并执行单个命令,然后退出。
-u 在脚本中,将所有未定义 变量视为错误。当尝试变量替换时退出。
-v 当读取输入行时将其显示出来。
-x 在执行命令之前显示其完整命令(包括所有的参数和选项)。
文章评论

共有 58 条评论

  1. abcdefg1999 于 2013-07-18 13:51:19发表:

    学习

  2. 覃球球 于 2013-06-07 15:40:36发表:

    回个帖子,赚点园币

  3. hbshlhy 于 2013-05-10 09:22:36发表:

    开始学习,确实有点儿难。。

  4. gfchj 于 2013-04-28 13:56:30发表:

    学习啦

  5. 657129880@qq.co 于 2013-04-23 10:31:12发表:

    谢谢分享2!!!!

  6. 657129880@qq.co 于 2013-04-23 10:30:04发表:

    谢谢分享2!!!!

  7. 657129880@qq.co 于 2013-04-23 10:29:57发表:

    谢谢分享2!!!!

  8. 657129880@qq.co 于 2013-04-23 10:29:47发表:

    谢谢分享2!!!!

  9. 657129880@qq.co 于 2013-04-23 10:29:40发表:

    谢谢分享2!!!!

  10. 657129880@qq.co 于 2013-04-23 10:29:29发表:

    谢谢分享2!!!!

  11. 657129880@qq.co 于 2013-04-23 10:29:20发表:

    谢谢分享2!!!!

  12. 657129880@qq.co 于 2013-04-23 10:29:05发表:

    谢谢分享2!!!!

  13. Feyiz 于 2013-04-22 21:41:17发表:

    学习一下,呵呵

  14. 零一 于 2013-03-29 21:09:26发表:

    为了积分评论,真的很没意思,站长灌水?

  15. 1977fx1250 于 2013-03-21 23:51:22发表:

    不错,学习了!

  16. tomhonsom 于 2013-03-21 13:36:38发表:

    好东西,多谢楼主分享

  17. 随意多好 于 2012-08-12 16:58:52发表:

    好啊

  18. yanglong985 于 2012-08-12 10:47:15发表:

    支持

  19. yt20090291 于 2012-08-12 00:31:00发表:

    学习、学习

  20. yt20090291 于 2012-07-08 16:21:54发表:

    感觉模模糊糊的

  21. crookoo 于 2012-05-28 20:00:26发表:

    好东西啊

  22. doram 于 2012-05-13 18:04:52发表:

    目前用到部分,其它的暂时记不下.记号先

  23. xubigtree 于 2011-12-21 15:25:39发表:

  24. guobaoyin 于 2011-12-20 16:56:53发表:

    不错 挺好的谢谢分享

  25. 419015642 于 2011-12-12 16:05:57发表:

    本人正在学习Shell,但是一直找不到一个好的学习方法,有谁能教教我 QQ:64453137

  26. wanzhiqun 于 2011-12-11 02:11:54发表:

    痛苦的码代

  27. zhoutingting 于 2011-11-09 21:51:45发表:

    太感谢了!

  28. zhoutingting 于 2011-11-09 21:51:34发表:

    支持一下!

  29. zhoutingting 于 2011-11-09 21:51:27发表:

    谢谢楼主分享了!

  30. Roc.dragon 于 2011-11-09 14:56:59发表:

    有点难度,不过都不经常使用。

  31. lanlanlangzi 于 2011-11-09 11:36:25发表:

    :0w223dc

  32. chuangjinweilai 于 2011-11-04 12:27:22发表:

    还没看到这里,先留印备查

  33. xuaibing 于 2011-11-03 23:14:44发表:

    学习

  34. lanlanlangzi 于 2011-11-03 16:18:58发表:

    讲得真多

  35. zhoutingting 于 2011-08-23 21:39:10发表:

    使用 Shell 一些诀窍




    尝试在使用 echo 输出短消息时加引号:

    $ echo "Hello, world"
    Hello, world


    Shell 引用(无论在命令行还是在脚本中加注)是一种将字符串传递给 Shell 的方法,可以避免对字符串中可能包含的任何特殊元字符产生混淆。当字符串包含一个以上的单词或者段落包含空格字符时使用引用。如果单个字符恰好是 Shell 元字符,并且您想去除它的特殊含义,就可以在两边加上引号,例如,当您要传递一个美元符号 ($) 作为字面上的美元符号字符而不是作为变量名前的特殊元字符时。

    在引用的文本内部发生各种扩展。例如,在双引号括起来的文本中,变量被展开为它们的值,而单引号括起来的文本内部引用的变量名则不展开。

    有三种重要的引用类型需要了解:

    1.

    通过在前面加反斜杠 (\) 引用单个字符。这样只会传替字符的字面含义,而非它可能包含的任何特殊含义,比如空格符或 Shell 元字符。例如,使用 \* 引用一个星号 (*),它是 Shell 元字符。要引用真正的反斜杠字符,可以使用 \\。
    2.

    通过在文本字符串两边加双引号 (") 来传递扩展的引用。美元符号 ($) 和单引号 (') 字符会保留其自身含义。因此,和其他字符一起在引用中出现的任何变量名都会被它们的值所替代。新行或特定字符 ($`"\) 前的反斜杠被移除,但是引用的字符会被传递。
    3.

    使用单引号 (') 将文本括起来以传递文本字符串的字面引用,所有的变量名、元字符等都作为文字字符,而不它们的含义或值来传递。

    请注意在不同的 Shell 中引用的确切规则会有所区别。参考您所使用的特殊 Shell 的 man 页面来了解准确规则。

    分配一个变量,然后尝试使用各种引用格式输出该变量,如清单 1 中所示。

    清单 1. 使用 echo 演示 Shell 变量引用格式


    $ myvar = "Hello, world"
    $ echo $myvar
    Hello, world
    $ echo "$myvar"
    Hello, world
    $ echo '$myvar'
    $myvar
    $ echo \$myvar
    $myvar
    $ echo \'$myvar\'
    'Hello, world'
    $ echo "'$myvar'"
    'Hello, world'
    $ echo '"$myvar"'
    "$myvar"
    $ echo \"$myvar\"
    "Hello, world"


    注意解释变量的方式取决于所使用的引用格式。

    注释

    在 Shell 中,以井号 (#) 开始一个注释行。井号及其后面跟随的同一行的所有内容都被忽略。尝试输入几行夹杂注释的文本,如清单 2 中所示:

    清单 2. 在 Shell 中使用注释


    $ # a comment does nothing
    $ echo "Hello, world" # This text is ignored
    Hello, world
    $ echo # This will not output

    $ echo 'But a hash (#) can be quoted'
    But a hash (#) can be quoted
    $ echo "# Even in double quotes"
    # Even in double quotes
    $


    创建 Shell 脚本

    正如您所看到的,您可以直接在命令行测试这些 Shell 编程结构。但是,当您完成了单行命令的学习并且真正开始构建更长的程序时,您需要将程序写入称为脚本的文件。脚本 是一个设置了可执行位的文本文件,并且包含由 Shell 语言命令组成的程序。UNIX Shell 是一种解释性语言,这意味着它的程序不经过编译,而是由解释器读取,解释器本身是 Shell 可执行程序,比如 /bin/sh、/bin/bsh 或 /bin/bash。

    Shell 脚本的第一行通常都是相同的:

    #!/bin/sh


    这是 Shell 自己使用的一种特殊注释,用于确定文件的语言或目录。感叹号在 UNIX 和排版术语中常常被称为 bang,后面跟随的路径名告诉 Shell 应该使用来执行该文件的解释器。在本例中是 /bin/sh,它在许多系统中代表 Bourne Shell 可执行程序本身。举例来说,特别为 Korn Shell 编写的脚本应该以 #!/usr/bin/ksh 开始,正如 Ruby 脚本将以 #!/usr/bin/ruby 开始。安装 bash 之后,/bin/sh 通常是到 bash 二进制程序的符号链接。并且考虑到兼容性,使用 /bin/sh 比使用 /bin/bash 更可取。在一些系统中,比如 IBM AIX 5L™,Bourne Shell 可执行程序的名称是 bsh,并且位于 /usr/bin/bsh。

    清单 3 提供了 Shell 脚本的简短示例。

    清单 3. Shell 脚本示例


    #!/bin/sh
    # This is a shell script
    message = "Hello, world!"
    echo "The message is '"$message"'"


    按照本系列教程前面文章中的说明,使用 vi 编辑器键入该脚本并保存到名为 myscript 的文件中(请参见参考资料部分)。然后使用 chmod 设置该文件的执行权限,使该文件可以执行:

    $ chmod u+x myscript



    此命令使该文件只能由您执行。如果希望系统中的所有用户都能执行该文件,那么您还可以为所有用户设置执行权限:

    $ chmod a+x myscript



    现在您可以运行该脚本。给出该文件的名称和相对于当前工作目录的路径,在路径中使用一个点字符 (.) 来表示:

    $ ./myscript
    The message is 'Hello, world!'
    $


    Shell 变量 PATH 包含一组以冒号分隔的目录。它就是您的路径,Shell 总是会“看到”这些目录中的所有文件。UNIX Path 的目的是为了便于运行二进制文件。这就是为什么您只需要键入命令的基本文件名,比如 ls 和 echo,而不用提供它们的完整或相对路径名。如果您将脚本移动到 Path 中的目录,那么只需键入它的名字就可以运行。具体的 Path 取决于您的 UNIX 实现和本地设置,但 Path 中的目录通常包括 /bin、/usr/bin 和 /usr/local/bin。

    一些用户对它们的 Shell 进行配置,从而使 PATH 变量包括当前的工作目录,这在 Path 中以点字符 (".") 表示。如此一来,要在当前目录下运行脚本,只需要键入它的名称,不需要指出相对目录。,Shell 按给定的顺序搜索 Path中的目录,从而避免中木马或发生异常情况,一种极其不明智的做法是把当前工作目录放在 Path 的末尾。

    要查看您的 Path,可以使用 echo 显示 PATH 变量的内容,如清单 4 所示。

    清单 4. 更改 PATH


    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11
    $ myscript
    myscript: command not found
    $ PATH = $PATH":."
    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
    $ myscript
    The message is 'Hello, world!'
    $


    在解释器名称的后面可以附加特殊选项或标志,比如 /usr/bin/bsh -n,这用于调试目的。连字符关闭选项,加号则打开选项。特殊的内置环境变量 -(一个连字符)包含当前 Shell 的完整选项列表。

    尝试在您当前的交互式 Shell 中设置了哪些选项。通过使用 echo 显示 - 变量的内容来完成这项任务:

    $ echo $-
    himBH
    $


    参考您使用的 Shell 的 man 页面来获取当前的标志和选项列表。表 1 提供了 AIX® 上的 Bourne Shell 的常用标志列表,以及对每种标志作用的简要说明。

    表 1. AIX Bourne Shell 的常用选项
    标志 描述
    -a 导出所有已分配值的变量。
    -c Variable 执行从变量 中读取的命令。
    -e 当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是 while、until 或 if 结构的一部分;命令不经过 AND 或 OR 检测;或者命令不是管道前加感叹号。
    -f 禁用所有文件名替

    换。
    -h 定义函数时,定位和记住函数内部调用的所有命令。
    -i 指定交互式 Shell。
    -k 将所有关键字 都放入命令的环境。
    -n 读取命令,但是不执行它们。
    -r 调用受限制的 Shell。
    -s 从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出)。
    -t 读取并执行单个命令,然后退出。
    -u 在脚本中,将所有未定义 变量视为错误。当尝试变量替换时退出。
    -v 当读取输入行时将其显示出来。
    -x 在执行命令之前显示其完整命令(包括所有的参数和选项)。

  36. zhoutingting 于 2011-08-23 21:39:04发表:

    使用 Shell 一些诀窍




    尝试在使用 echo 输出短消息时加引号:

    $ echo "Hello, world"
    Hello, world


    Shell 引用(无论在命令行还是在脚本中加注)是一种将字符串传递给 Shell 的方法,可以避免对字符串中可能包含的任何特殊元字符产生混淆。当字符串包含一个以上的单词或者段落包含空格字符时使用引用。如果单个字符恰好是 Shell 元字符,并且您想去除它的特殊含义,就可以在两边加上引号,例如,当您要传递一个美元符号 ($) 作为字面上的美元符号字符而不是作为变量名前的特殊元字符时。

    在引用的文本内部发生各种扩展。例如,在双引号括起来的文本中,变量被展开为它们的值,而单引号括起来的文本内部引用的变量名则不展开。

    有三种重要的引用类型需要了解:

    1.

    通过在前面加反斜杠 (\) 引用单个字符。这样只会传替字符的字面含义,而非它可能包含的任何特殊含义,比如空格符或 Shell 元字符。例如,使用 \* 引用一个星号 (*),它是 Shell 元字符。要引用真正的反斜杠字符,可以使用 \\。
    2.

    通过在文本字符串两边加双引号 (") 来传递扩展的引用。美元符号 ($) 和单引号 (') 字符会保留其自身含义。因此,和其他字符一起在引用中出现的任何变量名都会被它们的值所替代。新行或特定字符 ($`"\) 前的反斜杠被移除,但是引用的字符会被传递。
    3.

    使用单引号 (') 将文本括起来以传递文本字符串的字面引用,所有的变量名、元字符等都作为文字字符,而不它们的含义或值来传递。

    请注意在不同的 Shell 中引用的确切规则会有所区别。参考您所使用的特殊 Shell 的 man 页面来了解准确规则。

    分配一个变量,然后尝试使用各种引用格式输出该变量,如清单 1 中所示。

    清单 1. 使用 echo 演示 Shell 变量引用格式


    $ myvar = "Hello, world"
    $ echo $myvar
    Hello, world
    $ echo "$myvar"
    Hello, world
    $ echo '$myvar'
    $myvar
    $ echo \$myvar
    $myvar
    $ echo \'$myvar\'
    'Hello, world'
    $ echo "'$myvar'"
    'Hello, world'
    $ echo '"$myvar"'
    "$myvar"
    $ echo \"$myvar\"
    "Hello, world"


    注意解释变量的方式取决于所使用的引用格式。

    注释

    在 Shell 中,以井号 (#) 开始一个注释行。井号及其后面跟随的同一行的所有内容都被忽略。尝试输入几行夹杂注释的文本,如清单 2 中所示:

    清单 2. 在 Shell 中使用注释


    $ # a comment does nothing
    $ echo "Hello, world" # This text is ignored
    Hello, world
    $ echo # This will not output

    $ echo 'But a hash (#) can be quoted'
    But a hash (#) can be quoted
    $ echo "# Even in double quotes"
    # Even in double quotes
    $


    创建 Shell 脚本

    正如您所看到的,您可以直接在命令行测试这些 Shell 编程结构。但是,当您完成了单行命令的学习并且真正开始构建更长的程序时,您需要将程序写入称为脚本的文件。脚本 是一个设置了可执行位的文本文件,并且包含由 Shell 语言命令组成的程序。UNIX Shell 是一种解释性语言,这意味着它的程序不经过编译,而是由解释器读取,解释器本身是 Shell 可执行程序,比如 /bin/sh、/bin/bsh 或 /bin/bash。

    Shell 脚本的第一行通常都是相同的:

    #!/bin/sh


    这是 Shell 自己使用的一种特殊注释,用于确定文件的语言或目录。感叹号在 UNIX 和排版术语中常常被称为 bang,后面跟随的路径名告诉 Shell 应该使用来执行该文件的解释器。在本例中是 /bin/sh,它在许多系统中代表 Bourne Shell 可执行程序本身。举例来说,特别为 Korn Shell 编写的脚本应该以 #!/usr/bin/ksh 开始,正如 Ruby 脚本将以 #!/usr/bin/ruby 开始。安装 bash 之后,/bin/sh 通常是到 bash 二进制程序的符号链接。并且考虑到兼容性,使用 /bin/sh 比使用 /bin/bash 更可取。在一些系统中,比如 IBM AIX 5L™,Bourne Shell 可执行程序的名称是 bsh,并且位于 /usr/bin/bsh。

    清单 3 提供了 Shell 脚本的简短示例。

    清单 3. Shell 脚本示例


    #!/bin/sh
    # This is a shell script
    message = "Hello, world!"
    echo "The message is '"$message"'"


    按照本系列教程前面文章中的说明,使用 vi 编辑器键入该脚本并保存到名为 myscript 的文件中(请参见参考资料部分)。然后使用 chmod 设置该文件的执行权限,使该文件可以执行:

    $ chmod u+x myscript



    此命令使该文件只能由您执行。如果希望系统中的所有用户都能执行该文件,那么您还可以为所有用户设置执行权限:

    $ chmod a+x myscript



    现在您可以运行该脚本。给出该文件的名称和相对于当前工作目录的路径,在路径中使用一个点字符 (.) 来表示:

    $ ./myscript
    The message is 'Hello, world!'
    $


    Shell 变量 PATH 包含一组以冒号分隔的目录。它就是您的路径,Shell 总是会“看到”这些目录中的所有文件。UNIX Path 的目的是为了便于运行二进制文件。这就是为什么您只需要键入命令的基本文件名,比如 ls 和 echo,而不用提供它们的完整或相对路径名。如果您将脚本移动到 Path 中的目录,那么只需键入它的名字就可以运行。具体的 Path 取决于您的 UNIX 实现和本地设置,但 Path 中的目录通常包括 /bin、/usr/bin 和 /usr/local/bin。

    一些用户对它们的 Shell 进行配置,从而使 PATH 变量包括当前的工作目录,这在 Path 中以点字符 (".") 表示。如此一来,要在当前目录下运行脚本,只需要键入它的名称,不需要指出相对目录。,Shell 按给定的顺序搜索 Path中的目录,从而避免中木马或发生异常情况,一种极其不明智的做法是把当前工作目录放在 Path 的末尾。

    要查看您的 Path,可以使用 echo 显示 PATH 变量的内容,如清单 4 所示。

    清单 4. 更改 PATH


    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11
    $ myscript
    myscript: command not found
    $ PATH = $PATH":."
    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
    $ myscript
    The message is 'Hello, world!'
    $


    在解释器名称的后面可以附加特殊选项或标志,比如 /usr/bin/bsh -n,这用于调试目的。连字符关闭选项,加号则打开选项。特殊的内置环境变量 -(一个连字符)包含当前 Shell 的完整选项列表。

    尝试在您当前的交互式 Shell 中设置了哪些选项。通过使用 echo 显示 - 变量的内容来完成这项任务:

    $ echo $-
    himBH
    $


    参考您使用的 Shell 的 man 页面来获取当前的标志和选项列表。表 1 提供了 AIX® 上的 Bourne Shell 的常用标志列表,以及对每种标志作用的简要说明。

    表 1. AIX Bourne Shell 的常用选项
    标志 描述
    -a 导出所有已分配值的变量。
    -c Variable 执行从变量 中读取的命令。
    -e 当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是 while、until 或 if 结构的一部分;命令不经过 AND 或 OR 检测;或者命令不是管道前加感叹号。
    -f 禁用所有文件名替

    换。
    -h 定义函数时,定位和记住函数内部调用的所有命令。
    -i 指定交互式 Shell。
    -k 将所有关键字 都放入命令的环境。
    -n 读取命令,但是不执行它们。
    -r 调用受限制的 Shell。
    -s 从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出)。
    -t 读取并执行单个命令,然后退出。
    -u 在脚本中,将所有未定义 变量视为错误。当尝试变量替换时退出。
    -v 当读取输入行时将其显示出来。
    -x 在执行命令之前显示其完整命令(包括所有的参数和选项)。

  37. zhoutingting 于 2011-08-23 21:38:57发表:

    使用 Shell 一些诀窍




    尝试在使用 echo 输出短消息时加引号:

    $ echo "Hello, world"
    Hello, world


    Shell 引用(无论在命令行还是在脚本中加注)是一种将字符串传递给 Shell 的方法,可以避免对字符串中可能包含的任何特殊元字符产生混淆。当字符串包含一个以上的单词或者段落包含空格字符时使用引用。如果单个字符恰好是 Shell 元字符,并且您想去除它的特殊含义,就可以在两边加上引号,例如,当您要传递一个美元符号 ($) 作为字面上的美元符号字符而不是作为变量名前的特殊元字符时。

    在引用的文本内部发生各种扩展。例如,在双引号括起来的文本中,变量被展开为它们的值,而单引号括起来的文本内部引用的变量名则不展开。

    有三种重要的引用类型需要了解:

    1.

    通过在前面加反斜杠 (\) 引用单个字符。这样只会传替字符的字面含义,而非它可能包含的任何特殊含义,比如空格符或 Shell 元字符。例如,使用 \* 引用一个星号 (*),它是 Shell 元字符。要引用真正的反斜杠字符,可以使用 \\。
    2.

    通过在文本字符串两边加双引号 (") 来传递扩展的引用。美元符号 ($) 和单引号 (') 字符会保留其自身含义。因此,和其他字符一起在引用中出现的任何变量名都会被它们的值所替代。新行或特定字符 ($`"\) 前的反斜杠被移除,但是引用的字符会被传递。
    3.

    使用单引号 (') 将文本括起来以传递文本字符串的字面引用,所有的变量名、元字符等都作为文字字符,而不它们的含义或值来传递。

    请注意在不同的 Shell 中引用的确切规则会有所区别。参考您所使用的特殊 Shell 的 man 页面来了解准确规则。

    分配一个变量,然后尝试使用各种引用格式输出该变量,如清单 1 中所示。

    清单 1. 使用 echo 演示 Shell 变量引用格式


    $ myvar = "Hello, world"
    $ echo $myvar
    Hello, world
    $ echo "$myvar"
    Hello, world
    $ echo '$myvar'
    $myvar
    $ echo \$myvar
    $myvar
    $ echo \'$myvar\'
    'Hello, world'
    $ echo "'$myvar'"
    'Hello, world'
    $ echo '"$myvar"'
    "$myvar"
    $ echo \"$myvar\"
    "Hello, world"


    注意解释变量的方式取决于所使用的引用格式。

    注释

    在 Shell 中,以井号 (#) 开始一个注释行。井号及其后面跟随的同一行的所有内容都被忽略。尝试输入几行夹杂注释的文本,如清单 2 中所示:

    清单 2. 在 Shell 中使用注释


    $ # a comment does nothing
    $ echo "Hello, world" # This text is ignored
    Hello, world
    $ echo # This will not output

    $ echo 'But a hash (#) can be quoted'
    But a hash (#) can be quoted
    $ echo "# Even in double quotes"
    # Even in double quotes
    $


    创建 Shell 脚本

    正如您所看到的,您可以直接在命令行测试这些 Shell 编程结构。但是,当您完成了单行命令的学习并且真正开始构建更长的程序时,您需要将程序写入称为脚本的文件。脚本 是一个设置了可执行位的文本文件,并且包含由 Shell 语言命令组成的程序。UNIX Shell 是一种解释性语言,这意味着它的程序不经过编译,而是由解释器读取,解释器本身是 Shell 可执行程序,比如 /bin/sh、/bin/bsh 或 /bin/bash。

    Shell 脚本的第一行通常都是相同的:

    #!/bin/sh


    这是 Shell 自己使用的一种特殊注释,用于确定文件的语言或目录。感叹号在 UNIX 和排版术语中常常被称为 bang,后面跟随的路径名告诉 Shell 应该使用来执行该文件的解释器。在本例中是 /bin/sh,它在许多系统中代表 Bourne Shell 可执行程序本身。举例来说,特别为 Korn Shell 编写的脚本应该以 #!/usr/bin/ksh 开始,正如 Ruby 脚本将以 #!/usr/bin/ruby 开始。安装 bash 之后,/bin/sh 通常是到 bash 二进制程序的符号链接。并且考虑到兼容性,使用 /bin/sh 比使用 /bin/bash 更可取。在一些系统中,比如 IBM AIX 5L™,Bourne Shell 可执行程序的名称是 bsh,并且位于 /usr/bin/bsh。

    清单 3 提供了 Shell 脚本的简短示例。

    清单 3. Shell 脚本示例


    #!/bin/sh
    # This is a shell script
    message = "Hello, world!"
    echo "The message is '"$message"'"


    按照本系列教程前面文章中的说明,使用 vi 编辑器键入该脚本并保存到名为 myscript 的文件中(请参见参考资料部分)。然后使用 chmod 设置该文件的执行权限,使该文件可以执行:

    $ chmod u+x myscript



    此命令使该文件只能由您执行。如果希望系统中的所有用户都能执行该文件,那么您还可以为所有用户设置执行权限:

    $ chmod a+x myscript



    现在您可以运行该脚本。给出该文件的名称和相对于当前工作目录的路径,在路径中使用一个点字符 (.) 来表示:

    $ ./myscript
    The message is 'Hello, world!'
    $


    Shell 变量 PATH 包含一组以冒号分隔的目录。它就是您的路径,Shell 总是会“看到”这些目录中的所有文件。UNIX Path 的目的是为了便于运行二进制文件。这就是为什么您只需要键入命令的基本文件名,比如 ls 和 echo,而不用提供它们的完整或相对路径名。如果您将脚本移动到 Path 中的目录,那么只需键入它的名字就可以运行。具体的 Path 取决于您的 UNIX 实现和本地设置,但 Path 中的目录通常包括 /bin、/usr/bin 和 /usr/local/bin。

    一些用户对它们的 Shell 进行配置,从而使 PATH 变量包括当前的工作目录,这在 Path 中以点字符 (".") 表示。如此一来,要在当前目录下运行脚本,只需要键入它的名称,不需要指出相对目录。,Shell 按给定的顺序搜索 Path中的目录,从而避免中木马或发生异常情况,一种极其不明智的做法是把当前工作目录放在 Path 的末尾。

    要查看您的 Path,可以使用 echo 显示 PATH 变量的内容,如清单 4 所示。

    清单 4. 更改 PATH


    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11
    $ myscript
    myscript: command not found
    $ PATH = $PATH":."
    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
    $ myscript
    The message is 'Hello, world!'
    $


    在解释器名称的后面可以附加特殊选项或标志,比如 /usr/bin/bsh -n,这用于调试目的。连字符关闭选项,加号则打开选项。特殊的内置环境变量 -(一个连字符)包含当前 Shell 的完整选项列表。

    尝试在您当前的交互式 Shell 中设置了哪些选项。通过使用 echo 显示 - 变量的内容来完成这项任务:

    $ echo $-
    himBH
    $


    参考您使用的 Shell 的 man 页面来获取当前的标志和选项列表。表 1 提供了 AIX® 上的 Bourne Shell 的常用标志列表,以及对每种标志作用的简要说明。

    表 1. AIX Bourne Shell 的常用选项
    标志 描述
    -a 导出所有已分配值的变量。
    -c Variable 执行从变量 中读取的命令。
    -e 当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是 while、until 或 if 结构的一部分;命令不经过 AND 或 OR 检测;或者命令不是管道前加感叹号。
    -f 禁用所有文件名替

    换。
    -h 定义函数时,定位和记住函数内部调用的所有命令。
    -i 指定交互式 Shell。
    -k 将所有关键字 都放入命令的环境。
    -n 读取命令,但是不执行它们。
    -r 调用受限制的 Shell。
    -s 从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出)。
    -t 读取并执行单个命令,然后退出。
    -u 在脚本中,将所有未定义 变量视为错误。当尝试变量替换时退出。
    -v 当读取输入行时将其显示出来。
    -x 在执行命令之前显示其完整命令(包括所有的参数和选项)。

  38. chaipeng 于 2011-08-23 12:08:24发表:

    强大

  39. cow0312 于 2011-08-22 15:31:21发表:

    弱弱的问句$ PATH = $PATH":."什么意思!
    是把当前目录添加到PATH中吗!

  40. bingoba 于 2011-08-17 21:57:35发表:

    那好吧:0w5ty(1