我执行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
我仍然是新手,所以非常感谢我能得到的所有帮助=)
答案 0 :(得分:1)
我认为应该是:
#!/bin/bash
hdd="/dev/sdd"
for i in $hdd;do
echo "n
p
1
w
"|sfdisk $i;done
多行回音应该从同一行开始。否则,下一行将被视为一个命令。
答案 1 :(得分:1)
命令echo
和您告诉shell回显的字符串之间有一个额外的换行符,这就是导致错误消息的原因。
但您也在向sfdisk
发送交互式命令,这不是一个交互式工具。您的代码似乎基于this article的顶部,@ GregTarsa在其评论中将其链接,但这是将这些命令发送到 fdisk ,而不是 sfdisk 。 (您还错过了l
和w
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
哪个不如{{1}}命令通用,因为它需要实际的块编号,但更容易使用(以及阅读脚本的人才能理解),因为您不是想要远程控制通过fdisk
命令对其进行交互式编程。
如果 要从shell远程控制交互式程序,我建议您查看expect
而不是盲目echo
。
此外,一般情况下,如果您尝试打印多行数据,echo
可能不是可行的方法。如果简短,我会找到echo
:
printf
但更普遍有用的工具是here-document:
printf '%s\n' n p l "" "" w | fdisk "$i"
答案 2 :(得分: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