Bash
將數組轉換為字元串
我有一個字元串說,
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}"