来自shell脚本的执行命令失败

时间:2016-04-18 21:33:12

标签: shell

我正在尝试读取包含这样的行的文件:

 Run COMMAND with options "OPTIONS" and arguments "ARGUMENTS"

然后我想用给定的选项和参数执行这个命令。例如,我想执行这些命令:

 Run pwd with options "" and arguments ""
 Run ls with options "-al" and arguments "$HOME"
 Run ls with options "-al" and arguments "Example: \"strange folder name\""

这是我的代码

#!/bin/bash

while read -r line
do
 COMMAND=$(echo "$line" | cut -d" " -f 2)
 OPTIONS=$(echo "$line" | cut -d" " -f 5 | tr -d '"')
 ARGUMENTS=$(echo "$line" | cut -d" " -f 8)

 $COMMAND $OPTIONS $ARGUMENTS
 done <$1

第一个示例正常工作,第二个示例错误ls: cannot access $HOME: No such file or directory',第三个示例未正确存储文件夹名称{。}}。

1 个答案:

答案 0 :(得分:1)

  

第二个是给我错误ls:无法访问$ HOME:没有这样的文件或目录&#39;

这是因为名为$HOME的文件夹不存在。我不是在谈论$HOME变量的值,而是字符串文字。在您的情况下,shell不会执行参数扩展。

  

第三个没有正确地将文件夹的名称存储到$ ARGUMENTS

这是因为-f 8仅提取第8列,尝试-f 8-提取第8列,并将所有其他列提取到行尾。

您可以尝试以下版本:

while read -r line; do
  COMMAND=$(printf "%s" "${line}" | cut -d" " -f 2)
  OPTIONS=$(printf "%s" "${line}" | cut -d" " -f 5 | tr -d '"')
  ARGUMENTS=$(printf "%s" "${line}" | cut -d" " -f 8-)
  $COMMAND $OPTIONS "$(eval printf \"%s\" "$ARGUMENTS")"
done < "${1}"

eval是一个shell内置命令,用于启用ARGUMENTS的参数扩展(如果适用)。

我必须警告你,eval通常会说有风险使用。