将数组转换为字符串

将数组转换为字符串

我有一个字符串说,test_var=ab_c_de_fg_.txt。我需要存储ab_c在一个变量(第二个之前的字符_)和de_fg_第二个变量(第二个之后_和之前的字符.txt)中,因此这两个变量可以在进一步的操作中使用。

test_var=ab_c_de_fg_.txt

for ((i=0;i<{#test_var};i++))
do
    a[$i]="${var:$i:1}"
done

flag=0
temp=0

while [["$temp" -le "${#test_var}"]]
do
    if a[temp] -eq "_" && flag -eq 0
    flag = 1
    continue
fi

if a[temp] -eq "_" && flag -eq 1
#var1=arr[0] to arr[$(temp-1)]
#var2=arr[$(temp+1)] to arr[#(test_var)]
fi

temp=$((temp+1))
done

请指导我,因为我是 shell 脚本编写的新手。谢谢。

答案1

要将字符串拆分为数组,可以使用 split+glob 运算符(当您在列表上下文中保留未加引号的参数扩展时调用):

test_var=ab_c_de_fg_.txt
root_name=${test_var%.*} # remove extension

IFS=_         # split on _
set -o noglob # disable glob part
array=( $root_name"" ) # split+glob, preserve empty trailing element if any

typeset -p array然后会显示类似以下内容:

typeset -a array=(ab c de fg '')

要将数组的元素与 的第一个字符(ksh 中的字节)连接起来$IFS,您需要执行"${array[*]}"

所以:

printf '%s\n' "${array[*]:0:2}" "${array[*]:2}"

会输出:

ab_c
de_fg_

你的两个变量可以定义如下:

first_part="${array[*]:0:2}" second_part="${array[*]:2}"

答案2

这是执行您的问题所要求的一种方法bash(并忽略您的代码,因为我无法理解您想要用它做什么):

$ test_var=ab_c_de_fg_.txt
$ read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')
$ echo "$var1"
ab_c
$ echo "$var2"
de_fg_

在脚本中,这只是:

test_var=ab_c_de_fg_.txt
read var1 var2 < <(echo "$test_var" | sed 's/_/ /2; s/\.txt$//')

现在你有了$var1$var2

诀窍是使用read读取两个变量。这会将其输入拆分为环境变量的当前值IFS(默认情况下,是空格、制表符和换行符)。该命令将用空格 ( )sed替换第二个,并从其输入 ( ) 的末尾删除,因此传递给的将是,并且由于中间有一个空格,因此每个字符串都保存在相应的变量中。_s/_/ /2.txts/\.txt$//readab_c de_fg_.txt

相关内容