String manipulation is an essential concept for any programmer to master, regardless of language or domain. Even as a Linux system administrator, tasks like processing text files, validating user input, and extracting substrings are common scenarios where knowing string length comes in handy.
Bash provides simple built-in capabilities for determining the length of string variables without needing external libraries. Methods like parameter expansion, expr command, piping to wc/awk cover basic string length evaluation.
In this comprehensive guide, we will deep-dive into the various techniques available, understand their relative performance tradeoffs, handle complex edge cases, and illustrate with realistic scripting examples.
Why Determine String Length?
Here are some example use cases where finding string length is useful:
Input Validation
- Check minimum password length
- Validate usernames based on length
- Restrict text field length in web forms
Data Processing
- Truncate lengthy strings before storing in database
- Extract fixed width substring segments
- Redact strings showing first/last few characters
Text Parsing
- Split strings based on delimiter position
- Parse strings from a log or CSV file
- Format strings for display by adding padding
Security
- Detect buffer overflow input strings
- Identify suspicious long field values
Code Optimization
- Improve string handling performance
- Reduce memory usage for long strings
Determining length allows implementing all this critical string processing logic easily.
Built-in String Length in Bash?
Most modern languages like Python, JavaScript, C# etc. have excellent native string manipulation capabilities – including functions to directly get string lengths.
For example, in Python:
text = "Hello world"
length = len(text) # 11
But as a system scripting language, Bash takes a more minimalist approach focused on simplicity and leveraging other UNIX tools when needed.
It does not have a built-in function like length() to get the string length directly.
However, the methods it does provide fit the Linux philosophy nicely – small reusable utilities that can be composed flexibly to perform all needed text processing tasks.
Next, let‘s explore these built-in approaches for determining string length in Bash.
1. Parameter Expansion
The most straight-forward way to get the length in Bash is using parameter expansion combined with the # symbol:
string="Greetings from Earth"
length=${#string}
echo $length # 20
The string variable is expanded using ${var} syntax and prepending # returns the length.
Some advantages of this method:
- Concise one-liner without external processes
- Fast execution time and lightweight
- Handy for quick checks and validations
Note that it returns 0 for an empty string which can cause issues in some workflows.
Let‘s look at a practical example – checking password length requirements:
read -s -p "Enter new password: " password
pass_length=${#password}
if [[ $pass_length -lt 12 ]]; then
echo "Password too short - must be 12+ chars" >&2
exit 1
else
echo "Strong password - $pass_length characters"
fi
This simple script ensures we enforce a minimum password length policy using string length evaluation via parameter expansion.
2. expr Command
The expr command can evaluate expressions in Bash, including getting the length using the length argument:
string="Learn Linux Shell Scripting"
length=$(expr length "$string")
echo $length # 27
We need to watch out for spaces and special characters when using expr which can necessitate escaping:
string="Hello world! #123"
length=$(expr length "$string") # 16
length=$(expr length ‘Hello world! \#123‘) # 16
While doable, it adds extra overhead compared to native approaches.
Here is an example script to validate text input length from user:
echo "Enter some input text:"
read text
input_len=$(expr length "$text")
if [[ $input_len -gt 20 ]]; then
echo "Input too long - must be <= 20 chars"
else
echo "Valid input - $input_len chars"
fi
So expr gives a portable way to evaluate string length across Bash versions, at the cost of some control characters handling complexity.
3. Piping to wc
The wc (word count) command has a -c flag to print byte counts, which can be used to return string lengths:
text="Linux system administrator"
echo "$text" | wc -c # 25
This makes it convenient for counting characters from files:
logfile="/var/log/nginx/access.log"
cat "$logfile" | wc -c # 1297402
However, it is slower for getting the length of Bash string variables compared to parameter expansion since we need to fork processes.
Let‘s demonstrate getting the length of multiple strings with wc:
strings=("hello" "world" "foo bar")
for str in "${strings[@]}"; do
echo "$str:" $(echo "$str" | wc -c) chars
done
# Output:
# hello: 5 chars
# world: 5 chars
# foo bar: 7 chars
This iterates over the array of strings, piping each one to wc -c to print its length.
So wc is ideal for handling string data from files and streams.
4. Piping to awk
The awk programming language has built-in string handling functions. We can pipe text to awk and access the length function to find string lengths:
text="Learn awk scripting"
echo "$text" | awk ‘{print length}‘ # 18
Let‘s look at an example parsing Apache web server log files using awk to extract only long POST requests:
logfile="/var/log/apache2/access.log"
cat $logfile | awk ‘{
req_length=length($0)
if (req_length > 100 && $6 ~ /POST/) print $0
}‘
Here awk helps filter log lines based on length and HTTP method efficiently without needing temporary files.
The main advantage of awk is allowing complex text processing, analytics and pattern matching capabilities to be leveraged along with convenient access to string lengths.
Performance Comparison
There is a trade-off between convenience and performance when choosing between methods to determine string length in Bash.
To demonstrate this, let‘s benchmark parameter expansion, expr, wc and awk on finding lengths of a long string.
long_str=$(head -c 1M /dev/urandom | base64)
time1=$(time -lp bash -c ‘x=${#long_str}; :‘)
time2=$(time -lp bash -c ‘x=$(expr length "$long_str") ; :‘)
time3=$(time -lp bash -c ‘echo "$long_str" | wc -c > /dev/null‘)
time4=$(time -lp awk ‘length(ENVIRON["long_str"])‘ long_str="$long_str")
echo "Parameter expansion took: $time1"
echo "expr length took: $time2"
echo "wc -c took: $time3"
echo "awk length took: $time4"

Key observations:
- Parameter expansion is 3-4x faster than other methods
exprandwchave similar performanceawkis slowest due to process start-up overhead- Overheads get amplified on larger input strings
So parameter expansion should be preferred where possible for responsiveness. But awk allows implementing more advanced string manipulation logic.
Special Character Handling
Dealing with spaces, newlines and special characters in strings can complicate length calculations:
str=‘Hello\nworld‘ # Line feed inside string
len=${#str} # 12 - newline counted as one char
str="Line 1
Line 2"
len=${#str} # 0 - newline not in quotes
str="Special \$chars#\@"
len=$(expr length $str) # 0 - unquoted special chars
len=$(expr length "$str") # 14 - quoted works
Tips for handling these correctly:
- Use quotes around strings to allow newlines
- Escape or quote special chars with
expr awkandwchandle these strings more gracefully- Consider trimming whitespaces
Validate inputs early to avoid stray characters impacting later processing.
Optimizing Long String Performance
Bash performance degrades significantly for very large strings (1-10MB+). Techniques to handle them efficiently:
- Stream process in chunks rather than reading whole string
- Append to temporary files instead of variables
- Avoid common pitfalls like regex on long input
- Use
ddfor counting binary strings - Consider another language like Python if complexity grows
Profile trajectory of string growth to catch runaway processes early. Parameters like maximum field sizes often indicate poorly designed interfaces rather than legitimate input.
Building Reusable Functions
Rather than rewriting the same string length code, we can wrap logic into reusable functions.
Here is an example parameterized string length checker:
#!/bin/bash
function string_length() {
local input_str=$1
local current_len=$2
local min_len=$3
# Default values
current_len=${#input_str}
min_len=${2:-1}
if [[ $current_len -lt $min_len ]]; then
return 1
else
return 0
fi
}
read -p "Enter string: " user_input
if string_length "$user_input" 10; then
echo "Success: input is long enough"
else
echo "Too short - please try again"
fi
Benefits of functions:
- Avoid code duplication – change logic in one place
- Enforce validation consistently across app
- Enable more complex logic paramterization
- Improve readability with descriptive names
- Reuse across different scripts
The principles of modularity apply just as well to Bash scripts as any other programming paradigm.
Comparison with Other Languages
Most other common languages have robust native string classes – with inbuilt properties and methods to manipulate text efficiently.
For example, Python:
text = "Hello world"
print(len(text)) # 11
print(text[0:5]) # Hello
And JavaScript:
let str = "Welcome to Bash guide"
console.log(str.length) // 22
let substr = str.substring(0, 7) // Welcome
The difference in Bash is leveraging the UNIX philosophy of small modular utilities and commands that work together:
echo "${string:0:5}" # Hello
expr substr $string 5 7 # world
By combining parameter expansion, awk, cut, grep etc. Bash scripters have access to full-fledged string processing capabilities.
Advantages of the Bash approach:
- Tight OS integration and piping between tools
- Much lower memory footprint
- Exploratory approach well suited for ops tasks
- Tools written in faster languages like C
- Simple and modular system
The same philosophy extends to string length checking – with compact, sharp tools integrated smoothly to achieve all needed text manipulation objectives.
Sample Workflows
To tie together some of the concepts we have covered, let‘s illustrate some real-world Bash string length workflows:
1. Log Filtering by String Length
# Long attack pattern attempted
suspicious_pattern=$(grep -i "pattern.*repeat.*100" /var/log/httpd/)
if [[ ${#suspicious_pattern} -ne 0 ]]; then
echo "Suspicious input detected"
# Send security alert
fi
2. Concatenating Strings
names=("John" "Maria" "Tom")
for name in "${names[@]}"; do
# Add padding spaces
spaces=$(expr 15 - $(echo "$name" | wc -c))
padded_name="$name$(printf ‘ %.0s‘ $(seq 1 $spaces))"
export report+="${padded_name}"
done
# $report now contains properly
# spaced & aligned names
3. Truncating Introduction
orig_intro="Welcome new employees to the family here at Megacorp Inc! We look forward to working with you and hope you have a great time with us!"
max_len=60
truncated_intro=${orig_intro:0:$max_len}
echo "$truncated_intro..." # truncated to 60 chars
As we can see, string length evaluation combined with parameter expansion, wc, awk, grep etc. allows easily accomplishing practical text processing tasks.
Conclusion
Finding the length of strings in Bash may seem trivial, but has many subtle complexities around performance, special characters and real-world manipulation logic.
By understanding the different built-in approaches available and when to apply them, Bash scripters can evaluate string lengths with confidence. A few key takeways:
- Prefer parameter expansion ${#var} for best performance
- Leverage expr/awk for complex validation and cases
- Watch out for newlines, spaces, escapes with length
- Encapsulate logic into reusable functions
- Combined with other tools, Bash can handle all string needs
Learning text processing is critical for Linux system administrators and programmers alike. Evaluate string lengths using the techniques covered here as a step toward Bash scripting mastery.


