Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Portable scripting (POSIX compliance) in Bash Scripting - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to print the current working directory in a POSIX-compliant way.

Bash Scripting
echo [1]
Drag options to blanks, or click blank then click option'
Agetcwd
Bcwd
Cpwd
Ddir
Attempts:
3 left
💡 Hint
Common Mistakes
Using non-POSIX commands like 'cwd' or 'getcwd' which may not exist.
Using 'dir' which is not guaranteed to be POSIX-compliant.
2fill in blank
medium

Complete the code to check if a file named 'data.txt' exists in a POSIX-compliant way.

Bash Scripting
if [ [1] "data.txt" ]; then echo "File exists"; fi
Drag options to blanks, or click blank then click option'
A-d
B-e
C-f
D-s
Attempts:
3 left
💡 Hint
Common Mistakes
Using -d which checks only for directories.
Using -f which checks only for regular files.
Using -s which checks if file size is greater than zero.
3fill in blank
hard

Fix the error in the script to assign the output of the 'date' command to a variable in a POSIX-compliant way.

Bash Scripting
current_date=[1]
Drag options to blanks, or click blank then click option'
A`date`
B$(date +%Y-%m-%d)
C${date}
D$(date)
Attempts:
3 left
💡 Hint
Common Mistakes
Using ${date} which tries to expand a variable named date.
Using backticks which can cause issues in nested commands.
Using $(date +%Y-%m-%d) when the question wants just the output of date command.
4fill in blank
hard

Fill both blanks to create a POSIX-compliant loop that prints numbers 1 to 5.

Bash Scripting
i=1
while [ [1] ]; do
  echo $i
  i=[2]
 done
Drag options to blanks, or click blank then click option'
A$i -le 5
B$i -lt 5
C$((i + 1))
D$i + 1
Attempts:
3 left
💡 Hint
Common Mistakes
Using '$i -lt 5' which stops at 4, not 5.
Using 'i=$i + 1' which is not arithmetic expansion.
Using 'i=$i++' which is not POSIX-compliant.
5fill in blank
hard

Fill all three blanks to create a POSIX-compliant script that creates a directory if it does not exist and then changes into it.

Bash Scripting
if [ ! -d [1] ]; then
  [2] [3]
fi
Drag options to blanks, or click blank then click option'
Amyfolder
Bmkdir
C-p
Dcd
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'cd' in the blank where directory creation is expected.
Omitting the '-p' option which is safer for nested directories.
Using a different directory name than 'myfolder'.

Practice

(1/5)
1. Which shebang line is best for writing a portable POSIX-compliant shell script?
easy
A. #!/bin/sh
B. #!/bin/bash
C. #!/usr/bin/env bash
D. #!/bin/zsh

Solution

  1. Step 1: Understand shebang purpose

    The shebang line tells the system which shell to use to run the script.
  2. Step 2: Identify POSIX-compliant shell

    "/bin/sh" is the standard POSIX shell available on most Unix-like systems, ensuring portability.
  3. Final Answer:

    #!/bin/sh -> Option A
  4. Quick Check:

    POSIX shell = #!/bin/sh [OK]
Hint: Use #!/bin/sh for best portability across Unix systems [OK]
Common Mistakes:
  • Using #!/bin/bash which may not exist on all systems
  • Using #!/usr/bin/env bash which depends on env and bash presence
  • Using #!/bin/zsh which is not POSIX standard
2. Which of the following is a POSIX-compliant way to write an if statement in a shell script?
easy
A. if [[ $var -eq 1 ]]; then echo yes; fi
B. if [ $var -eq 1 ]; then echo yes; fi
C. if (( $var == 1 )); then echo yes; fi
D. if test $var = 1; then echo yes; fi

Solution

  1. Step 1: Identify POSIX test syntax

    POSIX shell supports the single bracket [ ] syntax for tests.
  2. Step 2: Check each option

    if [ $var -eq 1 ]; then echo yes; fi uses [ $var -eq 1 ] which is POSIX compliant. if [[ $var -eq 1 ]]; then echo yes; fi uses [[ ]] which is bash-specific. if (( $var == 1 )); then echo yes; fi uses (( )) which is arithmetic syntax in bash. if test $var = 1; then echo yes; fi uses test but with = for numbers, which is string comparison, not numeric.
  3. Final Answer:

    if [ $var -eq 1 ]; then echo yes; fi -> Option B
  4. Quick Check:

    POSIX if test = [ ] syntax [OK]
