1. ホーム
  2. bash

[解決済み] bashのコマンドライン引数へのアクセス $@ vs $*

2022-03-24 19:02:14

質問

多くのSO質問とbashチュートリアルでは、私はbashスクリプトでコマンドラインの引数に2つの方法でアクセスすることができると見ています。

$ ~ >cat testargs.sh 
#!/bin/bash

echo "you passed me" $*
echo "you passed me" $@

という結果になる。

$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2

とはどのような違いがあるのでしょうか? $*$@ ?
前者はどのような場合に使用し、後者はどのような場合に使用するのでしょうか。

どのように解決するのですか?

この違いは、特殊なパラメータを引用したときに現れます。その違いを説明しましょう。

$ set -- "arg  1" "arg  2" "arg  3"

$ for word in $*; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in $@; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in "$*"; do echo "$word"; done
arg  1 arg  2 arg  3

$ for word in "$@"; do echo "$word"; done
arg  1
arg  2
arg  3


引用の重要性に関するもう一つの例: "arg"と数字の間には2つのスペースがありますが、$wordを引用しなかった場合、$quot;arg"と数字の間には2つのスペースがあることに注意してください。

$ for word in "$@"; do echo $word; done
arg 1
arg 2
arg 3

で、bashでは "$@" は反復処理するための "default"リストです。

$ for word; do echo "$word"; done
arg  1
arg  2
arg  3