在分区磁盘的bash脚本中获取错误

问题描述 投票:0回答:3

我执行bash脚本时遇到此错误(**。/ partion.sh:第11行:$'n \ np \ n1 \ n \ nw \ n':命令未找到**):

./partion.sh: line 11: $'n\np\n1\n\nw\n': command not found
Checking that no-one is using this disk right now ... OK

Disk /dev/sdd: 3 GiB, 3221225472 bytes, 6291456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0ca4ca9d

Old situation:

>>>
New situation:

这是脚本:

#!/bin/bash

hdd="/dev/sdd"

for i in $hdd;do
echo 
"n
p
1

w
"|sfdisk $i;done

我仍然是一个新手,所以非常感谢我能得到的所有帮助=)

bash shell
3个回答
1
投票

我认为它应该是:

#!/bin/bash

hdd="/dev/sdd"

for i in $hdd;do
echo "n
p
1

w
"|sfdisk $i;done

多线回波应该从同一条线开始。否则,下一行将被视为一个命令。


1
投票

命令echo和告诉shell回显的字符串之间有一个额外的换行符,这就是导致错误消息的原因。

但是你也在向sfdisk发送交互式命令,这不是一个交互式工具。你的代码似乎是基于this article的顶部,@ GregTarsa在他的评论中链接了,但那是将这些命令发送到fdisk,而不是sfdisk。 (您还缺少lw fdisk命令之间的另一个换行符。)

sfdisk程序旨在获取所需分区布局的文本描述并将其应用于磁盘。它不希望输入单字母命令;它希望它的输入看起来像这样:

# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size=   497664, Id=83, bootable
/dev/sda2 : start=   501758, size=1953021954, Id= 5
/dev/sda3 : start=        0, size=        0, Id= 0
/dev/sda4 : start=        0, size=        0, Id= 0
/dev/sda5 : start=   501760, size=1953021952, Id=8e

哪个不如fdisk命令通用,因为它需要实际的块号,但更容易使用(以及阅读脚本的人可以理解),因为你没有尝试通过echoing命令远程控制交互式程序。

如果您要从shell远程控制交互式程序,我建议您查看expect而不是盲目的echos。

此外,一般情况下,如果您尝试打印多行数据,echo可能不是可行的方法。线条很短,我会到达printf

printf '%s\n' n p l "" "" w | fdisk "$i"

但更普遍有用的工具是here-document:

fdisk "$i" <<EOF
n
p
l


w
EOF

0
投票

换行符终止命令。如果要将多线参数传递给echo,则需要移动引号。例如:

for i in $hdd; do
    echo "n
p
1

w
" | sfdisk $i
done

写起来可能会更好看:

for i in $hdd; do printf 'n\np\n1\n\nw\n' | sfdisk $i; done

第三种选择是使用heredoc:

for i in $hdd; do
sfdisk $i << EOF
n
p
1

w
EOF
done
© www.soinside.com 2019 - 2024. All rights reserved.