改行なしで潜在的な二重引用符を含め、そのままエコーする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
見てわかるように、これは単にスペースから抜け出すことです。