Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于可变内容的bash大括号扩展无效_Bash_Brace Expansion - Fatal编程技术网

基于可变内容的bash大括号扩展无效

基于可变内容的bash大括号扩展无效,bash,brace-expansion,Bash,Brace Expansion,如何使bash扩展在传递给mkdir的变量中找到的内容? 到目前为止,我已经尝试使用eval和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

如何使bash扩展在传递给mkdir的变量中找到的内容? 到目前为止,我已经尝试使用
eval
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

我怀疑你的问题在于你有两个扩展层,尽管你在问题中没有说明这一点。也就是说,你展示:

mkdir -pv $DATA_L2/yy/data
如果您只需添加一个
eval
即可:

eval mkdir -pv $DATA_L2/yy/data
但是在您的循环中,您实际上并没有运行上面的命令。我认为你在做这样的事情:

mkdir -pv $LINE
如果我们在
mkdir
前面粘贴一个
echo
,我们可以看到:

echo mkdir -pv $LINE
结果:

mkdir -pv $DATA_L2/yy/data
mkdir -pv /tmp/{1,2,3}/{a,b,c}/yy/data
以及:

结果:

mkdir -pv $DATA_L2/yy/data
mkdir -pv /tmp/{1,2,3}/{a,b,c}/yy/data
如果您将评估加倍:

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
但是双重
求值是一个非常好的迹象,需要重新思考解决问题的方法。

我怀疑这是一种选择,但其中一种选择可能是数组和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

您没有在循环体中使用变量
$LINE
。您希望在这里发生什么?大括号展开发生在参数展开之前。另外,如果有,您如何使用
?您正在编写
mkdir$LINE
并期望递归参数扩展吗?暂时忽略
file.txt
,您可以在/tmp/{1,2,3}/{a,b,c}/yy/data中为d编写
;do mkdir-p“$d”;完成
。简单地
mkdir-p/tmp/{1,2,3}/{a,b,c}/yy/data
?您对数据的定义没有多大意义。这只会扩展到
/tmp/{1,2,3}
,但即使在参数扩展之前应用逗号,也不会像您希望的那样扩展到/tmp/1/tmp/2/tmp/3。我不认为问题是xy问题。实际需要的是创建这些目录而不进行任何循环,也就是使用大括号扩展。由于某些原因,我尝试的每一个组合(由于结构复杂)都不起作用,而且由于工作的性质,我觉得在这里发布完整的脚本并不舒服(法律原因)。@mispp在这种情况下,请做出选择,并明确给出您的限制条件。足够公平。我将在稍后讨论这个问题,因为我必须继续处理其他问题。谢谢你们的解决方案。@ MISPP,考虑<代码> IFS=,Real-R-A号码,那里还有一行。我错把它漏掉了。将相应地更新问题。您的编辑符合我的假设,因此此答案仍然适用。我怀疑@wjandrea在重新思考你解决问题的方法方面走的是正确的道路。这正是我想要的。您使用斜体的这个“双重”评估解决了这个问题。即使这可能是xy问题,我也不这么认为。实际上,我想避免使用循环,而是用大括号扩展来代替它。循环已经存在了…您只需要进行双重评估,因为您在单一评估方法中没有正确引用<代码>使用引号eval“mkdir-pv$LINE”
可以正常工作。