在Bash

时间:2017-05-16 02:33:14

标签: bash shell unix syntax

我有13个文件名,我想在sh

中将它们作为参数传递

文件就像:

$FILEPATTERN = "XYZ_"

FILENAME1="$FILEPATTERN${somedate1}_{sometime}.csv"
FILENAME2="$FILEPATTERN${somedate2}_{sometime}.csv"
FILENAME3="$FILEPATTERN${somedate3}_{sometime}.csv"
...
FILENAME13="$FILEPATTERN${somedate13}_{sometime}.csv"

for g in 1 2 3 4 5 6 7 8 9 10 11 12 13
do
  filenewname=FILENAME${g}
  sh $SCRIPTS/$SCRIPTNAME $filenewname
  filenewname=""
done

当我回显filenewname时,它正在打印FILENAME1FILENAME2 ....

预期输出应该是变量FILENAME1内的值,即$FILEPATTERN${somedate1}_{sometime}.csv

3 个答案:

答案 0 :(得分:4)

您需要${!var}构造才能访问indirect shell variable。因此,将循环重写为:

for g in 1 2 3 4 5 6 7 8 9 10 11 12 13
do
  filenewname="FILENAME${g}"
  sh "$SCRIPTS/$SCRIPTNAME" "${!filenewname}"
done

或者更简单:

for g in {1..13}; do
  filenewname="FILENAME$g"
  sh "$SCRIPTS/$SCRIPTNAME" "${!filenewname}"
done

我在变量周围添加了双引号,以防止单词拆分和通配。

顺便说一下,你的第一行有问题 - $FILEPATTERN = "XYZ_"不是有效的作业。它应该是FILEPATTERN="XYZ_"(注意:=周围没有空格)。在shellcheck检查您的脚本。

对普通的shell变量使用全部大写并不是一个好习惯。有关命名约定的一些有用信息,请参阅此文章:

答案 1 :(得分:0)

使用eval。 Eval在执行它们之前会扩展它的参数,并且是shell脚本中执行所需操作的标准方法。

$ FILEPATTERN=XYZ_
$ somedate1=20170515
$ FILENAME1="$FILEPATTERN${somedate1}_{sometime}.csv"
$ eval filenewname=$FILENAME1
$ echo $filenewname
XYZ_20170515_{sometime}.csv
$ 

答案 2 :(得分:-1)

我第一次尝试回答问题,但为什么不使用数组作为文件名呢?

#Make an array called 'arr' with 13 strings of our file names 
FILEPATTERN="XYZ_"
arr=(`for i in {1..13}; do echo "$FILEPATTERN${somedate}$i_${sometime}";done`)

我不知道你在哪里获得$ {somedate}和$ {sometime}但是如果13个文件中每个文件的唯一区别是最后的数字,你可以预先生成文件名如上所示。

#Now loop through that array and perform operations
for name in "${arr[@]}"; do
    echo "Handling $name..."
    sh $SCRIPTS/$SCRIPTNAME $name
done

如果这有帮助,您也可以动态地执行此操作:

FILEPATTERN="XYZ_"
for i in {1..13}; do
    echo "Handling $name..."
    sh $SCRIPTS/$SCRIPTNAME $FILEPATTERN${somedate}"$i"_${sometime}
done