我有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时,它正在打印FILENAME1
,FILENAME2
....
预期输出应该是变量FILENAME1
内的值,即$FILEPATTERN${somedate1}_{sometime}.csv
答案 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