【问题标题】:How to create a dynamic variable array name and fill it with multi-line text in bash script如何在 bash 脚本中创建动态变量数组名称并用多行文本填充
【发布时间】:2014-03-17 13:15:40
【问题描述】:

我需要为一些数组创建一个动态变量名并用多行文本填充它。

我实际上拥有的是这个:

#!/bin/bash

IFS=$'\n'
# Set an array with 1 item
ARRAY=("Item1")
# Get a description for the last item from a simple text file
DESCRIPTION=("$(cat test1.txt)")
# Get the number of items in the array
ARRAY_ITEMS_COUNT=${#ARRAY[@]}
# Create a variable name containing the number of items in the array as identifier
# and fill it with the description
eval ARRAY_ITEM${ARRAY_ITEMS_COUNT}_DESCRIPTION="(\"${DESCRIPTION[@]}\")"

# Display some results
echo "ARRAY_ITEM1_DESCRIPTION[@] = \"${ARRAY_ITEM1_DESCRIPTION[@]}\""
echo "ARRAY_ITEM1_DESCRIPTION[0] = \"${ARRAY_ITEM1_DESCRIPTION[0]}\""
echo "ARRAY_ITEM1_DESCRIPTION[1] = \"${ARRAY_ITEM1_DESCRIPTION[1]}\""

echo

# Same as above with a different text file
ARRAY=("Item1" "Item2")
DESCRIPTION=("$(cat test2.txt)")
ARRAY_ITEMS_COUNT=${#ARRAY[@]}

# Get an error here due to the ' character used in the text file
eval ARRAY_ITEM${ARRAY_ITEMS_COUNT}_DESCRIPTION="(\"${DESCRIPTION[@]}\")"

echo "ARRAY_ITEM2_DESCRIPTION[@] = \"${ARRAY_ITEM2_DESCRIPTION[@]}\""
echo "ARRAY_ITEM2_DESCRIPTION[0] = \"${ARRAY_ITEM2_DESCRIPTION[0]}\""
echo "ARRAY_ITEM2_DESCRIPTION[1] = \"${ARRAY_ITEM2_DESCRIPTION[1]}\""

“test1.txt”和“test2.txt”文件如下:

test1.txt

Simple text file with multi-lines used as
a test without special characters inside.

test2.txt

Simple text file with multi-lines used as
a test with single ' and double " quotes.

预期结果:

ARRAY_ITEM1_DESCRIPTION[@] = "Simple text file with multi-lines used as
a test without special characters inside."
ARRAY_ITEM1_DESCRIPTION[0] = "Simple text file with multi-lines used as"
ARRAY_ITEM1_DESCRIPTION[1] = "a test without special characters inside."

ARRAY_ITEM2_DESCRIPTION[@] = "Simple text file with multi-lines used as
a test with single ' and double " quotes."
ARRAY_ITEM2_DESCRIPTION[0] = "Simple text file with multi-lines used as"
ARRAY_ITEM2_DESCRIPTION[1] = "a test with single ' and double " quotes."

当前结果:

ARRAY_ITEM1_DESCRIPTION[@] = "Simple text file with multi-lines used as
a test without special characters inside."
ARRAY_ITEM1_DESCRIPTION[0] = "Simple text file with multi-lines used as
a test without special characters inside."
ARRAY_ITEM1_DESCRIPTION[1] = ""

./test.sh: eval: line 28: unexpected EOF while looking for matching `"'
./test.sh: eval: line 29: syntax error: unexpected end of file
ARRAY_ITEM2_DESCRIPTION[@] = ""
ARRAY_ITEM2_DESCRIPTION[0] = ""
ARRAY_ITEM2_DESCRIPTION[1] = ""

我尝试了很多东西,但它从来没有给我预期的结果,所以有人可以帮我解决我在那里遇到的 2 个问题吗:

  • 如何在每个索引上获取包含文本文件每一行的正确数组
  • 如何使它在文本中使用引号字符时也能正常工作

编辑:工作解决方案(bash 版本 > 4)是:

#!/bin/bash

# Set an array with 1 item
ARRAY=("Item1")
# Get the number of items in the array
ARRAY_ITEMS_COUNT=${#ARRAY[@]}
# Create a variable name containing the number of items in the array as identifier
# and fill it with the description
readarray -t "ARRAY_ITEM${ARRAY_ITEMS_COUNT}_DESCRIPTION" < test1.txt

# Display some results
echo "ARRAY_ITEM1_DESCRIPTION[@] = \"${ARRAY_ITEM1_DESCRIPTION[@]}\""
echo "ARRAY_ITEM1_DESCRIPTION[0] = \"${ARRAY_ITEM1_DESCRIPTION[0]}\""
echo "ARRAY_ITEM1_DESCRIPTION[1] = \"${ARRAY_ITEM1_DESCRIPTION[1]}\""

echo

# Same as above with a different text file
ARRAY=("Item1" "Item2")
ARRAY_ITEMS_COUNT=${#ARRAY[@]}

# Get an error here due to the ' character used in the text file
readarray -t ARRAY_ITEM${ARRAY_ITEMS_COUNT}_DESCRIPTION < test2.txt

echo "ARRAY_ITEM2_DESCRIPTION[@] = \"${ARRAY_ITEM2_DESCRIPTION[@]}\""
echo "ARRAY_ITEM2_DESCRIPTION[0] = \"${ARRAY_ITEM2_DESCRIPTION[0]}\""
echo "ARRAY_ITEM2_DESCRIPTION[1] = \"${ARRAY_ITEM2_DESCRIPTION[1]}\""

感谢您的帮助,祝您有美好的一天。

诽谤

【问题讨论】:

  • 诽谤,我确信有一种方法可以纯粹在 bash 中执行此操作,但每当我使用单引号和双引号(或可能其他恶意字符:$, %, *, !)时。我会开始寻找更适合该环境的脚本语言(例如 perl 或 python)。
  • 如下所述,有一种简单的方法可以做到这一点,而无需混合语言。 Bash 很强大...谢谢 ;)

标签: arrays bash


【解决方案1】:

当您在数组赋值中调用cat 时,如果您希望逐行读取文件,则不应引用它。因为如果您这样做,文件的内容将作为一个字符串/一行处理。所以它不会被逐行读取。试试看:

DESCRIPTION=($(cat test1.txt))

另外,如果您使用的是 Bash 版本 4,您可以使用 bash 内置命令 readarray 生成一个数组:

readarray -t DESCRIPTION < "test1.txt"

对于 cat 和 readarray

IFS=$'\n' read -d -r -a DESCRIPTION < "test1.txt"

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2013-04-02
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多