echo가 병합되는 다른 텍스트보다 먼저 문자열 변수를 인쇄하는 이유는 무엇입니까?

echo가 병합되는 다른 텍스트보다 먼저 문자열 변수를 인쇄하는 이유는 무엇입니까?

라텍스 파일을 만들기 위한 bash 코드가 있습니다. 이 코드 조각에서는 루프로 테이블을 만들고 싶습니다.

  while IFS= read -r line; do
    if [[ "$line" == *"comment"* ]]; then
      
      echo "${line#*comment: }" >> tif_list.txt
      
      IN="${line#*comment: }"
      
      data="$(echo $IN | tr "," "\n")"
      
      echo "       ${data[0]}" >> table.tex #name
      echo "     & ${data[2]}" >> table.tex #longitude
      echo "     & ${data[3]}" >> table.tex #latitude
      echo "     & ${data[4]}, ${data[5]}, ${data[6]}, ${data[7]}, ${data[8]}, ${data[9]}, " >> table.tex #dimensions
      echo "     & ${data[10]}" >> table.tex #time
      echo "     & ${data[1]}" >> table.tex #comments
      echo "     & \includegraphics[width=3.5cm]{${tif%.*}.png}\\" >> table.tex #adress
      echo "    \hline" >> table.tex
      echo "" >> table.tex
      
    fi    
  done < tif_info.txt
  
done

하지만 echo는 변수를 먼저 인쇄한 다음 추가된 텍스트를 인쇄합니다.

     \hline
       Target0001
The operator places target notes here. Multiple lines OK.
55:51.6217 N
020:34.4421 E
C1
L3.0
W0.8
H1-1.0
H2-1.0
D16.8
2021:11:13 08:29:02.37
     & 
     & 
     & , , , , , , 
     & 
     & 
     & \includegraphics[width=3.5cm]{Target0001.png}\
    \hline

제 생각에는:

     \hline
     Target0001
     & The operator places target notes here. Multiple lines OK.
     & 55:51.6217 N
     & 020:34.4421 E
     & C1, L3.0, W0.8, H1-1.0, H2-1.0, D16.8 
     & 2021:11:13 08:29:02.37
     & \includegraphics[width=3.5cm]{Target0001.png}\
    \hline

/&를 추가하거나 +=를 통해 텍스트를 병합하려고 시도했지만 아무 것도 변경되지 않습니다. TIFF 이미지의 이미지와 메타데이터가 포함된 테이블을 가질 수 있도록 작동하게 하면 됩니다.

내 전체 코드:

#!/bin/bash

#program pobiera metadane tiff i zestawia w tabeli

echo "Starting..."

echo "\documentclass{article}" > table.tex
echo "\usepackage{graphicx, tabularx}" >> table.tex
echo "\usepackage[margin=0.5in]{geometry}" >> table.tex
echo "\graphicspath{ {./images/} }" >> table.tex
echo "" >> table.tex
echo "\renewcommand\tabularxcolumn[1]{m{#1}}" >> table.tex
echo "\newcolumntype{b}{X}" >> table.tex
echo "\newcolumntype{s}{>{\hsize=.5\hsize}X}" >> table.tex
echo "" >> table.tex
echo "\begin{document}" >> table.tex
echo "" >> table.tex
echo "\begin{table}[htbp]" >> table.tex
echo "    \centering" >> table.tex
echo "    \begin{tabularx}{\textwidth} { " >> table.tex
echo "      | >{\centering\arraybackslash}s " >> table.tex
echo "      | >{\centering\arraybackslash}s " >> table.tex
echo "      | >{\centering\arraybackslash}s " >> table.tex
echo "      | >{\centering\arraybackslash}s " >> table.tex
echo "      | >{\centering\arraybackslash}s " >> table.tex
echo "      | >{\centering\arraybackslash}b " >> table.tex
echo "      | >{\centering\arraybackslash}b | }" >> table.tex
echo "     \hline" >> table.tex
echo "     name & longitude & latitude & dimensions & time & comments & picture \\" >> table.tex
echo "     \hline" >> table.tex

echo "Serching comment..."

for tif in *.tif; do
  [ -f "$tif" ] || break
  identify -verbose "$tif" > tif_info.txt 2>&1
  
  #convert "$tif" "${tif%.*}.png" 2>&1

  while IFS= read -r line; do
    if [[ "$line" == *"comment"* ]]; then
      
      echo "${line#*comment: }" >> tif_list.txt
      
      IN="${line#*comment: }"
      
      data="$(echo $IN | tr "," "\n")"
      
      echo "       ${data[0]}" >> table.tex #name
      echo "     & ${data[2]}" >> table.tex #longitude
      echo "     & ${data[3]}" >> table.tex #latitude
      echo "     & ${data[4]}, ${data[5]}, ${data[6]}, ${data[7]}, ${data[8]}, ${data[9]}, " >> table.tex #dimensions
      echo "     & ${data[10]}" >> table.tex #time
      echo "     & ${data[1]}" >> table.tex #comments
      echo "     & \includegraphics[width=3.5cm]{${tif%.*}.png}\\" >> table.tex #adress
      echo "    \hline" >> table.tex
      echo "" >> table.tex
      
    fi    
  done < tif_info.txt
  
done

echo "    \hline" >> table.tex
echo "    \end{tabularx}" >> table.tex
echo "\end{table}" >> table.tex
echo "" >> table.tex
echo "\end{document}" >> table.tex
echo "" >> table.tex

echo "Process completed."

답변1

data="$(echo $IN | tr "," "\n")"

이는 스칼라 할당이므로 스칼라 변수를 얻습니다. 여기에는 여러 줄 문자열이 포함됩니다. ( 로 확인할 수 있습니다 declare -p data.) Bash에서는 $var변수 유형에 상관없이 동일한 요소에 접근할 수 있습니다. 배열인 경우 ${var[0]}인덱스의 값이고, 스칼라인 경우 개별 값입니다.0

대신 사용하고 싶을 수도 있습니다 read -a.

IN=foo,bar,doo
IFS=, read -r -a data  <<< "$IN"
echo "${#data[@]}" "${data[1]}"   # prints '3 bar'

귀하가 연결한 stackexchange 질문에는 다음이 있습니다.

mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do ...

$mails루프에서 인용되지 않은 확장은 for내용을 공백(또는 IFS포함된 모든 항목이지만 기본적으로 공백임)으로 분할합니다. 지금일하다, 마찬가지로 결과를 배열에 할당할 수 있습니다 arr=($mails). 하지만그것은 갈라질 것이다어느공백,그리고파일 이름 패턴을 처리하므로 foo bar및 같은 값은 *번거로울 것입니다. 예를 들어 참조하십시오. http://mywiki.wooledge.org/WordSplitting그리고언제 큰따옴표가 필요합니까?

read -a가장 좋은 대답은 위에 쓴 것과 같습니다. -r백슬래시를 엉망으로 만드는 것을 방지하기 위해 이것을 원합니다 .

관련 정보