我有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 )中的值
发布于 2017-05-16 10:47:58
您需要使用${!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变量使用全大写不是一种好的做法。有关命名约定的一些有用信息,请参阅此帖子:
发布于 2017-05-16 14:11:09
使用eval。Eval在执行参数之前对其参数进行扩展,这是shell脚本中执行您想要的操作的标准方法。
$ FILEPATTERN=XYZ_
$ somedate1=20170515
$ FILENAME1="$FILEPATTERN${somedate1}_{sometime}.csv"
$ eval filenewname=$FILENAME1
$ echo $filenewname
XYZ_20170515_{sometime}.csv
$ 发布于 2017-05-16 11:06:09
我第一次尝试回答一个问题,但是为什么不使用数组来表示您的文件名呢?
#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`)#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}
donehttps://stackoverflow.com/questions/43991626
复制相似问题