2017-02-25 32 views
0

當我執行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

回答

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 

第三種選擇是使用定界符:

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

w 
EOF 
done 
+0

現在,我得到這個錯誤: **舊局面: 第1行:不支持的命令 >>> 新情況: 離開。** – Niknak

+0

他們都沒有工作,仍然收到如上所述的錯誤xD 請感謝您的幫助,雖然= D – Niknak

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命令一般較少,因爲它需要實際的塊數,但更容易使用(和別人讀你的腳本來理解),因爲你並不想通過echo命令來遠程控制交互式程序。

如果你打算從外殼到遠程控制的互動節目,我建議考慮expect而不是做盲目echo秒。

此外,一般來說,如果您嘗試打印多行數據,則echo可能不適用。隨着線這短短的,我會達到printf

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

但更普遍有用的工具是這裏的文檔:

fdisk "$i" <<EOF 
n 
p 
l 


w 
EOF