Bash单引号来自无处。我怎么摆脱他们?

时间:2014-01-20 22:26:07

标签: bash console

我有以下bash脚本,我一直在寻找生成示例fio流量模拟命令。在脚本中,我使用CWD,然后查找具有特定文件名的设备。然后我将这些带有相应参数的文件名附加到要运行的命令上,但是当我运行该命令时,所有参数都是单引号。 我想要和需要的是


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

3 个答案:

答案 0 :(得分: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[@]}"

答案 1 :(得分:1)

答案 2 :(得分:0)

我得到了你需要的东西,你需要将每个mpath *文件逐个附加两个选项(--name和--filename)到fio命令,然后运行它。

#! /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