2016-03-31 6 views
3

私は通常質問をしません&助けを求める人はいますが、現在は約1700行の比較的大きなbashスクリプトを書いています。私は "$ *"を使ってある関数から別の関数にデータをプッシュするために多数の関数を利用しています。私はそれが我々が持つdealing何であるかを理解することはおそらく最高だと思い

case "$1" in 
    -s|--scan) VersionDump "[email protected]"; DumpArray "$*"; exit 0;; 
    -t|--test) VersionDump "[email protected]"; Virtual "$*"; exit 0;; 
    -e|--erase) VersionDump "[email protected]"; Clear "$*"; exit 0;; 
    -l|--load) Loadit "$*"; exit 0;; 
    -i|--info) ThumbInfo "$*"; exit 0;; 
    -h|--help|-\?) Help "$2"; exit 0;; 
    -v|--version) VersionDump "[email protected]"; exit 0;; 
    *) Help; exit 0;; 
esac 

、上のより多くの情報があります:「$ 1」は、スクリプトのの一番最後にcase文で処理されるまで、スクリプト全体はスクワットを行います私のフォーラム。私は、 "$ *"と "$ @"を1回のパスで失敗したアレイに戻すようにしようとしたところで突き刺しました。

# Optional switch - useful for me and the end user. 
DEBUG=$(echo "$*" | grep -i "debug") 
if [[ "$DEBUG" ]]; then 
    Center "${txtred}DEBUG INFORMATION" 
    printf "DEBUGGING Function:\t%s\n" "$FUNCNAME" 
    printf "PASSED TO FUNCTION *:\t%s\n" "${@}" 
    echo -e "1:$1 2:$2 3:$3 4:$4 5:$5 6:$6 7:$7 8:$8" 
    echo -en "Caller [LINE]/APP: " 
    caller 
    FullBar 
    echo -en "${txtrst}" 
fi 

私は完全に全体を再書いています:私は、コマンドは単語「デバッグ」は、コマンドラインで検出された場合に機能する関数から渡されるように、私は分析することができ、各機能の「デバッグ」のコードを書かれています依存関係を削除するスクリプト。はい、私はコード全体を提供していないことを知っています。私は疑問があると確信しています。スクリプト全体はShellCheckedであり、エラーは0です。私はもはや使用しない変数などいくつかあります。私はdeter-mentalとは考えません。彼らは(コマンドが渡される)ように見えるよう

物事は常にではありません。

./ultimate-edition-thumbos_1.1.4_all/bin/thumbos --load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug 

結果:

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ DEBUG INFORMATION ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 
DEBUGGING Function: Loadit 
PASSED TO FUNCTION *: --load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug 
1:--load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug 2: 3: 4: 5: 6: 7: 8: 
Caller [LINE]/APP: 1688 ./ultimate-edition-thumbos_1.1.4_all/bin/thumbos 
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 

どこなど、私の$ 2がありますか?私は何か悪いことをしていますか?

+1

関連http://unix.stackexchange。COM/Q/38906分の41571 – cuonglm

答えて

3

"$*"は単一の単語に展開されます。

引数を個別の単語として使用する必要がある場合は、どこでも使用できません。それは"[email protected]"のためです。

そのデバッグ出力は、の代わりにLoadit関数に引数を渡したことを(直接的および間接的に)"$*"と示しています。

これは、以前のスニペットから見ることができるように-l|--load) Loadit "$*"; exit 0;;でした。

しないでください。 Loadit "[email protected]"を使用してください。

大雑把に言えば、"[email protected]"はほとんど常にあなたが望むものです(単語が1つ必要な場合を除きます)。


ちょうどFYI上記の私のコメントの「間接的」ビットは、彼らはすべてのフィット感をないときprintfは、引数のフォーマット文字列を繰り返していることです。

あなたのデバッグ出力のみが、それはそれは引数を1つしか見たことを言っていた単一PASSED TO FUNCTION *:\t%s\n行が含まれていたときだから、そう

$ printf '%s %s %s\n' foo bar baz 
foo bar baz 

しかし

$ printf '%s\n' foo bar baz 
foo 
bar 
baz 

を取得します。

+0

は、私は、しかし、私は同様にデバッグコードを再記述する必要があります、あなたが正しいと言うだろう: デバッグを機能:*関数に渡さ\t Loadit :\t --load 関数に渡さ*:関数に渡さ\t ../wip/ultimate-edition-5.0-x64-lite-xfce.iso *:\t SDG は*関数に渡さ:\tデバッグ 1: - ロード2:../ WIP /最終版 - 5.0-x64-lite-xfce.iso 3:sdg 4:デバッグ5:6:7:8: 呼び出し元[LINE]/APP:1688 ./ultimate-edition-thumbos_1.1.4_all/bin/thumbos forループは、コードがちょうど長く長くなったらそれを愛するようになりました!ありがとう! ShellCheckはその提案をしているはずです。そして、[star]が受け入れられない使用引用符であることを私に教えてください。 – TheeMahn

+0

うん、それは最後のFYIビットだ。その行については、単一の文字列が必要なので、 '' $ * ''を使うのが適切です。そして、それは基本的にあなたが私の経験でそれを望む唯一の時間です。 –

+0

私はあなたを上げようとしましたが、15ポイントを持っていないと言います。私は推測しない人を助けるために40人、私のフォーラムで人々を助けるために何千人もいると思います。 ;) – TheeMahn

関連する問題