改行なしで潜在的な二重引用符を含め、そのままエコーする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">
これを行う方法はありますか?
答え1
この例では、位置パラメータに二重引用符が含まれていません。
./script1 a "bc d"
二重引用符は、単にbc
との間のスペースで単語を区切るべきではないことをシェルに伝えますd
。
2番目の引数にリテラル引用符を含めるには、エスケープしてシェルにリテラルであることを知らせる必要があります。
./script1 a '"bc d"'
または
./script1 a \"bc\ d\"
printf
シェル入力(エスケープ)で再利用できる形式で印刷できます。
$ set -- a "bc d"
$ printf '%q\n' "$@"
a
bc\ d
見てわかるように、これは単にスペースから抜け出すことです。
答え2
他のところで説明したように、入力した二重引用符は、埋め込みテキストが単一の単語として扱われることをシェルに示します。引用した単語を印刷するには、出力テキストにその単語を含めるだけです。
#!/bin/bash
printf '"%s" ' "$@"
printf "\n"
これは、コマンドを実行するときに二重引用符を含めることができるパラメーターだけでなく、すべてのパラメーターに二重引用符を追加することに注意してください。