我一直在寻找半小时徒劳!
这看起来很简单:
#!/bin/bash
#test.sh
echo "$0 $@">>my.log
运行命令:
test.sh -a -b 'abc -c 123'
test.sh -a -b "abc -c 123"
输出:
cat my.log
test.sh -a -b abc -c 123
test.sh -a -b abc -c 123
预期产出:
cat my.log
test.sh -a -b 'abc -c 123'
test.sh -a -b "abc -c 123"
注意预期输出中的单引号。
如何获得预期输出,是否必须手动输入引号?
目的是:我想记录如何调用脚本以便稍后追溯我的工作方式。所以日志行必须保持命令的调用方式,我可以复制粘贴并再次运行它。
经过多次搜索和试验,所有带引号的技巧都会逃脱,并且printf无法正常工作。像其他人提到的那样,这似乎是Bash在解析参数中的内置行为,它剥离了引号。我只是想知道是否有可能从bash history
中选择一行,它准确记录了如何调用命令。
答案 0 :(得分:1)
只需引用您发送的参数:
$ ./a "-a -b 'abc -c 123'"
$ ./a '-a -b "abc -c 123"'
输出是......
$ cat my.log
./a -a -b 'abc -c 123'
./a -a -b "abc -c 123"
答案 1 :(得分:1)
这不能得到确切的(报价引用)输出以匹配您的输入,但我相信它确实可以获得功能相同的输出。
$ cat test.sh
#!/bin/bash
printf -- '%q' "$0"; printf -- ' %q' "$@"; echo
$ ./test.sh -a -b 'abc -c 123'
./test.sh -a -b abc\ -c\ 123
$ ./test.sh '-a 555' "-b 6 7 8" abc\ -c\ 123
./test.sh -a\ 555 -b\ 6\ 7\ 8 abc\ -c\ 123
我相信这是你能得到的最接近你想要的东西。当脚本看到参数时,原始引号(或转义)就消失了。 无法完全重现它们。
答案 2 :(得分:0)
如果你想要脚本中的引号,你也可以使用反斜杠转义引号。
test.sh -a -b \'abc -c 123\'
test.sh -a -b \"abc -c 123\"
答案 3 :(得分:0)
迭代他们:
#!/bin/bash
echo -n "$0 "
for arg in "$@"; do echo -n "'$arg' "; done
echo
这会让你:
./test.sh '-a' '-b' 'abc -c 123'
for
./test.sh -a -b 'abc -c 123'
这很简单,但不会处理带有单引号的参数(例如"don't"
),但它会处理这些空格,包括可执行文件名称中的空格。
您无法获得原始引号。它们不会发送到目标脚本。该信息在调用期间是最后一次。发送的是bash解释的参数(在扩展globs和转义序列之后)。引用你必须自己做 - 单引号处理最常见的情况。
答案 4 :(得分:0)
除此之外不要了解其他方式:
test.sh -a -b \'abc -c 123\'
test.sh -a -b \"abc -c 123\"