此功能有效:
source foo.bash && foo -n "a b c.txt"
问题是,无论我尝试过什么,我都无法获得最后一行echo "$CMD"
(或echo $CMD
)来准确生成此输出:
cat -n "a b c.txt"
如何实现?
# foo.bash
function foo() {
local argv=("$@");
local OUT=`cat "${argv[@]}"`
local CMD=`echo cat "${argv[@]}"`
echo "--------------------------"
echo "$OUT"
echo "--------------------------"
echo "$CMD"
}
输出是:
cat -n a b c.txt
使用此命令:foo -n \"a b c.txt\"
它可以显示命令,但它通过反引号为执行提供错误。
文件"a b c.txt"
是一个有效的小型文本文件。
答案 0 :(得分:0)
你需要在作业中转义引号:
local CMD="cat \"${argv[@]}\""
此外,连接字符串不需要echo。
答案 1 :(得分:0)
在number of tokens in bash variable的帮助下,你走了,我找到了正确的解决方案。
我差点忘了为什么我们实际上需要引用一个参数,这是因为它有多个单词!
function foo() {
local argv=( "$@" );
local OUT=`cat "${argv[@]}"`
echo "--------------------------"
echo "$OUT"
echo "--------------------------"
local CMD="cat"
for word in "${argv[@]}"; do
words="${word//[^\ ]} "
if [[ ${#words} > 1 ]]; then
local CMD="$CMD \"${word}\""
else
local CMD="$CMD $word"
fi
done
echo "$CMD"
}
希望它有所帮助。