변수의 작은따옴표를 공백으로 구분된 문자열로 바꿉니다.

변수의 작은따옴표를 공백으로 구분된 문자열로 바꿉니다.

read다음 두 문자열을 통해 변수를 읽는 bash 스크립트를 작성 중입니다.

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 프로그램은 명령줄을 하나의 문자열로 가져오는 것이 아니라 여러 매개변수 문자열을 가져옵니다. 명령줄을 문자열로 분할하는 것이 쉘입니다.

Bash에서 여러 값을 사용 하려면 배열을 사용한 다음 명령에 전달하면 read됩니다 .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 문자( )가 포함되어 있지 않으면 *?[]문제가 없습니다. 그러나 일반적으로 말하면 이는 원하는 작업이 아닙니다.

"${array[@]}"적절한 배열의 경우 항상 대신 사용하고 싶을 것입니다 [*].

바라보다:분사,공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?그리고정렬

관련 정보