2014-01-20 11 views
0

我有以下bash腳本,我一直在尋找生成一個示例fio交通模擬命令。在腳本中,我採用CWD,然後查找具有特定文件名的設備。然後,我將這些帶有相應參數的文件名追加到要運行的命令上,但是當我運行該命令時,所有參數都用單引號引起來。 我想要什麼,需要的是Bash單引號出自沒有的地方。我如何擺脫它們?

 

fio --ioengine=libaio --rw=randrw --iodepth=512 --size=10GB --name="output0" --filename="/dev/mapper/mpathfu" --name="output1" --filename="/dev/mapper/mpathfua" --name="output2" --filename="/dev/mapper/mpathfub" --name="output3" --filename="/dev/mapper/mpathfuc" 
 

相反,我所得到的是...(請帶的不是單引號)。

 

+ fio --ioengine=libaio --rw=randrw --iodepth=512 --size=10GB '--name="output0"' '--filename="/dev/mapper/mpathfu"' '--name="output1"' '--filename="/dev/mapper/mpathfua"' '--name="output2"' '--filename="/dev/mapper/mpathfub"' '--name="output3"' '--filename="/dev/mapper/mpathfuc"' 
 

這是劇本,我已經試過大量的組合所以我很抱歉,如果腳本中存在一點混亂的話。沒有什麼我嘗試會工作。我如何編寫腳本而不必處理單引號?

 

#fio --ioengine=libaio --rw=randrw --iodepth=512 --size=1800GB --rw=randrw --name="output1" --filename="/dev/mapper/mpathco" 
cwd=$(pwd) 
x=($(ls -1 ./ | grep -i mpath)) 
s=" " 
#echo ${x[@]} 
len=${#x[@]} 
len=`expr $len - 1` 
#echo $len 
for i in `seq 0 $len`; do s=$s\ --name=\"output$i\"\ --filename=\"$cwd/${x[$i]}\"; done 
echo $s 
x=`echo $s` 
COMMAND=fio\ --ioengine=libaio\ --rw=randrw\ --iodepth=512\ --size=10GB\ $x 
echo "$COMMAND" 
$COMMAND 

回答

0

我得到了你需要什麼,你需要通過一個有兩個選項(--name和--filename),以FIO命令附加每個的mpath *文件中的一個,然後運行它。

#! /usr/bin/bash 

x=$(find $(pwd) -type f -iname "*mpath*" |awk '{printf " --name=\"output%d\" --filename=\"%s\" ", i++,$1}') 
COMMAND=" fio --ioengine=libaio --rw=randrw --iodepth=512 --size=10GB $x" 
echo "$COMMAND" 
$COMMAND 
+0

這正是我需要的,但我運行命令的時間,我得到 FIO --ioengine = libaio的--rw = randrw --iodepth = 512 --size = 10GB'--name =「output0」'--filename =「/ dev/mapper/mpathfu」' –

+0

PS你的代碼可能需要改變一點點.. #fio --ioengine = libaio --rw = randrw --iodepth = 512 --size = 1800GB --rw = randrw --name =「output1」--filename =「/ dev/mapper/mpathco」 cwd = $(pwd) x = $(find $(pwd)-iname「* mpath *」| awk'{printf'--name = \「output%d \」--filename = \「%s \」「,i ++,$ 1}') echo $ x COMMAND =「fio --ioengine = liba io --rw = randrw --iodepth = 512 --size = 10GB $ x「 echo」$ COMMAND「 $ COMMAND –

+0

我修復了一個問題,現在可以嘗試嗎? – BMW

3

您的問題不是單引號,實際上並不存在。 (它們出現在bash的跟蹤輸出,以顯示您的論點,因爲這些論點包括雙引號。他們不是的爭論實際上是一部分)。

實際的問題是雙引號,這應該是在論據中。其實,你不想要的:

fio --ioengine=libaio --rw=randrw --iodepth=512 --size=10GB \ 
    --name="output0" --filename="/dev/mapper/mpathfu" \ 
    --name="output1" --filename="/dev/mapper/mpathfua" \ 
    --name="output2" --filename="/dev/mapper/mpathfub" \ 
    --name="output3" --filename="/dev/mapper/mpathfuc" 

你想要的是在命令行中鍵入以上的結果。當你在bash提示符下輸入那行時,bash最終刪除雙引號。在上面的例子中,雙引號實際上完全沒有必要。如果文件名包含空格字符,它們將是必要的,在這種情況下,它們會用來指示bash包含的空格字符不是參數分隔符。但在任何情況下都不會傳遞給fio命令; bash總是從參數中刪除未加引號的引號字符。

實際來自bash參數(如$COMMAND)的引號字符不是未加引號的引號字符。因此它們不會被刪除,並且fio將嘗試使用文件名"/dev/mapper/mpathfunc",這是嘗試訪問當前工作目錄中的目錄"。當然,該目錄不存在,所以命令將失敗。

總之,它會工作了你寫的:

for i in `seq 0 $len`; do 
    s="$s --name=output$i --filename=$cwd/${x[$i]} 
done 

但只是因爲$cwd${x/[$i]}不包含空格。你真正應該做的是使蓄電池的陣列(如x):

COMMAND=(fio --ioengine=libaio --rw=randrw --iodepth=512 --size=10GB) 
len=$((${#x[@]} - 1)) 
for i in $(seq 0 $len); do 
    COMMAND+=(--name=output$i "--filename=$cwd/${x[$i]}") 
done 
"${COMMAND[@]}" 
+0

如果我的文件名包含空格怎麼辦? –

+0

@RustyWeber:數組方法將處理帶空格的文件名。 –

相關問題