【问题标题】:korn shell script failingkorn shell 脚本失败
【发布时间】:2016-02-25 05:25:05
【问题描述】:

需要以下 korn shell 的帮助。语句 if (( ${lista[expr $FNO + 5]} == $MM )); 因语法错误而失败。获取 == 的语法错误。也试过 -eq 但同样的问题。

这不返回任何内容:${lista[expr $FNO + 5]}。 如何在这里获取月份值?

#!/bin/ksh
# get a list of files and dates from ftp and remove files older than ndays

ftpsite="xxx.com"
ftpuser="ftpuser"
ftppass="ftppwd"
putdir="/ftpdir"

MM=`TZ=GMT+29 date +%b`
DD=`TZ=GMT+29 date +%d`

 echo removing files older than $MM $DD

 # get directory listing from remote source
 listing=`ftp -i -n $ftpsite <<EOMYF 
  user $ftpuser $ftppass
  binary
  cd $putdir
  ls -l
 quit
 EOMYF`


 lista=$listing


 # loop over our files
 FNO=0
 while (( $FNO < ${#lista[@]} )); do 

  # month (element 5), day (element 6) and filename (element 8)
  #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}          File: ${lista[`expr $FNO+8`]}

  # check the date stamp

  if (( "${lista[`expr $FNO + 5`]}" == $MM ));
  then
if (("${lista[`expr $FNO + 6`]}" -lt $DD ));
    then
     # Remove this file
  echo "Removing ${lista[`expr $FNO + 8`]}"
     echo "Removing ${lista[`expr $FNO + 8`]}" 

      ftp -i -n $ftpsite <<EOMYF2
      user $ftpuser $ftppass
      binary
      cd $putdir
     delete ${lista[`expr $FNO+8`]}
     quit
 EOMYF2

   fi
 fi
  (( FNO = $FNO + 9 ))
done

请在这方面需要帮助。


谢谢你试图帮助我。是的,我从 pastebin 本身复制了它。当我尝试使用 ls *.txt 获得如下输出时,它没有获得 5 美元的价值,因此,根据您的建议尝试了 ls -l *.txt。我还能尝试什么?

  • 设置--ccc_20160301.txt
  • (( 1 > 9 ))
  • [[ == 二月]]
  • 读线

下面是我从 pastebin 本身复制的脚本

#!/bin/ksh -px
# get a list of files and dates from ftp and remove files older than ndays

ftpsite="ftp.com"
ftpuser="ftpuser"
ftppass="ftppass"
putdir="/xxx/yyy"



MM=$(TZ=GMT+29 date +%b)
DD=$(TZ=GMT+29 date +%d)

echo "removing files older than $MM $DD"

 # get directory listing from remote source
echo "
user $ftpuser $ftppass
binary
cd $putdir
ls *.txt
quit" | ftp -i -n $ftpsite | while read line; do
    # line is *each line*, rather than a list of everything
    # helps if the filenames have spaces. Just chomp into $0..
    set -- $line
    # month (element 5), day (element 6) and filename (element 8)
    if (($# > 9)); then
        echo "Can't deal with '$@'"
        continue
    fi
    # check the date stamp
    if [[ $5 == "$MM" ]];
   then
        if (($6 < $DD ));
        then
            # Remove this file
            filename=$8
            echo "Removing $filename"

            # replace the ftp with cat with ftp $ftpsite
            cat <<EOMYF2
            ftp -n -i $ftpsite
            user $ftpuser $ftppass
            binary
            cd $putdir
            delete $filename
            quit
EOMYF2
       fi
    fi
done

【问题讨论】:

    标签: linux unix sh


    【解决方案1】:

    当你赋值时:lista=$listing,这是一个简单的变量赋值。

    您想将listing 分配给lista 作为一个数组。其语法是:

    set -A lista $listing
    

    顺便说一句,我会使用$() 而不是反引号来调用命令,并使用$((math)) 而不是expr math,因为它们更流畅。

    尝试调试ftp文件列表:

    ftpsite="xxx.com"
    ftpuser="ftpuser"
    ftppass="ftppwd"
    putdir="/ftpdir"
    
    ftp -i -n $ftpsite <<EOM
    user $ftpuser $ftppass
    binary
    cd $putdir
    ls -l *.txt
    quit
    EOM
    

    这将列出所有考虑的文件 - 您需要确保它们都具有相同的格式。

    确保格式符合预期的每行 9 项后,您可以尝试调试脚本。

    【讨论】:

    • 感谢您的回复。我改变了这个 lista=($listing) 但是,现在在第 50 行得到这个 0403-057 语法错误:`(' 不是预期的。
    • 关闭此处文档的行上的EOMYF2 之前是否有前导空格?如果有,则将其删除 - 此处文档代码在找到行首的结束词时关闭。此外,小于测试需要不加引号,并使用&lt; 而不是-lt。我会将代码提供给shellcheck.net,以获取完整的警告/建议列表。
    • 使用 shellcheck.net 修复了所有问题。但是,在这一行 lista=($listing) 仍然出现错误,该行指出 0403-057 Syntax error at line ... : `(' is not expected.
    • 好的,您使用的是 AIX?在这种情况下,您可能需要明确地执行 typeset -a lista=($listing) - 在这种情况下可能不会发生自动变量输入。
    • 试过 typeset -a lista=($listing) 仍然得到同样的错误。谢谢,你试图帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2014-02-11
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多