POSIX Shell 反斜杠混淆

POSIX Shell backslash confusion

我正在尝试创建一个具有简单功能的 shell 脚本,但我似乎无法理解如何正确处理反斜杠。 我的功能之一如下所示:

#!/bin/sh

func() {
    cmd="$*"
    printf "%s\n" "$cmd"
    echo -e $cmd
}
func '%{NAME}\n'

这是我需要的正确输出:

%{NAME}\n
%{NAME}\n

现在的问题是,我无法使用 "echo -e",因为此脚本需要在 *nix 系统上 运行,其中 echo 命令没有“-e”标志(例如 HPUX),这也是我必须使用 sh 而不是 bash 的原因。因为我想让这个脚本尽可能可移植,所以我不会使用 tr/sed 或(甚至更糟的)脚本语言。

输入字符串的格式可以任意选择。我使用 %{NAME} 是有原因的,因为如果它只是常规字符,那么这样的事情会起作用:

#!/bin/sh

func() {
    cmd="$*"
    printf "%s\n" "$cmd"
    printf $cmd
    echo
}
func 'NAME\n'

不幸的是,这会因“%”等字符而中断:

%{NAME}\n
func.sh: line 6: printf: `{': invalid format character

如何才能(希望)仅通过使用 printf 获得所需的结果,在我看来,printf 是最便于使用的函数?

您可以在 printf 中使用 %b:

func() { cmd="$@"; printf "%s\n%b" "$cmd" "$cmd"; }

然后将其命名为:

func '%{NAME}\n\n'

这将打印:

%{NAME}\n\n
%{NAME}