Bash

將數組轉換為字元串

  • June 29, 2020

我有一個字元串說,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 腳本的新手。謝謝。

這是執行您的問題要求的一種方法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命令會將第 2 個替換為_空格 ( ) 並從其輸入 ( )的末尾s/_/ /2刪除..txt``s/\.txt$//``read``ab_c de_fg_.txt

要將字元串拆分為數組,您可以使用 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}"

引用自:https://unix.stackexchange.com/questions/595642