Hint: Use single brackets [ ] for tests in POSIX scripts [OK]
Common Mistakes:
  • Using [[ ]] which is not POSIX
  • Using (( )) arithmetic syntax not POSIX
  • Using = for numeric comparison instead of -eq
3. What will be the output of this POSIX-compliant script snippet?
count=3
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
done
medium
A. 3 2 1
B. 3 2 1 0
C. 1 2 3
D. Error: syntax not supported

Solution

  1. Step 1: Understand the loop condition

    The loop runs while count is greater than 0.
  2. Step 2: Trace the loop iterations

    Initial count=3, prints 3, decrements to 2; prints 2, decrements to 1; prints 1, decrements to 0; loop ends.
  3. Final Answer:

    3 2 1 -> Option A
  4. Quick Check:

    Loop prints 3 to 1, stops before 0 [OK]
Hint: Loop runs while count > 0, prints then decrements [OK]
Common Mistakes:
  • Expecting 0 to print
  • Confusing -gt with -ge
  • Thinking $(( )) is not POSIX (it is)
4. This script is intended to print all files in the current directory. What is the error?
for file in $(ls); do
  echo $file
 done
medium
A. The echo command is not POSIX compliant
B. Missing 'do' keyword in the for loop
C. Using $(ls) can break on filenames with spaces
D. Incorrect variable name 'file' used in loop

Solution

  1. Step 1: Analyze command substitution usage

    Using $(ls) splits output on whitespace, breaking on filenames with spaces.
  2. Step 2: Identify safer alternative

    Using 'for file in *' is POSIX compliant and handles spaces better.
  3. Final Answer:

    Using $(ls) can break on filenames with spaces -> Option C
  4. Quick Check:

    $(ls) splits on spaces, unsafe for filenames [OK]
Hint: Avoid $(ls); use 'for file in *' for portability [OK]
Common Mistakes:
  • Thinking 'do' is missing (it is present)
  • Assuming variable name matters
  • Believing echo is not POSIX compliant
5. You want to write a POSIX-compliant shell script using only built-in shell commands (no external utilities like grep, cat, wc) that reads lines from a file and counts how many lines contain the word 'error'. Which approach is portable and correct?
hard
A. grep -c 'error' filename
B. for line in $(cat filename); do if echo $line | grep -q 'error'; then count=$((count+1)); fi; done; echo $count
C. cat filename | grep 'error' | wc -l
D. while read line; do case "$line" in *error*) count=$((count+1)) ;; esac; done < filename; echo $count

Solution

  1. Step 1: Evaluate each option for POSIX compliance and correctness

    A: grep -c 'error' filename uses external grep utility. C: cat filename | grep 'error' | wc -l uses external cat, grep, wc utilities. B: while read line; do case "$line" in *error*) count=$((count+1)) ;; esac; done < filename; echo $count uses a while read loop with case pattern matching, fully POSIX compliant pure shell and handles lines safely. D: for line in $(cat filename); do if echo $line | grep -q 'error'; then count=$((count+1)); fi; done; echo $count uses for loop over $(cat filename) which breaks on spaces and uses external cat/grep.
  2. Step 2: Choose the safest and most portable method

    while read line; do case "$line" in *error*) count=$((count+1)) ;; esac; done < filename; echo $count is the best because it reads line by line safely and uses POSIX shell features only.
  3. Final Answer:

    while read line; do case "$line" in *error*) count=$((count+1)) ;; esac; done < filename; echo $count -> Option D
  4. Quick Check:

    Line-by-line read with case is portable and safe [OK]
Hint: Use while read and case for safe POSIX line processing [OK]
Common Mistakes:
  • Using external grep instead of pure shell constructs
  • Using for loop over command substitution breaking on spaces
  • Using unnecessary cat in pipelines
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard