function abc ()
{
echo "You typed exactly this: $1"
}
现在运行它:
myprompt$ abc abc\*
我得到了:
You typed exactly this: abc*
我正在编写一个函数,我需要捕获整个参数,包括反斜杠,以备将来使用。可以吗?我已经尝试了所有引号和'set'的组合,没有任何东西可以保留反斜杠。我知道我可以逃脱它,但是那个类型的参数与回显的参数不同。请注意,您可以通过“历史记录”完美地获得参数。如何在我的函数,反斜杠和星号以及所有内容中捕获它?
答案 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"
}
思考?这可以改善吗?