Bash For循环 - 多个变量,不使用数组?

时间:2014-01-02 19:19:48

标签: bash loops for-loop

我遇到了一个似乎应该有一个简单答案的问题,但我一直在打墙。

我正在尝试创建一个包含通过两个不同变量命名的文件的目录结构。例如:

101_2465
203_9746
526_2098

我正在寻找看起来像这样的东西:

for NUM1 in 101 203 526 && NUM2 in 2465 9746 2098
do
mkdir $NUM1_$NUM2
done

我只考虑将NUM1和NUM2的值设置为数组,但它使脚本过于复杂 - 我必须尽可能简化每行代码,因为它被不太了解的人使用关于编码。他们已经熟悉使用上面示例设置的for循环(但只使用1个变量),所以我试图尽可能地保持它。

提前致谢!

3 个答案:

答案 0 :(得分:2)

while read NUM1 NUM2; do
    mkdir ${NUM1}_$NUM2
done << END
101 2465
203 9746
526 2098
END

请注意,下划线是有效的变量名称字符,因此您需要使用大括号从下划线中消除名称NUM1的歧义

答案 1 :(得分:2)

  

...将NUM1和NUM2的值设置为数组,但它使脚本过于复杂......

没有-禁忌。一切都会比阵列更复杂。

NUM1=( 101 203 526 )
NUM2=( 2465 9746 2098 )
for (( i=0; i<${#NUM1}; i++ )); do
    echo ${NUM1[$i]}_${NUM2[$i]}
done

答案 2 :(得分:0)

一种方法是用换行符分隔两个变量中的条目,然后使用paste将它们组合在一起:

a='101 203 526'
b='2465 9746 2098'

# Convert space-separated lists into newline-separated lists 
a="$(echo $a | sed 's/ /\n/g')"
b="$(echo $b | sed 's/ /\n/g')"

# Acquire newline-separated list of tab-separated pairs
pairs="$(paste <(echo "$a") <(echo "$b"))"


# Loop over lines in $pairs

IFS='
'

for p in $pairs; do
echo "$p" | awk '{print $1 "_" $2}'
done

输出:

101_2465
203_9746
526_2098