Ubuntu 16.04
我想将原始命令回显到日志文件。我的日志文件应如下所示:
Mon 04/16/18 04-24-pm - Executing command: sudo /home/editini.sh "one" "two" "three" "four" "five" "six"
在满足拼写检查的同时完成此任务的最简单方法是什么。
#!/bin/bash
hello="${1}"
my="$2"
friend="$3"
are="$4"
you="$5"
safe="$6"
timeStamp="$(date '+%a %D %m-%S-%P')"
rm -rf report*; touch report.txt;
{
echo "$timeStamp - Executing command: sudo /home/editini.sh \"$hello\" \"$my\" \"$friend\" \"$are\" \"$you\" \"$safe\""
echo ""
echo "$timeStamp" - Executing command: sudo /home/editini.sh "$*"
echo "";
echo "$timeStamp" - Executing command: sudo /home/editini.sh \""$*"\"
echo "";
} > report.txt
cat report.txt
我不能使用第一行,因为我必须提前知道这些论点。
这就是我运行上述命令时控制台所说的内容。
root@me /home/scripts/vent-commands # sh one.sh one two three four five six
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh "one" "two" "three" "four" "five" "six"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh one two three four five six
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh "one two three four five six"
您可以在 Bash 4.4 及更高版本中使用扩展修饰符获得shell 引用的输出:
@Q
它使用单引号,而不是双引号,但它确保输出作为输入返回到执行您期望的 shell 中是有效的。下面是一个重要的示例,但如果您的日志格式需要双引号,则没有帮助。
有点令人困惑的是,for 在连续字符中
${@@Q}
使用了@
两种不同的含义:第一个@
表示参数数组,而第二个引入了一个修饰符,用于转换数组扩展的输出。Q
修饰符导致输出被引用。$@
扩展为每个元素单独转动,与 不同$*
,但在这种情况下可能无关紧要(尽管如果您的实际代码更复杂,则可能)。@Q
, andprintf %q
, 使用单引号,因为它们会抑制其他 shell 扩展 - 如果其中一个参数包含$
,`
,\
,"
或!
,则任何带有双引号的东西都会被怀疑。@Q
确保引用每个术语,即使它不一定需要它(虽然printf
不需要)。空格仍然得到正确处理。你可以把那个命令复制回去,不管输入多么不正常,它都会起作用。
这似乎有效:
经测试:
它不会引用“,因为(从测试中可以看出)”可以是输入的一部分。它使用 \ 代替。GNU Parallel 中的 shell 引用函数经过了广泛的测试,所以如果你能给它输入会被错误引用的输入,我会感到惊讶。
使用简单的循环
例如
会破坏它的一件事是,如果输入中有
"
一个