bash:在命令行中捕获'\ *'

时间:2011-12-02 02:39:04

标签: bash

function abc ()
{
   echo "You typed exactly this: $1"
}

现在运行它:

myprompt$ abc abc\*

我得到了:

You typed exactly this: abc*

我正在编写一个函数,我需要捕获整个参数,包括反斜杠,以备将来使用。可以吗?我已经尝试了所有引号和'set'的组合,没有任何东西可以保留反斜杠。我知道我可以逃脱它,但是那个类型的参数与回显的参数不同。请注意,您可以通过“历史记录”完美地获得参数。如何在我的函数,反斜杠和星号以及所有内容中捕获它?

4 个答案:

答案 0 :(得分:3)

shell将命令行上的\字符解释为转义字符,从后面的字符中删除任何特殊含义。为了在命令行中使用文字\,您需要说服shell忽略\的特殊含义,您可以通过在\之前放置myprompt$ abc abc\\\* 。像这样:

\

请注意,有三个\个字符。第一个告诉shell忽略下一个字符的特殊含义 - 这是第二个\。第三个*告诉shell忽略\的特殊含义。

说服shell不要将myprompt$ abc 'abc\*' 解释为转义字符的另一种方法是将您的参数放在单引号中。像这样:

{{1}}

答案 1 :(得分:2)

您无法完全按类型获取参数。 Bash会在您的功能看到它们之前对它们进行评估。你必须逃避或引用它。

abc abc\\*
abc 'abc\*'

答案 2 :(得分:1)

你总是可以采用霰弹枪和飞行方法并实现你自己的shell。 :)

或稍微调低一点,找到一个支持你想要的输入机制的shell。

请注意,您必须更改登录设置才能使用“verbatim-shell”。

答案 3 :(得分:1)

所有

看起来可以在函数中捕获精确的命令行。 我怀疑,“历史”给了我们一个方法:

function exact_line ()
{
str1=`history 1`
str2=($str1)
str3=
# This isn't very elegant, all I want to do is remove the 
# line count from the 'history' output. Tho this way I do
# have surplus spaces removed as well:
for ((i=1; ; i++))
do
    str3="$str3 ${str2[$i]}"
    if [ -z ${str2[$i]} ]; then break; fi
done
echo -e "Your exact command line was:\n\n$str3"
}

思考?这可以改善吗?