私のスクリプトをどのようにデバッグしますか?

私のスクリプトをどのようにデバッグしますか?

このスクリプトの名前はhelloです。

for i in $(ls $*);do
    x=$(echo $(basename $i".md"));
    pandoc $i -t "latex" -o $x.pdf;
done

私がこれを書くとき

$ ./hello *bye.md

このエラー

ls: cannot access 'test': No such file or directory  
ls: cannot access 'de': No such file or directory  
ls: cannot access 'bye.md': No such file or directory
basename: extra operand ‘bye.md’  
Try 'basename --help' for more information.  
./hello: 2: ./hello: pandoc: not found  
basename: extra operand ‘.md’  
Try 'basename --help' for more information.  
./hello: 2: ./hello: pandoc: not found  

私のスクリプトhelloが正しく機能しない理由を理解できませんか?

そして、次のコマンドは正しいディレクトリにpdfを生成しません。

$ ./hello */test.md  

ベストアンサー1

set -x実行中のコマンドを正確に示すコマンドを使用してスクリプトをデバッグできます。を使用してこのモードを無効にできますset +x。これにより、存在しないファイルでループを実行してbasename誤って実行されることがわかります。

また:

  • lsの出力を解析しないでください。for i in "$@"; doそれはあなたにとてもよく合います。

  • basename拡張子は別の引数として必要なので、次のように書く必要がありますbasename $i ".md"。ファイル名を含む変数と拡張子の間にスペースはありません。

  • 変数にスペースが含まれている場合は、引用符で囲む必要があります。実際に欲しいbasename "$i" .mdpandoc "$i" -t "latex" -o "$x".pdf

  • これはecho重複します。x=$(basename "$i" .md)

おすすめ記事