AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 29149
Accepted
TrevJen
TrevJen
Asked: 2009-06-21 08:17:56 +0800 CST2009-06-21 08:17:56 +0800 CST 2009-06-21 08:17:56 +0800 CST

Redhat Shell 脚本 If 语句失败并出现奇怪的语法错误

  • 772

红帽 5.3 企业版

以下 Shell 脚本用于检查并查看备份目录是否名为“ll_backup”,然后将其更改为与文件 RESULT.VAR 的内容相同。出于日志目的,将 result.var 文件复制到另一个目录。我在测试环境中进行了此工作,但在生产中却遇到了一个奇怪的错误,我一生都无法弄清楚!

脚本:

#!/bin/bash
#!/bin/cat
# Restores original directory name for next LogLogic Update
#TCJ 6/1/09
declare RESULT
declare FILE
FILE=result.var
cd /home/nb-backup/backups/nb-st3000/ll_bkup_65.99.220.172/
if [ -d ll_bkup ]
 then
        cat result.var | while IFS=: read RESULT
        mv  "ll_bkup" "$RESULT"
        mv result.var /home/storegrid/scripts/results/result-`date +%y%m%d%s`.var
else
         exit 0
fi
exit 0

结果:

nb-script-restorellbackup.sh:第 14 行:意外标记附近的语法错误 else' nb-script-restorellbackup.sh: line 14:else'

linux scripting bash shell
  • 3 3 个回答
  • 2574 Views

3 个回答

  • Voted
  1. Best Answer
    Gordon Davisson
    2009-06-21T14:39:49+08:002009-06-21T14:39:49+08:00

    有许多问题,从轻微到致命(所有致命问题都与“cat...while...read”行有关)。让我按顺序浏览它们:

    • 正如 Dennis Williamson 所指出的,“#!/bin/cat”和“declare...”行没有任何作用。
    • 您将 FILE 设置为靠近顶部的 result.var,但从不使用此变量。假设它旨在允许您仅在一处更改文件名,则应将所有其他对 result.var 的引用替换为 "$FILE"
    • while 语句需要一个“do...done” - 或者更确切地说,如果您实际上首先需要 while 语句,它就会出现。由于您只从文件中读取一个 RESULT,因此您不需要循环。
    • 由于“读取 RESULT”是管道的一部分,因此它在子 shell 中运行,并且当子 shell 退出时,它设置的 RESULT 值会丢失。你可以通过使用类似'read RESULT <"$FILE"'来解决这个问题。
    • 那里的“IFS =:”位是什么?它在读取命令期间将内部字段分隔符设置为“:”,但由于您只读取一个字段 (RESULT),它唯一要做的就是从从 result.var 读取的内容中修剪前导或尾随冒号. 如果您打算忽略冒号后的所有内容(即仅使用 result.var 中第一个以冒号分隔的字段),则应使用“IFS=: read RESULT IGNOREDJUNK”。
    • 除非您实际上是在尝试修剪/解析 result.var 的内容,或者需要多次使用它,否则您根本不需要将其读入变量;只需使用'mv "ll_bkup" "$(cat "$FILE")"'。但我声称你想再次使用它(见下文)。
    • 该脚本相当脆弱,因为它不检查以确保 result.var 存在(并且由于脚本移动该文件,如果连续运行两次,则保证第二次失败);同样,在尝试将 ll_bkup 重命名为它之前,它不会检查“$RESULT”是否已经存在,从而导致潜在的不可预测的结果。
    • 说到这一点,您的描述说 result.var 被复制,但实际代码移动了它。预期的行为是什么?
    • 最后,“else...exit 0”部分没有做任何事情,而最后的“exit 0”无论如何都不会做。

    抱怨,抱怨,抱怨......无论如何,这是我提议的重写:

    #!/bin/bash
    # Restores original directory name for next LogLogic Update
    #TCJ 6/1/09
    FILE=result.var
    cd /home/nb-backup/backups/nb-st3000/ll_bkup_65.99.220.172/
    if [ -d ll_bkup -a -f "$FILE" ]; then
        read RESULT <"$FILE"
        if [ ! -e "$RESULT" ]; then
            mv  "ll_bkup" "$RESULT"
            mv "$FILE" /home/storegrid/scripts/results/result-`date +%y%m%d%s`.var
        fi
    fi
    exit 0
    
    • 2
  2. pgs
    2009-06-21T08:21:57+08:002009-06-21T08:21:57+08:00

    while 循环是怎么回事?它需要do ... done某个地方。

    这里有一些参考资料供您参考:

    • Bash 初学者指南
    • 高级 Bash 脚本指南
    • 1
  3. Dennis Williamson
    2009-06-21T08:30:26+08:002009-06-21T08:30:26+08:00

    您需要将行更改为如下所示:

    cat result.var | while IFS=:; do read RESULT; done
    

    在我看来cat,read它设置 $RESULT 等于文件“result.var”内容的最后一行的第一个单词

    并删除这一行:

    #!/bin/cat
    

    因为它什么也没做。

    你真的不需要declare在这种情况下使用。

    $()在您的日期命令周围使用。如有必要,它更具可读性并且可以更容易地嵌套。

    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve