Bash
Bash - 將數組作為字元串分配給變數
我有這段程式碼,它列印出正確的結果,但我不知道如何將最後一行的迴聲轉換為變數。
# hostname is 'tech-news-blog-324344' . Setting it into array host_name_array IFS='-' read -r -a host_name_array <<< "$(hostname)" #removing the last part of string after last "-" unset 'host_name_array[${#host_name_array[@]}-1]' ( IFS=$'-'; echo "${host_name_array[*]}" ) #result is 'tech-news-blog'
如何將最後一行的值放入變數中?我嘗試了以下方法:
( IFS=$'-'; URL="${host_name_array[*]}" )
但我得到的結果是“科技新聞部落格”,數組之間有空格而不是“-”。
執行時
IFS='-' read -r -a host_name_array <<< "$(hostname)"
,數組為(tech news blog 324344)
.用 刪除最後一個元素後
unset 'host_name_array[${#host_name_array[@]}-1]'
,數組為(tech news blog)
。所以,為了得到這個 echo
tech-news-blog
,必須做一些替換,因為echo "${host_name_array[*]}"
會 yieldtech news blog
:使用 tr:
echo "${host_name_array[*]}" | tr ' ' '-'
但:
echo "${host_name_array[*]}" | sed 's/ /-/g'
您可以通過輸出由 分隔的元素來做到這一點,然後通過參數擴展
-
剝離最後一個:-
$ var=$(printf '%s-' "${host_name_array[@]}") $ echo "$var" foo-bar-spam-egg- $ var="${var%-}" $ echo "$var" foo-bar-spam-egg
此外,您還需要
${host_name_array[@]}
防止${host_name_array[*]}
將元素作為一個整體輸出,由 . 的第一個字元分隔IFS
。您正在嘗試做的事情可以通過一個簡單的參數擴展來實現:
${var%-*}
例子:
$ var=$(hostname) $ echo "${var%-*}"