AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 438210
Accepted
Curious Sam
Curious Sam
Asked: 2018-04-17 14:36:44 +0800 CST2018-04-17 14:36:44 +0800 CST 2018-04-17 14:36:44 +0800 CST

将参数回显到用双引号括起来的参数格式化的日志文件

  • 772

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 shell
  • 3 3 个回答
  • 364 Views

3 个回答

  • Voted
  1. Best Answer
    Michael Homer
    2018-04-17T15:26:53+08:002018-04-17T15:26:53+08:00

    您可以在 Bash 4.4 及更高版本中使用扩展修饰符获得shell 引用的输出:@Q

    $ echo "$timeStamp" -  Executing command: sudo /home/editini.sh "${@@Q}"
    Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'one' 'two' 'three' 'four' 'five' 'six'
    

    它使用单引号,而不是双引号,但它确保输出作为输入返回到执行您期望的 shell 中是有效的。下面是一个重要的示例,但如果您的日志格式需要双引号,则没有帮助。

    有点令人困惑的是,for 在连续字符中${@@Q}使用了@两种不同的含义:第一个@表示参数数组,而第二个引入了一个修饰符,用于转换数组扩展的输出。Q修饰符导致输出被引用。$@扩展为每个元素单独转动,与 不同$*,但在这种情况下可能无关紧要(尽管如果您的实际代码更复杂,则可能)。


    @Q, and printf %q, 使用单引号,因为它们会抑制其他 shell 扩展 - 如果其中一个参数包含$, `, \,"或!,则任何带有双引号的东西都会被怀疑。@Q确保引用每个术语,即使它不一定需要它(虽然printf不需要)。空格仍然得到正确处理。

    $ set -- 'o$ne' "t w o" th\`ree fo\\ur five\! s\"i\'x
    $ echo "$timeStamp" -  Executing command: sudo /home/editini.sh "${@@Q}"
    Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'o$ne' 't w o' 'th`ree' 'fo\ur' 'five!' 's"i'\''x'
    

    你可以把那个命令复制回去,不管输入多么不正常,它都会起作用。

    • 2
  2. Ole Tange
    2018-04-17T14:53:55+08:002018-04-17T14:53:55+08:00

    这似乎有效:

    #!/bin/bash
    
    a=$(parallel --shellquote ::: "$@")
    echo "$timeStamp" -  Executing command: sudo /home/editini.sh $a
    

    经测试:

    mylog '"I  want  a  2"x4"", said the 3 * captain"' to his friend
    

    它不会引用“,因为(从测试中可以看出)”可以是输入的一部分。它使用 \ 代替。GNU Parallel 中的 shell 引用函数经过了广泛的测试,所以如果你能给它输入会被错误引用的输入,我会感到惊讶。

    • 0
  3. Stephen Harris
    2018-04-17T15:03:15+08:002018-04-17T15:03:15+08:00

    使用简单的循环

    {
       echo -n "$timeStamp - Executing command: sudo /home/editini.sh"
       for a in "$@"
       do
         echo -n " \"$a\""
       done
       echo
    } > report.txt
    

    例如

    ./x one two "three and four together" five    
    Mon 04/16/18 04-46-pm - Executing command: sudo /home/editini.sh "one" "two" "three and four together" "five"
    

    会破坏它的一件事是,如果输入中有"一个

    % ./x one "two\"three" four
    Mon 04/16/18 04-21-pm - Executing command: sudo /home/editini.sh "one" "two"three" "four"
    
    • 0

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • 如何将带有〜的路径保存到变量中?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve