for
Bash에서는 일부 루프 제어 변수가 i
지정된 정수를 반복하는 루프를 작성하는 것이 가능하다는 것을 알고 있습니다 . 예를 들어, 1에서 10 사이의 정수를 인쇄하는 bash 쉘 스크립트를 작성할 수 있습니다.
#!/bin/bash
for i in {1..10}
do
echo $i
done
문자열 목록을 제공하면 문자열인 루프 제어 변수를 반복할 수 있습니까? 예를 들어, fname
파일 이름을 나타내는 문자열이 있다고 가정해 보겠습니다 . 각 파일 이름에 대해 일련의 명령을 호출하고 싶습니다. 예를 들어 다음과 같은 내용을 인쇄하고 싶을 수 있습니다 fname
.
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
즉, 첫 번째 반복에서는 fname
값이 있어야 하고 fname="a.txt"
, 두 번째 반복에서는 fname
값이 있어야 하는 fname="b.txt"
식입니다. 불행하게도 위의 구문은 올바르지 않은 것 같습니다. 출력을 얻고 싶습니다.
a.txt
b.txt
c.txt
그러나 위의 코드를 시도하면 다음과 같은 결과가 나타납니다.
{a.txt,
b.txt,
c.txt}
변수의 값/내용을 반복적으로 변경할 수 있도록 올바른 구문을 결정하는 데 도움을 줄 수 있습니까 fname
? 시간 내 주셔서 감사합니다.
답변1
올바른 구문은 다음과 같습니다.
#!/bin/bash
for fname in a.txt b.txt c.txt
do
echo $fname
done
답변2
제 생각에는 이렇게 하셔야 할 것 같아요...
printf %s.txt\\n a b c
답변3
user13742가 언급했듯이논평bash
, 합계로 배열을 사용할 수 있습니다 ksh
.
#!/usr/bin/env bash
files_list=( "a.txt" "b.txt" "c and space.txt" )
for i in "${files_list[@]}"
do
echo "$i"
# do something else here,maybe
done
다음과 같이 작동합니다.
$ ./iterate_files_array.sh
a.txt
b.txt
c and space.txt
그러나 일부 셸(예 dash
: /bin/sh
Ubuntu)은 어레이를 지원하지 않습니다. 이 경우 다음 문서 구조를 사용할 수 있습니다.<<
#!/bin/sh
while IFS= read -r line
do
echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL