web-dev-qa-db-ja.com

$ @を逐語的に印刷する方法はありますか?

stdoutに反響するスクリプトを書きたい$@逐語的。潜在的な二重引用符を含み、改行なし。

私が試したこと:

> cat ./script1    
#! /usr/bin/bash
printf "%s %s" $0 $@
echo -n $0 $@
echo -n "$0 $@"
> 
> ./script1 a "bc d"
./script1 abc d./script1 a bc d./script1 a bc d>

スクリプトを次のように実行します。

> ./script1 a "bc d"
./script1 a "bc d">

これを行う方法はありますか?

4
StoneThrow

例では、位置パラメーターには二重引用符が含まれていません。

./script1 a "bc d"

そこにある二重引用符は、bcdの間のスペースでWord分割を実行してはならないことをシェルに伝えるためのものです。

2番目のパラメーターにリテラル引用符を含める場合は、エスケープしてシェルにリテラルであることを伝える必要があります。

./script1 a '"bc d"'

または

./script1 a \"bc\ d\"

printfを使用して、シェル入力として再利用できる(エスケープされた)形式で出力できます。

$ set -- a "bc d"
$ printf '%q\n' "$@"
a
bc\ d

ご覧のとおり、これはスペースをエスケープするだけです。

10
jesse_b

他の場所で説明したように、入力する二重引用符は、囲まれたテキストが単一の単語として扱われることをシェルに示しています。引用符で囲まれた単語を印刷する場合は、かなり簡単です。あなたが出力するテキストにそれらを含めるだけです:

#!/bin/bash
printf '"%s" ' "$@"
printf "\n"

これにより、コマンドを実行したときに二重引用符が付いていた可能性がある引数だけでなく、すべての引数に二重引用符が追加されることに注意してください。

5
roaima