2014-07-09 2 views
0

나는 아주 오랫동안 bash 스크립트로 작업 해 오지 않았으므로 사소한 질문 인 경우 실례합니다.bash 스크립트에서 배열을 로 결합하십시오. 구분 기호로

bash 스크립트에 PID가 포함 된 배열이 있습니다. 나는 이것들과 \ | grep을 사용하여 배열의 PID 중 하나와 일치하는 항목을 검색 할 수 있습니다. 아래 그림과 같이 나는 기본적으로 IFS를 변경하려고하지만 발생하는 문제는 그 대신에 원하는 출력입니다 :

GREP_ARG='29126\|27435' 

내가이 내가

을 사용하고있는 코드가

GREP_ARG='29126\27435'. 

function join { 
    local IFS="$1"; shift; echo "$*"; 
} 

GREP_ARG=$(join '\|' "${PID_ARRAY[@]}") 

grep -A1 $GREP_ARG file 

나는 다양한 방법으로 입력을 변경하려고했지만 아무 것도 작동하지 않습니다. IFS 접근 방식이 불가능한가요?

답변

1

당신은 BASH에서

GREP_ARG=$(printf "\|%s" "${PID_ARRAY[@]}") 
GREP_ARG=${GREP_ARG:2} 
+0

이것은 작동합니다. 감사! – Oskar

+0

@ 오스카 오. 환영합니다. –

1

IFS는 단일 문자를 지원 할 수 있습니다. 그런 다음

function join { 
    d="$1" 
    shift 
    arr=("[email protected]") 
    last=${arr[${#arr[@]}-1]} 
    unset arr[${#arr[@]}-1] 
    printf -v str "%s$d" "${arr[@]}" 
    printf "%s%s" "$str" "$last" 
} 

로 전화 :

당신은 어떤 길이 구분 기호를 얻을이 join 기능을 사용할 수 있습니다

join '\|' 29126 27435 56789; echo 
29126\|27435\|56789 
0
function join { 
    echo -n "$2" 
    [[ $# -gt 2 ]] && printf "$1%s" "${@:3}" 
} 

서브 쉘을 필요로하지 않는 또 다른 버전 :

function join { 
    VAR=$1 SEP=$2 
    local __A=$3 __B 
    printf -v __B "${SEP}%s" "${@:4}" 
    printf -v "$VAR" '%s' "$__A$__B" 
} 

join GREP_ARG '\|' "${PID_ARRAY[@]}" 

ff 그 GREP_ARG에서 eval을 할 것입니다. eval을 사용하여 이러한 인수를 안전하게 수행하는 방법을 실제로 알지 못하는 경우 재귀 파이핑 함수를 사용하는 것이 더 나은 방법 일 수 있지만 이미 주제와는 다른 컨텍스트입니다. 그러나 similar topic을 참조 할 수 있습니다.

+1

약간의 설명과 함께 할 수 있습니다. –

+0

@TomZych 구문 함수는 이미 [Bash Manual] (http://www.gnu.org/software/bash/manual/bashref.html)에서 잘 설명되어 있습니다. 세부 사항을 추가하면 도움이 될 수 있지만 여전히 선택 사항입니다. 또한 자신이 그것을 이해하려고 시도하면 Op에게 상당히 도움이 될 것입니다. – konsolebox

관련 문제