试图在文件中设置以下内容:
cat < /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如何防止这种情况发生?
发布于 2020-10-26 18:41:24
您需要引用您选择的单词作为此处文档的标签,以防止其内容被扩展:例如,<<'EOF'而不是<。
引用手册:
这里文档的格式是:<\newline,必须使用“\”引用字符“\”、“$”和“`”。
由于代码中没有引用EOF (来自cat <),所以在运行cat时将执行D12文档中的所有扩展。然而,此时这里的文档本身没有被执行,因此没有完成对disks的赋值,并且disks被扩展到这里文档被处理之前的值:
$ unset disks
$ disks=foo
$ cat < disks=bar
> echo "$disks"
> EOF
disks=bar
echo "foo"https://unix.stackexchange.com/questions/616500
复制相似问题