簡體   English   中英

如何從另一個 shell 腳本的數組變量替換一個 shell 腳本的數組變量?

[英]How to replace an array variable of one shell script from another shell script's array variable?

我有兩個 shell 腳本, fruits_original.shappending_fruits.sh fruits_original.sh我有一個數組變量: fruits=('Apple' 'Mango' 'Guava')

我想要做的是我必須編寫一個 shell 腳本appending_fruits.sh ,它將接受一個參數,一些新的水果名稱是Orange ,並將 append 新水果名稱添加到fruits_original.sh水果數組變量中。

腳本運行之后,fruits 數組應僅保留為數組,其值應為fruits=('Apple' 'Mango' 'Guava' 'Orange')

文件fruits_original.sh有這個。 下面是appending_fruits.sh腳本,我的變量正在變成這個fruits= ('Apple' 'Mango' 'Guava' 'Orange') 但是當我試圖做echo "${fruits[@]}"我收到這個錯誤:

line 1: syntax error near unexpected token `('

運氣好的話?

fruits= ('Apple' 'Mango' 'Guava') 
echo "${fruits[@]}"
    declare -a var=$(awk -F'=' '/^fruits=/ {print $2}' fruits_original.sh)
    echo "${var[@]}"
    var[${#var[@]}]='Orange'
    joined=$(printf " '%s'" "${var[@]}")
    echo ${joined:1}
    echo "${joined[@]}"
    sed -i "s/fruits=.*/fruits= ($( echo ${joined:1})) /" fruits_original.sh

不要修改腳本文件。 相反,創建另一個文件並從中獲取動態數據。 我選擇了配置的位置在/tmp目錄中。

# fruits_original.sh
fruits=()
if [[ -e /tmp/fruits_original.rc ]]; then
        . /tmp/fruits_original.rc 
fi
some stuff

然后生成配置文件。 使用declare -p安全地 output 正確引用變量。

# appending_fruits.sh
fruits=()
if [[ -e /tmp/fruits_original.rc ]]; then
        . /tmp/fruits_original.rc 
fi   
fruits+=("new fruit")
decalre -p fruits > /tmp/fruits_original.rc

fruits_original.sh中放置一個 uuid 以識別您想要使用的代碼片段在哪里。

# fruits_original.sh

# snip 419d0df3-5f08-4511-ad5a-ad24db45aa6c
fruits=()
# snip 419d0df3-5f08-4511-ad5a-ad24db45aa6c

some stuff

然后用sed或其他工具提取相關部分,將declare "$part"為變量,append 正常捕獲 output 從declare -p中再次替換標記之間的內容。


如果采用上述任何方法,並且這只是一個測試某些東西的玩具示例,您可以:

# read the line from another script
declare "$(sed '/fruits=/!d' fruits_original.sh)"
# append element
fruits+=(Orange)
# create source-able output
new="$(declare -p fruits)"
# remove declare -- in front
new="fruits=${new%*fruits=}"
# Replace the line with declare -p output.
sed -i "s/fruits=.*/fruits=$new/" fruits_original.sh

筆記:

  • var[${#var[@]}]='Orange' - 只是var+=(Orange) 不需要${#
  • $( echo ${joined:1})是對echo的無用使用(除非您想要分詞和文件名擴展)。
  • 使用https://shellcheck.net檢查您的腳本
  • fruits= (不是一個賦值,將運行一個子shell,可能會導致語法錯誤。在=周圍的賦值中沒有空格。
  • declare -a var=$( - var不是一個數組(或者,它是一個只有一個元素的數組)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM