아래와 같이 Unix 쉘 변수가 있다고 가정합니다.
variable=abc,def,ghij
for 루프를 사용하여 모든 값 ( abc
, def
및 ghij
) 을 추출하고 각 값을 프로 시저에 전달 하고 싶습니다 .
스크립트는에서 쉼표로 구분 된 값의 임의 개수를 추출 할 수 있어야합니다 $variable
.
아래와 같이 Unix 쉘 변수가 있다고 가정합니다.
variable=abc,def,ghij
for 루프를 사용하여 모든 값 ( abc
, def
및 ghij
) 을 추출하고 각 값을 프로 시저에 전달 하고 싶습니다 .
스크립트는에서 쉼표로 구분 된 값의 임의 개수를 추출 할 수 있어야합니다 $variable
.
답변:
다음 스크립트를 사용하여 쉼표로만 구분되는 한 필드 수에 관계없이 변수를 동적으로 탐색 할 수 있습니다.
variable=abc,def,ghij
for i in $(echo $variable | sed "s/,/ /g")
do
# call your procedure/other scripts here below
echo "$i"
done
echo "$i"
위 의 호출 대신 for 루프 내부 do
와 done
내부에서 프로 시저를 호출 할 수 있습니다 proc "$i"
.
업데이트 : 변수 값에 공백이 없으면 위의 스 니펫이 작동합니다. 이러한 요구 사항이있는 경우 변경할 수있는 솔루션 중 하나를 사용한 IFS
다음 변수를 구문 분석하십시오.
도움이 되었기를 바랍니다.
$variable
공백 이 포함 된 경우 작동하지 않습니다 . 예를 들어 variable=a b,c,d
=> 3 (ab | c | d) 대신 4 줄 (a | b | c | d)을 인쇄합니다
"value
** 와 같은 새로운 따옴표가 추가되었습니다 . 제거 할 정규식이 있으면 업데이트 해 주시겠습니까? ..
IFS를 엉망으로 만들지
않음 외부 명령을 호출하지 않음
variable=abc,def,ghij
for i in ${variable//,/ }
do
# call your procedure/other scripts here below
echo "$i"
done
bash 문자열 조작 사용 http://www.tldp.org/LDP/abs/html/string-manipulation.html
IFS
!
$i
공백을 포함, 그들은 분할 수 있습니다 (그리고 그게로 전달 있다는 이유가 될 수있는 쉼표로 구분 된 공백으로 구분보다는)
for i in ${variable//,/$IFS} do; echo "$i"; done
다른 필드 구분자를 설정하면 for
루프를 직접 사용할 수 있습니다 .
IFS=","
for v in $variable
do
# things with "$v" ...
done
값을 배열에 저장 한 다음 Bash의 구분 기호에서 문자열을 분할하는 방법에 표시된대로 반복 할 수도 있습니다 . :
IFS=, read -ra values <<< "$variable"
for v in "${values[@]}"
do
# things with "$v"
done
$ variable="abc,def,ghij"
$ IFS=","
$ for v in $variable
> do
> echo "var is $v"
> done
var is abc
var is def
var is ghij
이 솔루션에서 쉼표로 구분 된 목록을 반복하고 각 항목에 대해 명령을 실행하는 방법에 대한보다 광범위한 접근 방식을 찾을 수 있습니다 .
두 번째 접근법의 예 :
$ IFS=, read -ra vals <<< "abc,def,ghij"
$ printf "%s\n" "${vals[@]}"
abc
def
ghij
$ for v in "${vals[@]}"; do echo "$v --"; done
abc --
def --
ghij --
while
배열을 읽고 다른 하나는 결과를 반복합니다.
IFS
그것은 예전대로 다시?
이거 한번 해봐.
#/bin/bash
testpid="abc,def,ghij"
count=`echo $testpid | grep -o ',' | wc -l` # this is not a good way
count=`expr $count + 1`
while [ $count -gt 0 ] ; do
echo $testpid | cut -d ',' -f $i
count=`expr $count - 1 `
done
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. 그 후 for 루프를 while 루프로 만듭니다. 당신은 그것을 얻을 수 있습니다.
IFS를 사용하지 않고 여전히 공간을 보존하는 또 다른 솔루션 :
$ var="a bc,def,ghij"
$ while read line; do echo line="$line"; done < <(echo "$var" | tr ',' '\n')
line=a bc
line=def
line=ghij
다음은 IFS를 변경하지 않고 사용자 지정 정규식 구분 기호를 사용할 수있는 순수한 bash 솔루션입니다.
loop_custom_delimited() {
local list=$1
local delimiter=$2
local item
if [[ $delimiter != ' ' ]]; then
list=$(echo $list | sed 's/ /'`echo -e "\010"`'/g' | sed -E "s/$delimiter/ /g")
fi
for item in $list; do
item=$(echo $item | sed 's/'`echo -e "\010"`'/ /g')
echo "$item"
done
}