bashの代替ソリューション

bashの代替ソリューション

"$@"シェルスクリプトでは、必要に応じてスクリプトパラメータを引用して拡張することがわかります。たとえば、次はスクリプトパラメータをgccに渡します。

gcc -fPIC "$@"

<<<しかし、bash pass-to-stdin構文を使用すると、"@$"期待どおりに機能しません。

#!/bin/bash
cat <<< "$@"

./test.sh foo "bar baz"指定されたようにスクリプトを呼び出します。

foo bar baz

私は希望

foo "bar baz"

シェルプロンプトで書かれたように、引数を印刷するシェルスクリプトを書く方法はありますか?例:ヒントのスクリプト・パラメーターを含む、次に使用するコマンドのヒント。

ベストアンサー1

"$@"ロケーション引数ごとに1つの引数で構成されるロケーション引数のリストに展開します。

これを行うとき:

set '' 'foo bar' $'blah\nblah'
cmd "$@"

cmd呼び出しは空の文字列foo barと3つのパラメータを使用して行われますblah<newline>blah。シェルはexecve()次のようにシステムコールを呼び出します。

execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);

同じ呼び出しを再現するためにシェルコマンドライン(つまり、シェル言語のコード)を再構成するには、次のようにします。

awk -v q="'" '
  function shellquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  BEGIN {
    for (i = 1; i < ARGC; i++) {
      printf "%s", sep shellquote(ARGV[i])
      sep = " "
    }
    printf "\n"
  }' cmd "$@"

またはを使用してzshさまざまな種類の見積もりをリクエストしてください。

$ set '' 'foo bar' $'blah\nblah'
$ print -r -- cmd "${(q)@}"
cmd '' foo\ bar blah$'\n'blah
$ print -r -- cmd "${(qq)@}"
cmd '' 'foo bar' 'blah
blah'
$ print -r -- cmd "${(qqq)@}"
cmd "" "foo bar" "blah
blah"
$ print -r -- cmd "${(qqqq)@}"
cmd $'' $'foo bar' $'blah\nblah'

またはzshbashまたはksh93(ここではbash他のシェルと一緒にYMMV)を使用してください。

$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'

また、シェルのxtraceオプションを使用して、シェルに実行したい内容を印刷させることもできます。

$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'

:上記では、位置引数を引数として no-op コマンドを実行しました。cmd私のシェルは、シェルに再入力するのに適したクールな引用方法でそれを印刷します。すべてのシェルがこれを行うわけではありません。

おすすめ記事