0

如何使 bash 扩展它在传递给 mkdir 的变量中找到的任何内容?到目前为止,我已经尝试使用evaland bash -c,但似乎没有任何效果

LEVEL_1=1,2,3
LEVEL_2=a,b,c

DATA_L1="/tmp/{$LEVEL_1}"
DATA_L2="$DATA_L1/{$LEVEL_2}"

for LINE in $(cat file.txt) ; do
  #"cat" here returns values like 
  #$DATA_L2/yy/data

  mkdir -pv $LINE #it actually contains e.g. this $DATA_L2/yy/data
done

我希望这将扩大到

mkdir -p /tmp/1/a/yy/data
mkdir -p /tmp/2/a/yy/data
mkdir -p /tmp/3/a/yy/data
mkdir -p /tmp/1/b/yy/data
mkdir -p /tmp/2/b/yy/data
mkdir -p /tmp/3/b/yy/data
mkdir -p /tmp/1/c/yy/data
mkdir -p /tmp/2/c/yy/data
mkdir -p /tmp/3/c/yy/data
4

2 回答 2

2

我怀疑这是一个XY 问题,但一个选项可能是数组和 for 循环,类似于:

numbers=(1 2 3)
letters=(a b c)

dir="/tmp"

for letter in "${letters[@]}"; do
    for number in "${numbers[@]}"; do
        echo mkdir -pv "$dir/$number/$letter/yy/data"
    done
done

输出:

mkdir -pv /tmp/1/a/yy/data
mkdir -pv /tmp/2/a/yy/data
mkdir -pv /tmp/3/a/yy/data
mkdir -pv /tmp/1/b/yy/data
mkdir -pv /tmp/2/b/yy/data
mkdir -pv /tmp/3/b/yy/data
mkdir -pv /tmp/1/c/yy/data
mkdir -pv /tmp/2/c/yy/data
mkdir -pv /tmp/3/c/yy/data
于 2019-08-13T13:26:34.580 回答
0

我怀疑您的问题是您有两层扩展,即使您没有在问题中表明这一点。也就是说,您显示:

mkdir -pv $DATA_L2/yy/data

如果您简单地添加一个eval,这将起作用:

eval mkdir -pv $DATA_L2/yy/data

但是在你的循环中,你实际上并没有运行上面的命令。我认为你正在运行类似的东西:

mkdir -pv $LINE

如果我们echo在那个前面加上一个mkdir,我们可以看到:

echo mkdir -pv $LINE

结果是:

mkdir -pv $DATA_L2/yy/data

和:

eval echo mkdir -pv $LINE

结果是:

mkdir -pv /tmp/{1,2,3}/{a,b,c}/yy/data

如果将 eval加倍:

eval eval echo mkdir -pv $LINE

你得到你正在寻找的东西:

mkdir -pv /tmp/1/a/yy/data /tmp/1/b/yy/data /tmp/1/c/yy/data /tmp/2/a/yy/data /tmp/2/b/yy/data /tmp/2/c/yy/data /tmp/3/a/yy/data /tmp/3/b/yy/data /tmp/3/c/yy/data

但是双eval标是一个非常好的迹象,需要重新考虑您解决问题的方法。

于 2019-08-13T13:24:57.000 回答