[ "@$1@" = "@@" ];場合はどうなりますか?バッシュではどういう意味ですか?

[ "@$1@" = "@@" ];場合はどうなりますか?バッシュではどういう意味ですか?

私はスクリプトに初めて触れ、それが何をしているのかを理解しようとしています。助けてもらえますか?

if [ "@$1@" = "@@" ]; then
strDate ='date +%Y%m%d' 
else
strDate=$1
fi

答え1

全体的な構造はif {条件} then {何かをしてください} else {何か別のことをしてください}。シェル自体には、fi構文の終わりを通知し、条件付き[ ... ]テストを実行するなど、構文を解析するのに役立つより多くの構文が必要です。 )

  • 条件付きテストは、[ "@$1@" = "@@" ]2つの文字列が等しいかどうかを比較します([ X = Y ])。

    • 最初の文字列@の後には、プログラムまたは関数の最初のパラメータ($1)が続きます@。したがって、最初のパラメータとして渡すと、red文字列はになります@red@。一方、何も渡さない場合、文字列は次のようになります。@@
    • 2番目の文字列はリテラルです。@@

    ここで何が起こるかは、条件付きテストが$1(プログラムまたは関数の)最初の引数がnullであることを確認することです。で書くのが最善です[ -z "$1" ]

  • 次の行にstrDate ='date +%Y%m%d'構文エラーがあるため実行できません。たぶんを意味するものかもしれません。strDate=`date +%Y%m%d`今を書く方が良いですstrDate=$(date +%Y%m%d)。 (どちらの場合も、変数名とその割り当ての間にスペースを入れてはいけません。マークされた一重引用符='...')は、割り当てが文字列内の12文字であることを意味しますが、date +%Y%m%d目的は次のとおりです。この行は、$strDate変数を今日の日付形式に割り当てますYYYYMMDD(たとえば、2022年8月12日は20220812)。

  • 最後の割り当ては、プログラムまたは関数の最初の引数として指定された値を変数に割り当てますstrDate=$1$strDateあなたが提供したコードの値の追加検証はありません。

コードを渡すと、多くの構文や構成エラーを識別できることを指摘したいと思いますshellcheck(またhttps://shellcheck.net/)。

以下は、より読みやすくするためにインデントを含む修正されたコードです。

if [ -z "$1" ]
then
    strDate=$(date +'%Y%m%d')
else
    strDate=$1
fi

シェルの構文が最初の段落で提供した説明を明確に実装していることがわかります。一部の人は、then元のコードで行ったように、同じ行に入れるのが好きです。一貫性を維持する限り、どちらにしても問題になりません。しかし、経験豊富なほとんどすべてのコーダーはコード構造を表示するためにインデントを使用します。これはカテゴリ全体でエラーを減らすのに役立ちます。ifif [ -z "$1" ]; then

最後に、単一の条件付き割り当てを使用して、ブロック全体をより慣用的な方法で置き換えることができます。

strDate=${1:-$(date +'%Y%m%d')}

関連情報