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

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

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部分の行と非常によく似ています(。これが混乱した出力の主な原因であるようです。

おすすめ記事