この文書に変数拡張を含むコードを含める方法

この文書に変数拡張を含むコードを含める方法

ファイルで次を探します。

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"

おすすめ記事