В старых bash вам потребуется «переменная косвенность» (4-й абзац Расширение параметров оболочки ), что действительно уродливо для массивов:
myArray=('1' '2' '3' '4' '5')
myFunction() {
local arr="${1}[@]" # array expansion *as a string*
local values=( "${!arr}" ) # actual array expansion
echo "${values[@]}"
}
myFunction myArray
1 2 3 4 5
Обратите внимание, что это дает вам копию массива. Любые изменения, которые вы делаете в функции, не изменят myArray
во внешней области:
myFunc2_old () {
local arr="${1}[@]"
local values=( "${!arr}" ) # here's the copy
values[0]=foo
declare -p values
}
myFunc2_old myArray; declare -p myArray
declare -a values=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
declare -a myArray=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")
В отличие от namerefs
myFunc2_ref () {
local -n arr=$1
arr[0]=foo
declare -p arr
}
myFunc2_ref myArray; declare -p myArray
declare -n arr="myArray"
declare -a myArray=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
sed
— инструмент, ориентированный по линии -. Я считаю, что лучше было бы использовать awk
, так будет легче обнаружить тот блок, к которому вы хотите, и добавить строку. Может быть более элегантный способ, но он делает то, что вам нужно:
awk '$0=="REQUIRED_PACKAGES = [" {found=1}
found==1 && $0=="]" {print " \047test == 1.1.0\047"; found=0}
{print}' setup.py
Довольно просто понять :Он печатает каждую строку файла, но перед печатью закрывающей скобки блока REQUIRED_PACKAGES
печатает строку, которую вы хотите добавить.