我的主要目标是设置从不同长度的字符串中获取的变量。每个变量必须包含字符串中的 4 位数字(即
var_1 =
数字 1-4、var_2 =
数字 5-8 等)。通过使用 fold -w4
命令,我可以将字符串分成 4 个块。
例如:
string = 1234567898765432
fold -w4:
1234
5678
9876
5432
除了通过复制数据手动创建变量之外,任何人都可以建议我如何让 Bash 为创建的每个 4 块自动创建变量吗?
我搜索过 Google,甚至尝试过 ChatGPT。给出的建议似乎不起作用:
# Get the length of the input string
length=${#input_string}
# Loop through the string in steps of 4 characters
for (( i=0; i<$length; i+=4 )); do
# Extract 4 characters starting from position i
substring="${input_string:i:4}"
# Create a variable with the extracted substring
var_name="var_$((i/4 + 1))"
declare "$var_name=$substring"
done
# Print the created variables
echo "Created variables:"
declare -p | grep -E '^declare -\w+ var_[0-9]+='
所发生的只是我将“创建的变量”写入终端。
通常的方法是创建一个条目数组,可以使用
mapfile
(或 readarray
- mapfile
的同义词)轻松完成;在这种情况下,我们还将使用流程替换将 fold
结果提供给 mapfile
,例如:
$ string=1234567898765432
$ mapfile -t arr < <(fold -w4 <<< "${string}")
$ typeset -p arr
declare -a arr=([0]="1234" [1]="5678" [2]="9876" [3]="5432")
chatGPT 答案有效,只是脚本的最后一行 (
declare -p | grep -E ...
) 是错误的。最后一行的替代方案:
$ declare -p | grep 'var_'
declare -- var_1="1234"
declare -- var_2="5678"
declare -- var_3="9876"
declare -- var_4="5432"
declare -- var_name="var_4" # probably don't want to see this one
$ declare -p | grep -E ' var_[0-9]+='
declare -- var_1="1234"
declare -- var_2="5678"
declare -- var_3="9876"
declare -- var_4="5432"