입력 파일을 가져와서 처리하고 출력 파일을 표시하는 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를 설정합니다. 루프와 스크립트의 핵심 변경 사항은 파일 이름을 전달하고 이를 첫 번째 위치 인수로 받아들이는 것입니다.