在分区磁盘的bash脚本中出现错误

问题描述:

当我执行bash脚本(**。/ partion.sh:line 11:$'n \ np \ n1 \ n \ nw \ n':command没有找到 **):在分区磁盘的bash脚本中出现错误

./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 

我还是个新手,所以真的很感谢所有帮助我能=)

+0

那些是什么命令''N''p''1' w'?你到底想要达到什么目标?你想打印这些信件吗? –

+1

[本文](http://xmodulo.com/how-to-run-fdisk-in-non-interactive-batch-mode.html)显示了如何以非交互方式使用'sfdisk'。这可能是一个更好的方法来完成这件事。 –

+0

@VikasTiwari用于分区磁盘的命令 – Niknak

的换行终止命令。如果您想将多行参数传递给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 

第三种选择是使用定界符:

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

w 
EOF 
done 
+0

现在,我得到这个错误: **旧局面: 第1行:不支持的命令 >>> 新情况: 离开。** – Niknak

+0

他们都没有工作,仍然收到如上所述的错误xD 请感谢您的帮助,虽然= D – Niknak

我觉得应该是:

#!/bin/bash 

hdd="/dev/sdd" 

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

w 
"|sfdisk $i;done 

多行回声应该从同一行开始。否则,下一行被视为自己的命令。

在命令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命令一般较少,因为它需要实际的块数,但更容易使用(和别人读你的脚本来理解),因为你并不想通过echo命令来远程控制交互式程序。

如果你打算从外壳到远程控制的互动节目,我建议考虑expect而不是做盲目echo秒。

此外,一般来说,如果您尝试打印多行数据,则echo可能不适用。随着线这短短的,我会达到printf

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

但更普遍有用的工具是这里的文档:

fdisk "$i" <<EOF 
n 
p 
l 


w 
EOF