Peter Lyons からの回答に基づいていますが、引数内で引用符を使用することもできます:
#!/bin/bash
QUOTE_ARGS=''
for ARG in "[email protected]"
do
ARG=$(printf "%q" "$ARG")
QUOTE_ARGS="${QUOTE_ARGS} $ARG"
done
ssh [email protected] "printf ${QUOTE_ARGS}"
これは、改行を除いて、これまでにテストしたすべてのもので機能します:
$ /tmp/wrap_printf "[-%s-]" "hello'\$t\""
[-hello'$t"-]
#!/bin/sh
QUOTE_ARGS=''
for ARG in "[email protected]"
do
QUOTE_ARGS="${QUOTE_ARGS} '${ARG}'"
done
ssh [email protected] "${QUOTE_ARGS}"
これはスペースに対して機能します。引数に一重引用符が埋め込まれている場合は機能しません。
引用を正しく行うことはかなり難しく、bash で (一般的かつ堅牢な方法で) 行うことはほとんど不可能です。
Perl を使用する:
#!/usr/bin/perl
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new('[email protected]');
$ssh->system('printf', @ARGV);