• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:${@+"${@}"}は何を表していますか?)

${@+"${@}"}とは?

このQ&Aのポイント
  • シェルスクリプトで使われる${@+"${@}"}という表記について、その意味と使い方について解説します。
  • また、「${PROGRAM_DIR?}」という記述についても説明します。
  • この要約では、${@+"${@}"}と${PROGRAM_DIR?}という表記の意味について詳しく解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4855/10270)
回答No.1

そのあたりの記号の意味は、man bash の「パラメータの展開」の説明の所に書いてあります。 ${PROGRAM_DIR?} ⇒ $PROGRAM_DIR に展開する。ただし未設定ならエラーメッセージを表示 ${X+$Y} ⇒ $X が未設定なら空に展開する。$Xが設定されていれば $Y に展開する ${@+"${@}"} ⇒ bash に於いては "$@" と同じ。引数が0個なら空に展開し、引数があれば、それぞれの引数に展開する。 古いシェルに於いては、単に "$@" と書くと、引数がない場合、空でなく空文字列に展開されたので、上記のように書く必要があった。 空と空文字列の違いがわからなければ、 echo 引数は $# 個 echo 引数は "$@" です。 というシェルスクリプトファイルを作って、例えばそれを foo とすると、 ./foo ./foo "" を実行してみれば、空(./foo)と、空文字列(./foo "")の違いがわかります。

_alias_
質問者

お礼

ありがとうございます。とても分かりやすい回答でした。 空と空文字の件も試してみました。"$@"はどちらも""ですが、./fooとした場合は引数が0個でした。空文字列は引数があるけど内容は""、空は引数自体ないということですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 正規表現とワイルドカードについて

    UNIX初心者の者です。現在Solarisを使い毎日悪戦苦闘しています。 質問なのですが、「正規表現」と「ワイルドカード」とはどのように違うものなのでしょうか。ちょっと混乱しています。 現状の認識では、 「ワイルドカード」-コマンドラインで使うもの。エスケープするときは「’’」で囲む。複雑な指定は難しい。 「正規表現」-コマンドの引数や、スクリプトなどで使われるもの。エスケープするときは「¥」をつける。基本的に「’’」で囲むもの。様々な表現が可能。 といった感じにとらえています。が、いざ使うとなると混乱している状態です。 すみませんが、この2つについて教えてもらえないでしょうか。 あと参考になるような本やホームページなどもあるでしょうか?コマンドの組み合わせやシェルスクリプトの記述なども勉強中なので、その関係の事でもよいので。 よろしくお願いします。

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。

  • シェルススクリプト内のパス指定について

    プログラムを実行するシェルスクリプト内に以下のように絶対パスで環境変数の設定用のシェルスクリプトが絶対パスで書かれているのですが、この場合だと環境が変わるたびにシェルスクリプト内のパスを書き換えなければなりません。 /dir1/dir2/dir3/setenv.sh 相対パスにすれば書き換える必要はなくなるのですが、お作法上は相対パスで書くことは問題ない(良いと)されているのでしょうか? ../../dir/setenv.sh

  • UNIXプログラミング execについて。

    execveで、引数に環境変数がありますが、これはいったいどういうときに使うのですか?いまいち分かりません。 簡単なシェルスクリプトを作成しているのですが、今は環境変数の意味がよくわからないので、execvpなどを使っています。 path検索をするかしないかの使い分けはわかります。 ですがたとえば、 execv と execve execl とexecle はどう違うのでしょうか。

  • bashで変数にパイプを入れ、コマンドとして使う?

    パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら 教えてください。 Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。 スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、 パイプが入っているとうまくいきません。 下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に そのようなコマンドを実行できるようにできますでしょうか? (引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない ようにしてもダメでした。) 変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで 囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識 されないようです。 bashシェルで設けてる制約でしょうか?回避策などありますでしょうか? <<スクリプト poll.sh>> ## # Defs export RUNCMD='finger' export INTERVAL=10 ## # Getopt while getopts "t:" OPT; do case ${OPT} in t) INTERVAL=${OPTARG};; esac done shift $((OPTIND-1)) [ ${#} -gt 0 ] && RUNCMD="${*}" ## # Main part while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done

  • 【ど素人】シェルスクリプトで、引数の形式チェック【ヘルプミー】

    bashで書いたシェルスクリプトで、 引数を正規表現を用いて入力形式チェックしたいと思っています。 いい方法が思いつかず、とりあえず動作はする以下のスクリプトを 組みました。 echo $1 | grep "正規表現" > /dev/null if [ $? -eq 0 ]; then # あってるときの処理 else # ちがうときの処理 fi どうも、他に良い方法がある気がしてなりませんが、 どうでしょうか? 良い方法があれば教えてください。 また、(ないとは思うけど)この方法が一般的ということであれば、 その旨教えていただけるとありがたいです。 よろしくお願いします。

  • 正規表現を展開させないで子シェルに渡す

    シェルで、 正規表現が入ってる変数を子シェルに渡したいのですが、展開されてしまいます。 展開しないで渡すには、どうしたら良いのでしょうか? 変数には、 123*.txt や aaa[0-9].txt などが入っています。 宜しくお願い致します。

  • シェルスクリプトでの演算

    シェルスクリプトで、多項式の演算の記述の仕方を教えてください。 (a+2)+(a*3)-4 のような式はどう記述すればいいのでしょうか。 初歩的な事がわかっていなくてすみません。 よろしくお願いします。 ちなみに.shです。

  • Bashシェルスクリプト findのエイリアスに引数を渡すにはどうすれ

    Bashシェルスクリプト findのエイリアスに引数を渡すにはどうすれば良いのでしょうか? $ alias a="ls $1 -a" $ a dir . .. ls_nara_ok $ alias a="find $1 -type d" $ a dir find: pathes must precede expression: a lsではうまく行くのに、findではエラーとなってしまいます。 どうすればスクリプト(エイリアス)内のfindに引数を渡せるのでしょうか?

  • シェルスクリプトの切り替え?

    シェルには種類がありユーザーはそれを切り替えることによって好みのシェルを自由に選択することが出来る。 というのはわかりました。 が、シェルスクリプトを記述して実行する場合はどうなんでしょう。 bornシェルで記述したシェルスクリプトをcshから実行できるのでしょうか。 実行者とスクリプト記述者が同じシェル環境で操作しないといけないのかと思い質問しています。 ひょっとして意味のわからない質問かも知れませんがお願いします。