BASE_DIR_APP_CONN="/opt/"
CMD_CONFIG_SNAPSHOT_DIR_APP_CONN="ls -ltrh $BASE_DIR_APP_CONN/local/ | awk '{print $NF}' | tail -n +2 | xargs"
echo $CMD_CONFIG_SNAPSHOT_DIR_APP_CONN
for dir in $($CMD_CONFIG_SNAPSHOT_DIR_APP_CONN)
do
echo "$dir"
done
为什么这会引发以下错误:
ls: cannot access |: No such file or directory
ls: cannot access awk: No such file or directory
ls: cannot access '{print: No such file or directory
ls: cannot access $NF}': No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access tail: No such file or directory
ls: cannot access +2: No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access xargs: No such file or directory
/opt/local/:
.....
当我直接使用命令运行 for 循环时,它按预期工作。 有人可以帮忙吗? 谢谢!
将字符串拆分为单独的命令(即通过|
、;
等分解片段)是在参数扩展之前完成的。因此
foo | bar
foo
和bar
运行,通过管道连接。然而
nonsense="foo | bar"
$nonsense
使用两个参数|
和bar
调用命令foo
。为了运行存储在变量中的管道,我必须编写类似的东西
eval "$nonsense"
但总的来说,这是一个坏主意,尤其是因为你迟早会遇到引用和空格问题的麻烦(如果你用字符串尝试过这个,你会看到)。
在您的情况下,我会使用一个函数,例如:
CMD_CONFIG_SNAPSHOT_DIR_APP_CONN() {
ls -ltrh $BASE_DIR_APP_CONN/local/ | awk '{print $NF}' | tail -n +2 | xargs
}
并将其称为
for dir in $(CMD_CONFIG_SNAPSHOT_DIR_APP_CONN)
当然,这仍然存在几个问题,例如解析ls
的输出并将其管道化awk
(如果目录条目包含空格字符,这将中断),但这不是您问题的主题,所以我就这样离开了。