파일 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 $var
File1
File1
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