【发布时间】:2021-03-07 13:19:09
【问题描述】:
如何让 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
【问题讨论】:
-
您没有在循环体中使用变量
$LINE。您到底希望在这里发生什么? -
大括号扩展发生在在参数扩展之前。另外,如果有的话,你是如何使用
LINE的?您是否正在编写mkdir $LINE并期待递归参数扩展? -
暂时忽略
file.txt,你可以写for d in /tmp/{1,2,3}/{a,b,c}/yy/data; do mkdir -p "$d"; done。 -
简单的
mkdir -p /tmp/{1,2,3}/{a,b,c}/yy/data怎么样? -
您对 DATA_L1 的定义没有多大意义。这只会扩展为
/tmp/{1,2,3},但应用逗号的时间早于参数扩展,这不会像您希望的那样扩展为/tmp/1 /tmp/2 /tmp/3。
标签: bash brace-expansion