予期しないトークンが原因でスクリプトが失敗する> '[重複]

予期しないトークンが原因でスクリプトが失敗する> '[重複]

次のスクリプトを実行するとエラーが発生します。この問題を解決するには?

  1 #!/bin/bash
  2 # Show colored output if running interactively
  3 if [ -t 1 ] ; then
  4     export ANSIBLE_FORCE_COLOR=true
  5 fi
  6 # Log everything from this script into _quickstart.log
  7 echo "$0 $@" > _quickstart.log
  8 exec &> >(tee -i -a _quickstart.log )
  9 # With LANG set to everything else than C completely undercipherable errors
 10 # like "file not found" and decoding errors will start to appear during scripts
 11 # or even ansible modules
 12 LANG=C

[root@localhost quickstart_images]# sh quickstart.sh -u file:///usr/share/quickstart_images/undercloud-mitaka.qcow2 localhost
quickstart.sh: line 8: syntax error near unexpected token `>'
quickstart.sh: line 8: `exec &> >(tee -i -a _quickstart.log )'
[root@localhost quickstart_images]# 

答え1

最初bash: スクリプトを実行する代わりに実行可能にします。sh

chmod +x quickstart.sh

自分で実行してみてください。

./quickstart.sh -u file:///usr/share/quickstart_images/undercloud-mitaka.qcow2 localhost

第二:Bashスクリプトに問題があるようです。

スクリプトを実行してくださいhttps://www.shellcheck.net/スクリプトに次のエラーが報告されます。

Line 7:
echo "$0 $@" > _quickstart.log
         ^-- SC2145: Argument mixes string and array. Use * or separate argument.

あなたが直面している問題はミックス ひもそして大量に

次のいずれかの方法を使用してこの問題を解決できます。

  1. 2つの異なる引用符で区切られた引数を使用して文字列と配列を混在させないでください。

    echo "$0" "$@" > _quickstart.log
    

または

  1. $@次に、置換は配列を$*文字列に置き換えます。

    echo "$0 $*" > _quickstart.log
    

$@次の違いを参照してください$*

Bash 特殊パラメータ

($*)1から始まる位置パラメータに展開されます。拡張が二重引用符内にない場合、各位置引数は別々の単語に展開されます。これらの単語は、実行されるコンテキストで単語分割とパス名拡張がさらに適用されます。 二重引用符内で拡張が発生すると、IFS特殊変数の最初の文字で区切られた各引数の値を使用して単一の単語に展開されます。つまり、「$*」は「$1c$2c...」と同じです。ここで、cはIFS変数値の最初の文字です。 IFSが設定されていない場合、パラメーターはスペースで区切られます。 IFS が空の場合、パラメーターの連結時に区切り文字は挿入されません。

($@)1から始まる位置パラメータに展開されます。二重引用符内で拡張が発生すると、各引数は別々の単語に展開されます。つまり、「$@」は「$1」および「$2」と同じです。...単語内で二重引用符拡張が発生すると、最初の引数の拡張は元の単語の先頭に関連付けられ、最後の引数の拡張は元の単語の最後に関連付けられます。位置引数がない場合、「$@」と$@は何も拡張されません(つまり削除されます)。

関連情報