변수에서 공백으로 나눈 문자열의 작은따옴표 바꾸기

변수에서 공백으로 나눈 문자열의 작은따옴표 바꾸기

저는 다음 두 문자열을 통해 변수를 읽는 bash 스크립트를 작성하고 있습니다 read.

log.*.console.log log.*.log

공간으로 구분되어 있습니다.

스크립트에서 호출되는 다음 프로그램에 대한 변수의 출력이 이 형식으로 되는 문자열을 어떻게 다시 작성할 수 있습니까?'log.*.console.log' 'log.*.log'

나는 sed와 awk를 시도했지만 어떻게 든 성공하지 못했습니다.

전체 스크립트:

#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1

else

echo "some text"
read varlogname

i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")

for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0

답변1

나는 당신이 작은 따옴표를 gtar. 와 같은 명령에서 somecmd 'foo bar' 'files*.log'쉘은 따옴표를 처리하고 특수 문자를 특별히 처리하지 말라고 지시하며 somecmd인수 foo bar및 를 전달합니다 files*.log. Unix 프로그램은 명령줄을 하나의 문자열로 가져오는 것이 아니라 여러 인수 문자열로 가져옵니다. 명령줄을 문자열로 분할하는 것은 쉘입니다.

readBash에서 여러 값을 사용하려면 을 사용한 read -a array다음 배열을 명령에 전달할 수 있습니다.

  -a array  assign the words read to sequential indices of the array
            variable ARRAY, starting at zero

read -a filenames
gtar "${filenames[@]}"

(따옴표로 묶음) 을 사용하여 배열을 인덱싱하면 [@]원하는 대로 배열 구성원을 별도의 단어로 확장합니다.

또한 당신은 for file in ${GTAR[*]}. 이는 배열로 액세스하는 것처럼 보이지만 GTAR배열이 아닙니다. 명령의 출력을 gtar문자열로 할당했을 뿐입니다. 이 경우 ${GTAR[*]}와 동일합니다 $GTAR. 확장이 인용되지 않았기 때문에 문자열은 이 시점에서 단어 분할을 거치며 기본적으로 공백으로 분할됩니다. 그런데 그 이후에 하는 말은또한파일 이름 glob으로 가져와 일치하는 파일 이름으로 확장됩니다.

파일 이름에 공백이나 glob 문자( )가 포함되지 않는 한 *?[]괜찮습니다. 그러나 일반적으로 원하는 작업은 아닙니다.

"${array[@]}"적절한 배열 의 경우 항상 [*].

보다:단어 분할,쉘 스크립트가 공백이나 기타 특수 문자로 인해 막히는 이유는 무엇입니까?그리고배열

관련 정보