我正在尝试读取包含这样的行的文件:
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'
,第三个示例未正确存储文件夹名称{。}}。
答案 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
通常会说有风险使用。