【问题标题】:Bash shell script to flip through directories and perform a few actions用于翻阅目录并执行一些操作的 Bash shell 脚本
【发布时间】:2009-06-24 17:18:09
【问题描述】:

下午好,我有一个关于我遇到问题的脚本的问题。几年前我做了类似的事情,并以此为基础(在不同的服务器上)。我需要从一个包含多个目录的目录运行脚本,并为每个目录创建一个目录并更改它的所有权。脚本是:

#!/bin/bash 对于 * 中的 DIR; 做 mkdir $DIR/照片2; chown apache:apache $DIR/photos2; chmod 777 $目录/照片2; 完毕

尝试运行时出现 - 意外标记“do”附近出现语法错误

我确定我错过了一些愚蠢的东西,任何帮助将不胜感激。

【问题讨论】:

    标签: bash


    【解决方案1】:

    当脚本采用DOS 格式时,我曾看到一些有趣的事情发生。
    您是否有机会在 Windows 平台上编写代码并尝试从其他地方的 bash shell 运行它?

    在bash shell上,一般会有一个叫dos2unix的命令,如果找到了,试试运行,

    dos2unix scriptname
    

    然后再次运行脚本。


    再检查一次,你确定你有一个错误说“意外的令牌'做'”而不是'完成'?
    无论如何,我建议你阅读for loop at the bash guide


    同时,这应该从基本目录完成您的工作(而您的文件名没有空格字符)。

    #!/bin/bash
    for DIR in $(find . -type d);
    do 
        mkdir $DIR/photos2; 
        chown apache:apache $DIR/photos2; 
        chmod 777 $DIR/photos2; 
    done
    

    【讨论】:

    • 我认为你是对的。如果我在前两行(shebang 和 for)有 Unix 行结束,在第三行(do)有一个 Windows 行结束,我会收到询问者报告的相同错误。我在 Solaris 上运行 Bash 4。
    • 你很可能想要在“.”后面加上一个“-maxdepth 1”。在你的 find 命令中。但是,如果您的 for 看起来像“for DIR in */”,则不需要 find(注意添加的斜杠)。
    • @Dennis,如果他想限制参考基目录中的一级目录,那是完全正确的。然而,这些问题并没有特别表明这一点。
    【解决方案2】:

    你可能想做这样的事情:

    #!/bin/bash
    for DIR in *; do
        if [ -d "$DIR" ]; then 
            mkdir "$DIR/photos2"
            chown apache:apache "$DIR/photos2"
            chmod 777 "$DIR/photos2"
        fi
    done
    
    • “do”的错误是因为 bash 是面向行的,并且期望“do”在同一行。当然,您可以在行尾放置一个 \。 编辑:这是不正确的。大概是一个不太受过教育的猜测。
    • 当命令位于不同的行时,分号不是必需的。
    • 如果文件名中有空格,则需要在 $DIR 周围加上引号。

    【讨论】:

    • 如果您选择将“do”与“for”保持在同一行,则需要一个“;”。我还没有看到与 bash 相关的其他限制。
    • 这里列出的其他问题都不会在“do”附近引发语法错误。
    • 如果你的 for 看起来像“for DIR in */”,你可以省略 if 语句(注意添加的斜杠)。
    • 我在使用 bash 时遇到了问题,因为我习惯了 PHP,在这种情况下,间距并不重要(同样重要)。方括号周围的那些空格是必不可少的。此外,声明变量时没有空格。 IE。 dog=chihuahua 而不是 dog = chihuahua
    【解决方案3】:

    任何一个

    for DIR in *
    do 
    

    for DIR in *; do 
    

    【讨论】:

    • 允许在行尾使用分号。问题中的表格也可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多