bash单语引用来自什么地方.我如何摆脱它们



我有以下我一直在寻找生成示例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

相关内容

  • 没有找到相关文章