发布新日志

  • unix shell中(),[]和[[]]的区别

    2007-06-18 14:30:15

    1. 首先,尽管很相似,但是从概念上讲,二者是不同层次的东西。
    "[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
    "["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(如果有这样的命令的话)。


    2.[[]]结构比Bash版本的[]更通用。在[[和]]之间的所有的字符都不会被文件扩展或是标记分割,但是会有参数引用和命令替换。

    用[[ ... ]]测试结构比用[ ... ]更能防止脚本里的许多逻辑错误。比如说,&&,||,<和>操作符能在一个[[]]测试里通过,但在[]结构会发生错误。

    3.(( ))结构扩展并计算一个算术表达式的值。如果表达式值为0,会返回1或假作为退出状态码。一个非零值的表达式返回一个0或真作为退出状态码。这个结构和先前test命令及[]结构的讨论刚好相反。

    4.[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"<"必须转义,否则就变成IO改向操作符了(请参看上面2中的例子)。在[[中"<"与">"不需转义;
    由于"[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如
    在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做。

    5.[[ ... ]]进行算术扩展,而[ ... ]不做

    1)在ksh中的test
    数字的运算可使用let、(( )) ,其中运算时不需要变量$符号,运算符为 +、-、*、/、% ,不建议使用expr
    数字的比较使用 (( )) ,其运算符 >、>=、<、<=、==、!=
    可以使用算术扩展,如:(( 99+1 <= 101 ))
    字符表达式的比较使用 [[ ]] ,其运算符 =、!=、-n、-z
    文件表达式的测试使用 [[ ]] ,其运算符 -r、-l、-w、-x、-f、-d、-s、-nt、-ot
    逻辑表达式的测试使用 [[ ]] ,其运算符 !、&&、||
    数字比较、字符比较、逻辑测试可以组合,如$ [[ "a" != "b" && 4 -gt 3 ]]
    支持bash中的通配符扩展,如:[[ hest = h??t ]] 、[ hest = h*t ]]
    使用 (( )) 时,不需要空格分隔各值和运算符,使用 [[ ]] 时需要用空格分隔各值和运算符。

    2)bash与ksh中的 [[ ]] 不同
    在redhat9的bash中也可以使用 [[ ]] 符号。但是建议严格按照上面的原则使用。
    在bash中,数字的比较最好使用 (( )),虽说可以使用 [[ ]],但若在其内使用运算符 >、>=、<、<=、==、!= 时,其结果经常是错误的,不过若在 [[ ]] 中使用 [ ] 中的运算符“-eq、-ne、-le、-lt、-gt、-ge”等,还尚未发现有错。因此诸如$ [[ " a" != “b” && 4 > 3 ]] 这类组合(见上)也不可以在bash中使用,其出错率很高。
    例:[[ "a" != "b" && 10 > 2 ]] 判断结果就不正常。
    诸如 [ 2 \< 10 ]、[[ 2 < 10 ]] 都是不要使用。使用算术扩展最好用 (( 99+1 == 100 )) ,而不要使用[[ 99+1 -eq 100 ]] 。

     


     

     

  • [转]控制台速成班

    2007-05-27 22:28:35

    转:Linux 控制台具有强大而灵活的功能。如果过了相当一段时间您还要用很多时间去查看命令的提示,那么您应该花费一些时间复习一下那些您将不断用到的常见命令,来更好地熟悉这个环境。
           本部分将介绍各种不同的 shell 和一些最基本的 Linux 命令。Linux 中的所有管理任务都可以在控制台中完成。许多情况下,使用控制台比使用图形化的程序更快捷,而且还可能实现额外的功能。不仅如此,所有的控制台任务都可以写到脚本中,这样就可以自动执行。为了真正地驾驭您的 Linux 环境,您将希望掌握如何在控制台中工作。如果您曾经使用过 DOS/Windows,本文将引导您开始使用 Linux 控制台。
    进入控制台

    如果您的系统引导进入文本模式(为了降低服务开销,服务器通常是这样配置的),那么您在以文本形式登录后就已经在控制台中了。在典型的 Linux 系统中,通过组合键 Ctrl + Alt + (F1 - F6) 您可以切换到另外的控制台。每一个控制台是系统中一个完全独立的会话,不同的用户可以同时使用。

    这一多控制台的特点与 Windows 中的多桌面不同。在 Linux 中,每一个控制台可以分别由完全不同的用户来控制。例如,您可能在控制台 1 中以 root 身份登录,而在控制台 2 中以 joeuser 身份登录。两个控制台在各自的用户空间中运行不同的程序。与此类似,不同的用户可以远程登录到同一个 Windows 系统中。就这一点来说,Linux 更像是主机而不是简单的服务器或工作站。

    如果您是在图形模式下,那么您可以打开一个 终端 (terminal) 以进入控制台窗口。通常在桌面的任务条上会有终端的按钮。您也可以从上下文菜单(在桌面上单击右键)打开终端 。

    命令 在控制台中可以使用的命令很多。其中有一些实际上只在编写脚本时才会用到。这里介绍一些您最可能用到的命令。不要忘记,所有的命令和选项都区分大小写。-R 与 -r 不同,会去执行不同的操作。控制台命令几乎全都是小写的。

    cd 使用我们所熟悉的 cd 命令可以在目录间切换。一定注意的是在 Linux 中用的是正斜杠 (/),而不是您所熟悉的反斜杠 (\)。反斜杠也用到了,但只是用来说明命令需要换行继续,这样可以提高比较长的命令的可读性。

    ls 命令用于列出一个目录下的所有文件。可以使用许多不同的开关更改列表的表示形式:

    列出文件

    cp 使用 cp 命令来复制文件。这个命令与 DOS 下的 copy 命令基本一样。基本的开关如下:

    复制文件

    使用复制命令创建链接

    用 cp 命令可以创建指向一个文件或者整个文件结构的硬链接。使用 -l 开关来指明操作是链接复制。所有的目录仍作为目录创建,但所有的文件会被设置为硬链接。

    cp -lR /data/accounting/payroll /data/management/hr



    上面的命令将把整个目录结构及其下面的文件从 /data/accounting/payroll 复制到 /data/management/hr/payroll。目录结构下的所有文件将被设置为硬链接。这样使一个文件在同一个文件系统中可以具备不同的视图。这也是有用的安全技术,使得在不同的目录下对同一文件有不同的访问权限。

    mv 使用 mv 命令来移动和重命名文件。这个命令的工作方式基本上与 DOS 中的 move 命令一样,不过它可以移动整个目录结构及所有文件。

    cat 使用 cat 命令来查看文件的内容。它相当于 DOS 中的 type 命令。它将把文件的内容转储到另一个文件、屏幕或者其他命令。cat 是concatenate 的简写,还可以将一系列的文件合并为一个大文件。

    more 使用命令 more 可以以分页的方式查看文件。它基本上与 DOS 中的 more 命令相同。

    less 命令也是用来查看文件,但是它支持上下滚屏以及在文档中进行文本搜索。

    vi 有一些人可能会说 vi 表示“virtually impossible”。它是 Unix 中的一个历史悠久的文本编辑器。vi 并不真正直观,但是现在几乎所有的类 Unix 环境中都有 vi。对于 Linux 中安装的版本有一个内置的教程,一旦您熟悉了 vi,只需几次击键就可以完成不可思议的任务。说实话,没有任何编辑器能够取代 vi 来编辑密码和配置文件。

    man 使用 man 命令来查看命令的文档。man 是 manual 的缩写。几乎每一个命令都有相应的文档。要深入了解 man,请输入以下命令:

    man man



    info info 命令与 man 命令类似,不过它提供了超链接文本,可以更方便地浏览文档。

    哪个 shell?

    DOS/Windows 与 Linux 的最重要的区别之一是 Linux 的命令 shell 是与操作系统相分离的一层。不同的 shell 环境影响您具备不同的功能,比如可编辑的命令行和历史命令回查等。shell 还决定了脚本中函数的语法。在 DOS/Windows 中,编写脚本程序只有一种情况,那就是使用效率低下的 .BAT 文件。它的确可以完成很多功能,但除了完成那些基本的任务,复杂些的任务就需要脚本编写者具有极强的创造性。在 Linux 中,脚本中可以有循环,不仅可以执行基本的条件语句,很多在编程语言中才有的功能它都具备。如果您擅长编写 .BAT 文件,那么 shell 脚本更会使您大展才华。

    默认的 shell 是每个用户帐号的一个参数。Linux 中典型的默认 shell 是 /bin/bash,不过也可以用其他的 shell。每个 shell 的 man 文档实际上都非常好,都对各种 shell 及其使用进行了详细的说明。仅仅阅读下面的解释是不够的,应该从下面列出的 shell 中选择一个,去查看它的 man 文档。

    bash bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,包括许多附加的特点。Bash 有可编辑的命令行,可以回查历史命令,支持 tab 键补齐以使用户避免输入长的文件名。

    csh C shell 使用的是“类C”语法,借鉴了 Bourne shell 的许多特点,只是内部 shell 命令集有所不同。

    ksh Korn shell 的语法与 Bourne shell 相同,同时具备了 C shell 的易用特点。许多安装脚本都使用 ksh,即使您不把它作为您的主 shell,您也应该在系统中安装它。

    tcsh TC shell 是 C shell 的一个增强版本,与 C shell 完全兼容。

    zsh Z shell 是 Korn shell 的一个增强版本,具备 bash shell 的许多特色。

    Shell 规则

    您只需在控制台中执行相应的命令就可以随时切换 shell。只要在文件顶部放置一个井号 (#!) 指向需要的 shell,脚本就可以指定想要运行的 shell。当脚本运行的时候,不管用户所处的 shell 环境是什么,它都会在正确的 shell 环境中运行。下面例子中的这行代码指出脚本需要在 C shell 下运行:

    #!/bin/csh



    给我做链接,这样就更安全!

    Linux 文件系统最重要的特点之一是它的文件链接。链接是对文件的引用,这样您可以让文件在文件系统中多处被看到。不过,在 Linux 中,链接可以如同原始文件一样来对待。链接可以与普通的文件一样被执行、编辑和访问。对系统中的其他应用程序而言,链接就是它所对应的原始文件。当您通过链接对文件进行编辑时,您编辑的实际上是原始文件。链接不是副本。有两种类型的链接:硬链接和符号链接。

    硬链接 只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为 inode)。当您移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全。如果您删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被删除。

    符号链接 是一个指针,指向文件在文件系统中的位置。符号链接可以跨文件系统,甚至可以指向远程文件系统中的文件。符号链接只是指明了原始文件的位置,用户需要对原始文件的位置有访问权限才可以使用链接。如果原始文件被删除,所有指向它的符号链接也就都被破坏了。它们会指向文件系统中并不存在的一个位置。两种链接都可以通过命令 ln 来创建。ln 默认创建的是硬链接。使用 -s 开关可以创建符号链接。

    # Create a hard link from MyFile in the current
    # directory to /YourDir/MyFile
    ln MyFile /YourDir

    # Create a symbolic (soft) link from MyFile in
    # the current directory to /YourDir/YourFile
    ln -s MyFile /YourDir/Yourfile



    在上面的例子中,MyFile、/YourDir/MyFile 和 /YourDir/Yourfile 会被看成是同一个文件。

    走出您的 shell

    对 Linux 管理来说,必须学习在控制台环境下工作。虽然有一些工具可以让您避免使用控制台,但是您会受到那些工具的很多限制。进入控制台很简单,使用 man 和 info 命令访问命令文档也很方便。
Open Toolbar