Bash 比较目录和数组之间的文件名

Bash 比较目录和数组之间的文件名,bash,Bash,我试图创建一个脚本,根据目录中文件的名称运行两个不同的命令 到目前为止,我创建了以下小脚本: #!/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 da

我试图创建一个脚本,根据目录中文件的名称运行两个不同的命令

到目前为止,我创建了以下小脚本:

#!/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
,输出文件将与输入文件同名,但末尾有一个
\u d.nc
(仍然必须删除输入文件的.nc,这样它们就不会变成
.nc\u d.nc

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

我以为脚本已经准备好了,但我遇到了以下错误:
scriptCDO.sh:4:scriptCDO.sh:语法错误:“(“意外的


知道发生了什么吗?

没有足够的信息,因为$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

直接的问题是,您正试图使用另一种语言的解释器运行bash脚本,特别是
sh
。请改用
bash
,或者最好使用
/yourfile
来使用shebang中指定的文件。但是,还有一些其他问题。请先使用shellcheck并修复这些问题,然后使用update.你能把
echo BASH\u VERSION=$BASH\u VERSION
放在这个脚本中,运行它并显示它的输出吗?@KamilCuk it show BASH\u VERSION=4.4.12(1)-release谢谢@thatotherguy!。我对这个有点陌生…在你的评论之后,我可以用./scriptname运行它,但现在我知道在“if…”上需要一个二进制运算符行。:/我以为它是当前编写的。感谢您的观察!我已经更新了它,但现在我知道“if…”上需要一个二进制运算符line@Guillermo.D,在我没有测试代码之前,很抱歉,上面的代码在BASH4+上对我有效。谢谢!但是一个简单的问题…为什么在这种情况下我们需要[[而不是一个][?好问题,有很多方法可以测试,但是我们使用的“=~”会用单引号错误地读取,我使用phpStorm和bash扩展,它告诉我当我删除其中一个[have look this post(以及我在这篇文章中的)时有问题