我有以下我一直在寻找生成示例FIO流量仿真命令的BASH脚本。在脚本中,我使用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
您的问题不是单个引号,实际上不存在。(它们出现在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最终会删除双引号。在上面的示例中,双向实际上是完全不必要的。如果包含文件名,例如太空字符,在这种情况下,他们本来可以表明其中包含的空间字符不是参数分离器,那将是必要的。但是在任何情况下,它们都不会传递到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[@]}"
- 在Bash中,您可以使用数组将命令存储在变量中
- 您不应该解析
ls
输出。 - 使用
$(foo)
代替`foo`
。 - 使用更多引号™
我得到了您需要的东西,您需要将每个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