Create a bash ping script to check uptime
We can run a ping check on a particular IP address or hostname with the `ping` command:

```bash
ping -c 10 8.8.8.8
echo $?
```

This will attempt to send 10 packets to the IP address `8.8.8.8`. Then the `echo` will indicate the result, success or failure. We can use this result in an `if` statement like this:

```bash
if ping -c 10 8.8.8.8 > /dev/null; then
    echo working
else
    echo not working
fi
```

In order to calculate uptime, we should take many samples, add up the failures, and then divide the number of failures by the total tests.

We will be using the `bc` command to actually run the percentage calculation.

```bash
#!/bin/bash

IP=8.8.8.8

TEST_COUNT=0
FAILURES=0

while true; do
    TEST_COUNT=$((TEST_COUNT + 1))
    if ! ping -c 10 $IP > /dev/null; then
        FAILURES=$((FAILURES + 1))
    fi

    UPTIME=$(bc -l <<< 100 - 100 * $FAILURES / $TEST_COUNT)

    echo uptime: $UPTIME

    sleep 1m
done
```

Some possible ways to improve this further:

- Make the loop exactly one minute, instead of 1 minute plus the type it takes the `ping` command. This way, the result is more accurate.
- Use a continuously updating running average, instead of adding to the same `FAILURES` variable over the entire course of running the script.
- Store the results somewhere to make it useful.
How would I accomplish the same task with a Windows Batch file?
To accomplish the same task with a Windows Batch file, you can use the ping command and the set command to store the results. Here is an example script:

@echo off

set IP=8.8.8.8
set TEST_COUNT=0
set FAILURES=0

:loop
set /a TEST_COUNT=TEST_COUNT+1
ping -n 10 %IP% >nul
if %errorlevel% neq 0 set /a FAILURES=FAILURES+1

set /a UPTIME=100-100*FAILURES/TEST_COUNT

echo uptime: %UPTIME%

timeout /t 60 /nobreak >nul
goto loop

This script sets the IP address to ping, the number of tests to run, and the number of failures encountered. It then enters an infinite loop that runs a ping test every minute. The results are stored using the set command, and the uptime percentage is calculated and displayed using the same method as the Bash script. The timeout command is used to pause for 60 seconds before running the next loop.