如何在 Linux Bash 中的字符串中组合环境变量和括号扩展?

如何在 Linux Bash 中的字符串中组合环境变量和括号扩展?

我想编写一个 bash 脚本来创建如下目录结构:

foo
 | - innerdir1
 | - innerfile1

应针对不同的目录 foo 名称重复此操作多次。每个 foo 名称由两部分组成。所以我想我首先需要设置环境变量:

    $BAR=something
    $BAZ=anotherthing

然后我需要在脚本中使用它们,该脚本将生成上述带有 foo 名称的结构,如 $BAR.$BAZ,即 something.anotherthing。我该如何编写这样的脚本?

答案1

for BAR in abc def
do
    for BAZ in ghi jkl mno
    do
        mkdir -p "$BAR.$BAZ/innerdir1"
        touch "$BAR.$BAZ/innerfile1"
    done
done

将创建:

abc.ghi
 | - innerdir1
 | - innerfile1
abc.jkl
 | - innerdir1
 | - innerfile1
abc.mno
 | - innerdir1
 | - innerfile1
def.ghi
 | - innerdir1
 | - innerfile1
def.jkl
 | - innerdir1
 | - innerfile1
def.mno
 | - innerdir1
 | - innerfile1

答案2

不要使用环境变量,而是将您的名称作为参数传递,并编写脚本来使用这些参数——这将使其成为一个更灵活的工具。

查找‘ getopts此 bash-guide 页面和其他地方。

答案3

剧本:

#!/bin/bash
if [ -z "$BAR" -o -z "$BAZ" ]; then
  echo "This script needs environment variables $BAR and $BAZ to be set."
  exit 1 
fi

dir=$BAR.$BAZ
mkdir $dir
mkdir $dir/innerdir1
touch $dir/innerfile1

调用方式如下:

BAR=bar BAZ=baz ./script.sh

这将创建:bar.baz/innerdir1bar.baz/innerfile1

答案4

你应该看看

http://tldp.org/LDP/abs/html/arrays.html

一个简单的开始是:

#!/bin/bash

# define foo array
FOOLIST=()

# can be repeated

# create foonames
BAR="something"
BAZ="anotherthing"

# add to foolist
FOOLIST+=("${BAR}.${BAZ}")

BAR="somethingnew"
FOOLIST+=("2${BAR}.${BAZ}")

BAR="somethingnewer"
FOOLIST+=("3${BAR}.${BAZ}")

# create folders from list
for folder in ${FOOLIST[@]}
do
        mkdir $folder
        mkdir $folder/innerdir1
        mkdir $folder/innerfile1
done

相关内容