首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Bash中访问间接shell变量

在Bash中访问间接shell变量
EN

Stack Overflow用户
提问于 2017-05-16 10:33:14
回答 3查看 360关注 0票数 2

我有13个文件名,我想将它们作为参数传递给sh

文件如下所示:

代码语言:javascript
复制
$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 )中的值

EN

回答 3

Stack Overflow用户

发布于 2017-05-16 10:47:58

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

代码语言:javascript
复制
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

或者更简单地说:

代码语言:javascript
复制
for g in {1..13}; do
  filenewname="FILENAME$g"
  sh "$SCRIPTS/$SCRIPTNAME" "${!filenewname}"
done

我在变量两边添加了双引号,以防止分词和分词。

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

对普通shell变量使用全大写不是一种好的做法。有关命名约定的一些有用信息,请参阅此帖子:

票数 4
EN

Stack Overflow用户

发布于 2017-05-16 14:11:09

使用eval。Eval在执行参数之前对其参数进行扩展,这是shell脚本中执行您想要的操作的标准方法。

代码语言:javascript
复制
$ FILEPATTERN=XYZ_
$ somedate1=20170515
$ FILENAME1="$FILEPATTERN${somedate1}_{sometime}.csv"
$ eval filenewname=$FILENAME1
$ echo $filenewname
XYZ_20170515_{sometime}.csv
$ 
票数 0
EN

Stack Overflow用户

发布于 2017-05-16 11:06:09

我第一次尝试回答一个问题,但是为什么不使用数组来表示您的文件名呢?

代码语言:javascript
复制
#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`)

代码语言:javascript
复制
#Now loop through that array and perform operations
for name in "${arr[@]}"; do
    echo "Handling $name..."
    sh $SCRIPTS/$SCRIPTNAME $name
done

如果这有帮助,你也可以在运行中完成:

代码语言:javascript
复制
FILEPATTERN="XYZ_"
for i in {1..13}; do
    echo "Handling $name..."
    sh $SCRIPTS/$SCRIPTNAME $FILEPATTERN${somedate}"$i"_${sometime}
done
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43991626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档