이 문서에 변수 확장이 포함된 코드를 포함하는 방법

이 문서에 변수 확장이 포함된 코드를 포함하는 방법

파일에서 다음을 찾아보세요.

cat <<EOF > /etc/somefile.name
disks=($(lsblk | grep disk | cut -d " " -f 1 | grep -v │))

for i in "${!disks[@]}"; do
  echo 1024 > /sys/block/${disks[$i]}/queue/nr_requests
  echo 1024 > /sys/block/${disks[$i]}/queue/read_ahead_kb
  blockdev --setra 8192 /dev/${disks[$i]}
done
EOF

완료되면 ${!disks[@]}합계가 ${disks[$i]}빈 값으로 변환됩니다.

for i in ""; do
  echo 1024 > /sys/block//queue/nr_requests
  echo 1024 > /sys/block//queue/read_ahead_kb
  blockdev --setra 8192 /dev/
done

그것을 방지하는 방법?

답변1

콘텐츠가 확장되는 것을 방지하려면 여기에서 문서 레이블로 선택한 단어를 인용해야 합니다. 예를 들어 <<'EOF'대신 <<EOF.

인용하다수동:

이 문서의 형식은 다음과 같습니다.

[n]<<[-]word
       here-document
delimiter

[...] 어떤 부분이라도단어인용됐으니 그럼구분 기호따옴표를 제거한 결과입니다.단어, 여기 문서의 줄은 확장되지 않습니다. 만약에단어따옴표가 없으면 이 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 거치며 \newline문자 순서는 무시되며 ' ', ' ' 및 ' ' 문자 \는 ' ' 를 사용하여 인용해야 합니다 .\$`

EOF(from cat <<EOF)은 코드에서 인용되지 않았 으므로 여기 문서의 모든 확장은 cat런타임에 실행됩니다. 그러나 이때 문서 자체는 그렇지 않습니다.처형된이므로 disks할당되지 않지만 disks여기에서 문서를 처리하기 전의 값으로 확장됩니다.

$ unset disks
$ disks=foo
$ cat <<EOF
> disks=bar
> echo "$disks"
> EOF
disks=bar
echo "foo"

관련 정보