シェルスクリプトからファイルサイズを印刷するには?

シェルスクリプトからファイルサイズを印刷するには?

CICDパイプラインでFastlanを使用して圧縮ビルドファイルのサイズを記録しようとしています。コマンドラインでこれを試した場合:

du -h fileName.ipa | awk '{print $1}'

良い結果。ただし、次のようにスクリプトに入れようとすると、次のようになります。

sh '''
  # Add filesize to release message
  
  var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
  fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
  echo "$buildInfo"
  sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
  '''

次の構文エラーが発生します。

[17:50:24]:     262:          var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
[17:50:24]:  => 263:          fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
[17:50:24]:     264:          echo "$buildInfo"
[17:50:24]:     265:          sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
[!] Syntax error in your Fastfile on line 263: Fastfile:263: syntax error, unexpected '{', expecting `end'
..._FILE_PATH}"'$fileName | awk '{print $1}')
...                              ^
Fastfile:285: syntax error, unexpected `end', expecting end-of-input
    end
    ^~~

私はシェルスクリプトが初めてなので、助けてくれてありがとう。間違った場所から引用した可能性があります。役に立つなら、FastlanはRuby構文を使用するので、そこにRuby文字列補間があります。

編集する:

詳細については、クイックファイルから呼び出されるフルパスは次のとおりです。

# Send message MS Teams Channel
    lane:sendTeamsMessage do |options|
=begin
  MS Teams messages are sent using webhooks and it got limited support to HTML and Markdown. 
  This implementation uses HTML formatted message.
  Webhook will not accept new lines or double quotes because it can break the JSON struture.
  The message file preparation is done in multiple steps.
  1. Add .ipa file size info to release message HTML
  2. Replace all double quotes with single quotes  
  3. Copy the Teams message payload template and update it with the message content
  4. Replace 'MESSAGE_INFO' string with the HTML formatted content file
  5. Send the message to Teams channel
=end
      sh '''
      # Add filesize to release message
      
      var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
      var fullFilePath='"#{IPA_FILE_PATH}"'$fileName
      echo fullFilePath
      fileSizeInfo=(du -h $fullFilePath | awk '{print $1}')
      echo "$buildInfo"
      sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
      '''

      sh '''
      # Copy the release message html file
      cp -fr '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"' '"#{TEAMS_MESSAGE_FILE_NAME}"'
      '''
      # Replace all double quotes with single quotes to make it JSON friendly
      sh("sed","-i","-e","s|\"|\'|g","#{TEAMS_MESSAGE_FILE_NAME}")

      sh'''
      cp -fr '"#{TEAMS_PAYLOAD_TEMPLATE_FILE_NAME}"' '"#{TEAMS_PAYLOAD_FILE_NAME}"'
      message=`cat '"#{TEAMS_MESSAGE_FILE_NAME}"'`
      sed -i -e "s|MESSAGE_INFO|'"$message"'|g" '"#{TEAMS_PAYLOAD_FILE_NAME}"'
      '''
      # Send the message to Teams channel
      sh '''
      echo '"#{options[:webhook]}"'
      curl -H "Content-Type: application/json" -d @'"#{TEAMS_PAYLOAD_FILE_NAME}"' '"#{options[:webhook]}"'
      '''
    end

ファイルパス/名前を独自の変数に移動しようとしましたが、まだ同じ問題があります。

答え1

bashコマンド出力をキャプチャするイディオムは次のとおりです。

du -h fileName.ipa | awk '{print $1}'

出力を変数に保存するには:

fileSizeInfo=$(du -h fileName.ipa | awk '{print $1}')

$これは、コードに欠けている点を除いて、スクリプトのBash部分の行と非常によく似ています(。これが混乱した出力の主な原因であるようです。

答え2

一度やってみたいと思います。コマンドの置き換え

あなたの例では

var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`

有効なコマンド おおよそ。

2番目のコマンドは欠落のために置き換えられます$

fileSizeInfo=$(du -h $fullFilePath | awk '{print $1}')

利用可能な2つのコマンドの置き換えbashは現代的です。POSIXスタイル

$(command)

または古いスタイル

`command`

読みやすさを高めるには、最初のものを使用することをお勧めします。

コードをもっと読みやすくしたい場合は、あなたが言ったように書いてください。パイプや他のコマンドなしで読みやすい方法でファイルサイズを取得する別の方法は次のとおりです。

stat -c "%s" /path/to/file

あなたの例で試すことができます

fileSizeInfo=$(stat -c "%s" $fullFilePath)

答え3

Rubyでは、次のものを使用できます。

File.stat("/path/to/file").size

関連情報