Bash

Bash - 將數組作為字元串分配給變數

  • January 10, 2017

我有這段程式碼,它列印出正確的結果,但我不知道如何將最後一行的迴聲轉換為變數。

# 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[*]}"會 yield tech 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%-*}"

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