bash 쉘 스크립트에서 문자열 값을 반복하는 for 루프 작성


24

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"하고 두 번째 반복에서는 fnamefname="b.txt"등을 가져야합니다 . 불행히도 위의 구문이 정확하지 않은 것 같습니다. 출력을 얻고 싶습니다.

a.txt

b.txt

c.txt

그러나 위의 코드를 시도하면이 출력을 얻습니다.

{a.txt,

b.txt,

c.txt}

변수의 값 / 내용을 반복적으로 변경할 수 있도록 올바른 구문을 결정하도록 도와 줄 수 fname있습니까? 시간 내 주셔서 감사합니다.


5
를 제거하면 {}공백으로 구분 된 목록을 반복 할 필요가 없습니다.
Mat

3
수단 @Mat 제거 {} 하고, 들. 대안은 공백을 제거하는 것입니다. 그래서 "a.txt" "b.txt" "c.txt"또는 {"a.txt","b.txt","c.txt"}. 그러나 나는 {a..c}.txt대신 선호 합니다.
manatwork

답변:


39

올바른 구문은 다음과 같습니다.

#!/bin/bash

for fname in a.txt b.txt c.txt
do
  echo $fname
done

9
또한 이름의 배열을 가정 fnames=( a.txt b.txt c.txt )하면 구문을 사용할 수 있습니다 for f in ${fnames[@]}; do echo $f; done.

1
사실 for fname in a.txt b.txt c.txt이며 for fname in "a.txt" "b.txt" "c.txt"동일한 결과를 산출합니까?
앤드류

앤드류, 맞아 그들은 같은 결과를 낼 것이다
Ali Gangji

1
물론 값에 공백이 포함되어 있으면 for f in "${fnames[@]}"; do echo $f; done(따옴표 주위에 ${fnames[@]})를 사용해야합니다 fnames. "$f"특히보다 정교한 작업을 수행하는 경우 echo(예 : cat또는 cp) 를 사용해야합니다 . (그리고 단지 당신이하고있는 경우에도 대신에 echo사용해야 printf합니다.)
Scott

@ user13742도 답변에 언급되어야한다고 생각합니다.
Fallenreaper

1

당신이해야 할 것 같아요 ...

printf %s.txt\\n a b c

나는 OP가 끝나기 전에 메아리 이외의 다른 일을 염두에두고 있었지만 이것을 좋아합니다.
Geek

0

주석 에서 user13742가 언급했듯이 다음 bashksh같이 배열을 사용할 수 있습니다 .

#!/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/shon Ubuntu) 와 같은 일부 쉘 은 배열을 지원하지 않습니다. 이 경우 여기 문서 구조를 사용하는 것이 좋습니다.<<

#!/bin/sh

while IFS= read -r line
do
    echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.