for 루프 내에서 bash 스크립트를 실행하고 for 루프에서 변수 값을 가져옵니다.

for 루프 내에서 bash 스크립트를 실행하고 for 루프에서 변수 값을 가져옵니다.

입력 파일을 가져와서 처리하고 출력 파일을 표시하는 bash 코드가 있습니다. 그러나 디렉터리에 있는 특정 확장자(.wfx)를 가진 모든 파일에서 코드가 실행되기를 원합니다. 1,2,3....100.wfx 파일(100개의 .wfx 파일)이 있고 한 번에 출력을 얻고 싶다고 가정해 보겠습니다. 원래 bash 스크립트(grep, awk 및 sed가 많이 제외됨)는 다음과 같습니다.

system_name="1"
wfxfile=${system_name}.wfx
.
.
.
echo "id1 id2 " > ${system_name}_energies.txt

위의 코드는 잘 작동하므로 변경하고 싶지 않습니다. 스크립트 이름은 extract_value.sh입니다. 입력 파일 이름으로 "system_name" 변수를 사용하여 for 루프를 사용할 수 있다면 목표를 달성할 수 있을 것이라고 생각했습니다. 그래서 스크립트를 거의 변경하지 않았습니다.

system_name="$i"
wfxfile=${system_name}.wfx

나는 다음과 같은 것을 시도하고 있습니다.

for i in *.wfx; do system_name="{$i}"; echo $system_name; ./extract_value.sh;done

내가 얻는 것은 이것이다

10_1.wfx
grep: .wfx: No such file or directory
10_2.wfx
grep: .wfx: No such file or directory
10.wfx
grep: .wfx: No such file or directory
11_1.wfx
grep: .wfx: No such file or directory
11_2.wfx
grep: .wfx: No such file or directory
1_1.wfx
grep: .wfx: No such file or directory
11.wfx
grep: .wfx: No such file or directory
12_1.wfx
grep: .wfx: No such file or directory
12_2.wfx
grep: .wfx: No such file or directory
1_2.wfx
grep: .wfx: No such file or directory

문제는 확실히 루프 내에서 변수를 잘못 사용한 것처럼 보입니다. 그러나 도움을 주시면 감사하겠습니다.

답변1

export실행 중인 셸 프로세스의 환경에서 볼 수 있도록 셸에서 변수를 얻거나 명령줄 인수로 전달해야 합니다 . 내보내지 않은 쉘 변수는 동일한 쉘 인스턴스 내에서만 표시됩니다.

예를 들어 mytest.sh는 다음과 같습니다.

#!/bin/sh
echo "cmdline arg: '$1', envvar: '$sysname'"

그런 다음:

for i in abc def ghi; do
    export sysname="$i"
    ./mytest.sh "$i"
done

내부 스크립트에 변수를 sysname="$1" ./mytest.sh전달하는 환경을 사용할 수도 있습니다.sysname아니요쉘에서 설정하십시오.

답변2

스크립트에 작은 변경 사항이 하나 있는데 다른 변경 사항을 제안해도 될까요?

줄 바꾸기

system_name="$i"

도착하다

system_name="$1"

그런 다음 루프를 수행하십시오.

for i in *.wfx; do
    [[ ! -f "${i}" ]] && break
    ./extract_value.sh "${i}"
done

검사는 -f해당 파일이 존재하지 않는 경우에 대한 것입니다. 쉘은 *.wfx문자 그대로 i를 설정합니다. 루프와 스크립트의 핵심 변경 사항은 파일 이름을 전달하고 이를 첫 번째 위치 인수로 받아들이는 것입니다.

관련 정보