【问题标题】:compare file names between directory and array [duplicate]比较目录和数组之间的文件名[重复]
【发布时间】:2018-06-05 23:32:27
【问题描述】:

我正在尝试根据目录中文件的名称创建一个用于运行两个不同命令的脚本。

到目前为止,我创建了这个小脚本:

#!/bin/bash

declare -a sumas=("CPRAT1sfc.nc" "CPRAT2sfc.nc" "CPRATsfc.nc")

for files in *.nc; do
    if [ "$files"="${sumas[@]}" ]; then
        cdo daymean $files {$files}_d.nc
    else
        cdo daysum $files {$files}_d.nc
    fi
done

我正在尝试获取以.nc 结尾的所有文件,然后检查它们的名称是否与sumas 数组中的名称不同。

对于名称相同的文件,将运行一个命令:cdo daymean input output,输出文件将与输入同名,但末尾带有 _d.nc(仍然需要删除 .nc输入,这样它们就不会以 .nc_d.nc) 结束。

如果它们的名称与sumas 不同,则会运行另一个命令,其语法与前一个类似。

我虽然脚本已经准备好,但我收到了这个错误: scriptCDO.sh: 4: scriptCDO.sh: Syntax error: "(" unexpected

知道发生了什么吗?

【问题讨论】:

  • 最直接的问题是,您正尝试使用不同语言的解释器运行 bash 脚本,特别是 sh。请改用bash,或者最好使用./yourfile 来使用shebang 中指定的文件。但是,还有其他几个问题。使用 shellcheck 并首先修复这些问题,然后更新。
  • 你能把echo BASH_VERSION=$BASH_VERSION放到这个脚本里,运行它并显示它的输出吗?
  • @KamilCuk 它显示 BASH_VERSION=4.4.12(1)-release
  • 谢谢@thatotherguy !我对此有点陌生...在您发表评论后,我能够使用 ./scriptname 运行它,但现在我知道“如果...”行上应该有一个二元运算符。 :/ 我认为它是当前写的。

标签: bash


【解决方案1】:

没有足够的信息,因为 $i 未设置,但您的问题主要与比较方法有关。看看这个:

#!/usr/bin/env bash
BASE_DIR="/tmp/"  # change this to your base folder name
declare -a sumas=( "CPRAT1sfc.nc" "CPRAT2sfc.nc" "CPRATsfc.nc" )
i=1 # you need to set this to something

cd "${BASE_DIR}"
for each in * ; do
    if [[ "${sumas[@]}" =~ "${each}" ]] ;then
        echo "HERE -- cdo daymean $each {$i}_d.nc"
    else
        echo "NOT HERE -- cdo daysum $echo {$i}_d.nc"
    fi
done

【讨论】:

  • 感谢您的观察!我已经更新了它,但现在我知道“如果...”行上应该有一个二元运算符
  • @Guillermo.D ,抱歉在我没有测试代码之前,上面的代码适用于 BASH4+。
  • 谢谢!但是一个简单的问题......为什么在这种情况下我们需要 [[ 而不是单个 [ ?
  • 好问题,有很多方法可以测试,但是我们使用 '=~' 的方法会用单引号读取错误,我使用 phpStorm 和 bash 扩展,它告诉我有问题我删除了其中一个 [
  • 看看这篇文章(和我的这篇文章)stackoverflow.com/questions/4277665/…
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 2013-02-27
  • 2013-04-26
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
相关资源
最近更新 更多