Bash: 각 배열 멤버 주변의 따옴표를 제거하는 기본 방법

Bash: 각 배열 멤버 주변의 따옴표를 제거하는 기본 방법

다른 스크립트에서 배열을 읽었습니다. " "일부 멤버가 비어 있으므로 배열은 모든 배열 멤버를 배치해야 합니다.

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]}
done

문제는 각 출력 줄 주위에 따옴표가 있는데 이를 제거하고 싶다는 것입니다.

"red"
"blue"
"green"
""
"white"
"black"

다음으로 변경해야 합니다.

red
blue
green

white
black

이나 다른 파이프라인 기반 방법을 사용하지 않는 방법을 찾고 있습니다 awk. 괄호 사용, 다른 구두점 사용 등 기본 방식을 사용하여 문제를 해결하고 싶습니다.trsed

답변1

이것은 효과가 있을 수 있습니다:

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]//\"/}
done

인용하다:http://www.tldp.org/LDP/abs/html/refcards.html#AEN22828

답변2

readdata.sh추가 따옴표 없이 개행으로 구분된 데이터를 생성하면 프로그램이 더욱 단순해지고 강력해집니다.

현재 프로그램에서 의 출력은 readdata.sh공백으로 분할됩니다(예를 들어 "a b"결과는 두 개의 배열 요소 "a및 입니다 b"). 각 결과 단어는 와일드카드 패턴으로 해석됩니다(예를 들어 "a * b"결과는 "a현재 디렉터리의 파일 이름입니다). 그리고 마지막으로 b"). 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?자세한 내용은.

Bash는 개행으로 구분된 데이터를 읽는 매우 간단한 방법을 제공합니다.mapfile내장. bash는 서브셸에서 파이프의 오른쪽을 실행하므로 단순히 작성할 수 없으며 ./readdata.sh 0 "$in_file" | mapfile -t vector변수 사용을 명령 블록에 넣어야 하거나 프로세스 대체를 사용할 수 있습니다.

in_file=./data
mapfile -t vector < <(./readdata.sh 0 "$in_file")
for index in "${!vector[@]}"
do
  echo "$index: ${vector[index]}"
done

인덱스를 사용하지 않고 요소만 사용하는 경우 배열을 반복하는 더 쉬운 방법은 다음과 같습니다.

for element in "${vector[@]}"
do
  echo "$element"
done

답변3

안감은 싱글라이닝을 선호하시므로,

vector=("${vector[@]//\"/}")

텍스트 대체는 전체 배열에 적용될 수 있다는 점을 기억하세요.

답변4

"해킹된" 검색 및 교체 솔루션을 피하려면 eval다음을 사용하는 것이 좋습니다.

vector=( $(eval echo ${vector[@]}) )

이로 인해 쉘은 이를 인용된 인수로 해석하여 echo인용문을 제거합니다. 물론 위의 줄은 여전히 ​​공백 문제가 있지만 여기서 핵심은 를 사용한다는 것입니다 eval.

관련 정보