bash에서는 for
일부 루프 제어 변수 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
있습니까? 시간 내 주셔서 감사합니다.
답변
올바른 구문은 다음과 같습니다.
#!/bin/bash
for fname in a.txt b.txt c.txt
do
echo $fname
done
답변
당신이해야 할 것 같아요 …
printf %s.txt\\n a b c
답변
주석 에서 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
on Ubuntu) 와 같은 일부 쉘 은 배열을 지원하지 않습니다. 이 경우 여기 문서 구조를 사용하는 것이 좋습니다.<<
#!/bin/sh
while IFS= read -r line
do
echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL