문자열 목록을 통한 bash 루프


15

이 샘플을 포맷 할 수 있습니까?

for i in string1 string2 stringN
do
 echo $i
done

이와 비슷한 것으로 :

for i in 
string1
string2
stringN
do
 echo $i
done

편집 : - 쉬 혼란을 드려 죄송합니다, 실행중인 스크립트의 다른 방법이 있었다는 것을 몰랐 <scriptname>bash <scriptname>또한이 일을 내가 지금의 이름을 수 없습니다 - #!/bin/sh#!/bin/bash:)


해결하려는 문제는 무엇입니까?
jesse_b 2016 년

그것이 작동하는지 확인하기 위해 무엇을 시도 했습니까?
DopeGhoti 2016 년

1
@Jesse_b 문자열의 가독성 및 관리 성

@DopeGhoti 그래 내가 했어

@waayee :이 경우 배열이 가장 좋습니다. Glenn Jackman의 답변을 참조하십시오.
jesse_b 2016 년

답변:


34

bash에서 배열을 사용하면 가독성을 높일 수 있습니다.이 배열 구문은 단어 사이에 임의의 공백을 허용합니다.

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done

1
이것은 가장

1
@waayee, Bash에서 실행하지 않습니다. 그 기억 sh반드시 배쉬하지 않으며, 특히 데비안과 우분투에 없습니다.
ilkkachu 2018 년

1
@ilkkachu 이제 알겠다- "sh <scriptname>"이 아닌 "bash <scriptname>"을 실행해야합니다. :)

@waayee 또는 적절한 hashbang / shebang 행을 넣고 실행 파일처럼 실행하십시오. 필요한 독서 : shebang은 스크립트를 실행하는 쉘을 결정합니까?
ilkkachu

1
@rrrrr, 질문은 아마 답이 여기에 있습니다 : stackoverflow.com/q/12314451/7552
글렌 잭맨

4

백 슬래시로 줄 바꿈을 피할 수 있습니다.

$ for i in \
> hello \
> world
> do
> echo $i
> done
hello
world
$


1

zsh옵션으로 전환하는 경우 :

for string (
  string1
  'other string'
  etc..
) printf '%s\n' "$string"

1
list='a b c d'
for element in $list;do 
    echo "$element"
done

세미콜론이 없습니다!
41754

각 문자열이 별도의 단어 인 한 작동합니다. 문자열에 공백이 있으면 공백은 문자열을 여러 단어로 분리합니다. 또한 $list문자열에 파일 이름 globbing 문자 ( list='* * * *')가 포함 된 경우, 쉘은이를 일치하는 파일 이름으로 대체 할 수 있습니다.
Kusalananda

0

당신은 사용 loop가능한 명령을, 여기 과 같이 :

$ loop "echo $ITEM" --for string1,string2,string3

또는 파일 목록이있는 경우 :

$ cat file_list.txt | loop "echo $ITEM"

0

같은 것, 적은 텍스트 :

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done

string1등은 표시되는 리터럴 값이 아니며 자리 표시 자 이므로이 방법은 작동하지 않습니다.
Stephen Kitt

그렇다면 왜 귀찮게 array ( … )합니까? 그냥하세요 for i in string{1..7}; do echo "$i"; done; 짝수printf '%s\n' string{1..7}
αғsнιη
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.