bash:引用带引号的var

时间:2016-05-20 15:34:38

标签: bash quotes double-quotes

我尝试制作一个用于调试的虚拟脚本。该脚本应该将命令和所有参数传递给syslog。但是当我得到一个有引号的参数时,我只会失败。

#!/bin/sh

set -x
param="$*"

logger -t $0 -p local3.debug "$*"
#logger -t $0 -p local3.debug "$param"
#logger -t $0 -p local3.debug "$(echo "$param")"
#logger -t $0 -p local3.debug "${param//\"/}"
#logger -t $0 -p local3.debug "${param[@]}"

我尝试了一些我发现的变种,但没有任何效果。

# d-iptables -L dkdsdds "ddd"
+ param='-L dkdsdds ddd'
++ echo '-L dkdsdds ddd'
+ logger -t /usr/sbin/d-iptables -p local3.debug '-L dkdsdds ddd'
logger: invalid option -- L

Usage:
 logger [options] [message]

Options:
 -d, --udp             use UDP (TCP is default)
 -i, --id              log the process ID too
 -f, --file <file>     log the contents of this file
 -h, --help            display this help text and exit
 -n, --server <name>   write to this remote syslog server
 -P, --port <number>   use this UDP port
 -p, --priority <prio> mark given message with this priority
 -s, --stderr          output message to standard error as well
 -t, --tag <tag>       mark every line with this tag
 -u, --socket <socket> write to this Unix socket
 -V, --version         output version information and exit

2 个答案:

答案 0 :(得分:2)

我建议您将脚本更改为#!/bin/bash并使用

logger -t $0 -p local3.debug -- "$(printf "%q " "$@")"

您需要--,因此记录器并不认为-L是其中一个选项。

答案 1 :(得分:0)

首先,您将此标记为bash,但您使用的是/ bin / sh(可以是bourne或dash)。接下来你的记录器正在阅读 - 作为参数。请更好地引用它。

#!/bin/bash

set -x
param="\"$@\""     # quotes removed by the shell

logger -t $0 -p local3.debug "'$param'"  # expand, then strong quote