$ErrorActionPreference = "Stop" function Validate-Scripts { Param ( [Parameter(Mandatory=$true)] [string[]]$Path, [Parameter(Mandatory=$true)] [string]$ExpectedShebang ) $ScriptWithoutShebangLine = @() Get-ChildItem $path -Recurse -File -Filter "*.sh" | ForEach-Object { $shebangLine = Get-Content -Path $($_.FullName)| Select-Object -First 1 if ($shebangLine -eq $ExpectedShebang) { Write-Host "[+] '$($_.FullName)'" } else { Write-Host "[-] '$($_.FullName)'" $ScriptWithoutShebangLine += $($_.FullName) } } return $ScriptWithoutShebangLine } $PathUbuntu = "./images/linux/scripts" $PathMacOS = "./images/macos/provision" $PatternUbuntu = "#!/bin/bash -e" $PatternMacOS = "#!/bin/bash -e -o pipefail" $ScriptsWithBrokenShebang = @() $ScriptsWithBrokenShebang += Validate-Scripts -Path $PathUbuntu -ExpectedShebang $PatternUbuntu $ScriptsWithBrokenShebang += Validate-Scripts -Path $PathMacOS -ExpectedShebang $PatternMacOS if ($ScriptsWithBrokenShebang.Length -gt 0) { Write-Host "The following scripts have incorrect shebang:" $ScriptsWithBrokenShebang | ForEach-Object { Write-Host "##[error] - '$_'" } Write-Host "##[error] Expected shebang for scripts in 'images/linux' folder is '$PatternUbuntu'" Write-Host "##[error] Expected shebang for scripts in 'images/macos' folder is '$PatternMacOS'" exit 1 else { Write-Host "All scripts have correct shebang." } }