Bash - 字符串,命令和转义(哦,我的!)

时间:2014-10-24 19:19:10

标签: bash shell

我现在正浪费这么多时间试图弄清楚这么简单的事情......

伪代码(几种语法混合,抱歉):

cmd1 = "find /my/starting/path -type f | grep -v -f /my/exclude/files"
cmd2 = " nl -ba -s'  ' "
cmd3 = " | xargs mv -t /move/here/dir " 

echo run_command_and_return_output($cmd1$cmd2)

$cmd1$cmd3  # just this now... 

# i don't actually want a function... but the name explains what i want to do
function run_command_and_return_output(){ /* magic */ }

这有效....

FIND=$(find $LOG_DIR -type f | grep -v -f $EXCLUDE | nl -ba -s'   ')

printf "%s\n" "$FIND"

这不......

NL="nl -ba -s'  '"
FIND=$(find $LOG_DIR -type f -mtime +$ARCH_AGE | grep -v -f $EXCLUDE | $NL)

printf "%s\n" "$FIND"

,这也不是......

NL='nl -ba -s'\''   '\'' '
但是,这确实有效:

find /my/starting/path -type f | grep -v -f /my/exclude/files |  nl -ba -s'  ' 

FIND=$(find $LOG_DIR -type f -mtime +$ARCH_AGE | grep -v -f $EXCLUDE | nl -ba -s'  ' )

1 个答案:

答案 0 :(得分:3)

简短形式:扩展$foo不加引号通过字符串拆分和glob扩展来运行内容,但语法解析。这意味着在不同的上下文中进行引用和转义的字符不会被视为语法,而只被视为数据。

如果你想通过语法分析来运行一个字符串,请使用eval - 但请注意这些注意事项,这些注意事项很大且对安全性有影响。

更好的方法是使用正确的工具 - 在shell数组中构建单独的简单命令(不是管道!),并使用函数作为构造复杂命令的可组合单元。 BashFAQ #50描述了这些工具 - 并深入讨论了哪些工具适用于何时。


更具体一点:

nl=( nl -ba -s'  ' )
find_output=$(find "$log_dir" -type f -mtime "+$arch_age" | grep -v -f "$exclude" | "${nl[@]}")
printf "%s\n" "$find_output"

...是正确的,因为它将简单命令nl跟踪为数组。