다른 파일의 변수 업데이트

다른 파일의 변수 업데이트

파일 1은

var=10

파일 2는

source File1

echo $var     #this displays 10 if I ran the shell. 

여기에 뭐가 있지? sed 명령에서 변수를 사용할 수 있기 때문에 sed를 작동시킬 수 없습니다.

$ sed -i ‘s/echo $var/var=$((var+10))/‘ File1`

나는 모든 다른 조합을 시도했습니다. 나는 이것이 나쁜 코드라는 것을 알고 있지만 그것을 설명할 더 좋은 이유가 없습니다.

source File1

echo $var # I want this to display 20

값에 10을 더할 수 있도록 File1을 File2에서 변경하고 싶습니다. File2 끝의 결과를 10에서 20으로 변경합니다.

나는 모든 솔루션에 열려 있습니다. 내 건강 등을 추적하는 Dungeons and Dragons용 캐릭터 시트를 만들려고 합니다.

답변1

명령 이 의 텍스트를 sed바꾸려고 시도 하지만 방금 표시된 줄에는 그러한 줄이 포함되어 있지 않습니다.echo $varFile1File1

File1한 줄의 내용으로 덮어쓰려면 var=20다음을 사용하세요.

echo 'var=20' >File1

한 줄을 사용하여 덮어쓰기 위해 변수 File1에 값을 할당 하려면 다음을 사용합니다.$((var + 10))var

printf 'var=%s\n' "$((var + 10))" >File1

또는

cat >File1 <<END
var=$((var + 10))
END

위의 마지막 예에서는 리디렉션된 양식을 사용하여 파일에 기록되기 전에 현재 셸에 의해 확장된 문서를 통해 작업하고 있습니다 cat.

마지막 두 변형에서는 변수 var에 이미 일부 (정수) 값이 있다고 가정합니다.


var문제를 설명하는 또 다른 방법은 양식의 값을 읽은 File1다음 간단히 값을 인쇄하고 10을 더하는 것입니다. 당신은 이것을 할 것입니다

#!/bin/sh

. ./File1
printf '%s\n' "$((var + 10))"

.명령은 다른 파일을 가져오는 표준 명령입니다. 이 source명령은 다른 일부 쉘에만 적용되지만 bash거의 동일하게 작동합니다.

var변수가 실제로 설정되었는지 테스트하고 그렇지 않으면 진단 메시지를 출력할 수도 있습니다 .

#!/bin/sh

. ./File1

if [ "${var+set}" = set ]; then
    printf '%s\n' "$((var + 10))"
else
    echo 'The variable "var" is not set' >&2
fi

D&D 문자 테이블에 더 많은 값이 포함되어 있고 이를 개별적으로 업데이트하려는 경우 테이블을 내 소스에 대한 쉘 파일로 유지하지 않을 것입니다. 대신 YAML 또는 TOML과 같은 것을 사용하여 통계를 저장한 다음 YAML 또는 TOML 파서를 사용합니다(예 yq:https://kislyuk.github.io/yq/) 이러한 통계를 읽고 업데이트합니다.

YAML의 문자 테이블:

characters:
  - name: Bard the cleric
    class: Cleric
    level: 45
    hp: 3
    backstory: >
      Bard was born in a small village
      east of the Great Lake.
      Etc.
  - name: Cleric the ranger
    class: Ranger
    level: 35
    hp: 5

그런 다음 일부 스크립트에서는

# Add 5 to "Cleric the ranger"'s hp (does in-place editing)
yq -y --in-place '.characters[] | select(.name == "Cleric the ranger").hp += 5' sheet.yml

풍부한 구조적 문서 형식을 제공하지 않는 위보다 간단한 변형은 셸 bash과 해당 declare -p기능을 사용하여 파일에 저장할 변수를 작성합니다.

#!/bin/bash

source ./character  # contains variables hp and name

printf 'HP = %s\n' "$hp"

# change hp and write back to file
hp=$(( hp + 10 ))

declare -p hp name >./character

실행 후 파일은 character다음과 같습니다.

declare -- hp="15"
declare -- name="Ranger the warrior"

(처음부터 그랬다면 hp). 5파일이 완전히 손상되었으므로 변경한 변수뿐만 아니라 모든 변수를 파일에 작성해야 합니다.

답변2

당신은 이것을 시도 할 수 있습니다sed

파일 1

$ cat file_1
var=10

파일 2

$ cat file_2
source file_1
sed -i "s/$var/$((var + 10))/" file_1
source file_1
echo "$var"

산출

$ ./file_2
20

$ cat file_1
var=20

관련 정보