449
votes
Accepted
How do I trim leading and trailing whitespace from each line of some output?
awk '{$1=$1;print}'
or shorter:
awk '{$1=$1};1'
Would trim leading and trailing space or tab characters1 and also squeeze sequences of tabs and spaces into a single space.
That works because when ...
378
votes
Accepted
The "proper" way to test if a service is running in a script
systemctl has an is-active subcommand for this:
systemctl is-active --quiet service
will exit with status zero if service is active, non-zero otherwise, making it ideal for scripts:
systemctl is-...
371
votes
Parallelize a Bash FOR Loop
Sample task
task(){
sleep 0.5; echo "$1";
}
Sequential runs
for thing in a b c d e f g; do
task "$thing"
done
Parallel runs
for thing in a b c d e f g; do
task "$thing" &
done
...
246
votes
In a bash script, using the conditional "or" in an "if" statement
The accepted answer is good but since you're using bash I'll add the bash solution:
if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then
This is ...
188
votes
How can I get my external IP address in a shell script?
NOTE: This is about external IP address (the one that the servers on the Internet see when you connect to them) - if you want internal IP address (the one that your own computer is using for ...
185
votes
Accepted
Why is pattern "command || true" useful?
The reason for this pattern is that maintainer scripts in Debian packages tend to start with set -e, which causes the shell to exit as soon as any command (strictly speaking, pipeline, list or ...
165
votes
Accepted
Understanding "IFS= read -r line"
In POSIX shells, read, without any option doesn't read a line, it reads words from a (possibly backslash-continued) line, where words are $IFS delimited and backslash can be used to escape the ...
160
votes
Accepted
Replace environment variables in a file with their actual values?
You could use envsubst (part of gnu gettext):
envsubst < infile
will replace the environment variables in your file with their corresponding value. The variable names must consist solely of ...
145
votes
Are there naming conventions for variables in shell scripts?
Yes, there are full code style conventions for bash, including variable names. For example, here's Google's Shell Style Guide.
As a summary for the variable names specifically:
Variable Names: ...
138
votes
How can I pass a command line argument into a shell script?
On a bash script, I personally like to use the following script to set parameters:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\...
137
votes
How to add/remove an element to/from the array in bash?
To add an element to the beginning of an array use.
arr=("new_element" "${arr[@]}")
Generally, you would do.
arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")
To add an element ...
123
votes
Accepted
Joining bash arguments into single string with spaces
I believe that this does what you want. It will put all the arguments in one string, separated by spaces, with single quotes around all:
str="'$*'"
$* produces all the scripts arguments separated ...
122
votes
Accepted
Why does the following script delete itself?
The kernel interprets the line starting with #! and uses it to run the script, passing in the script's name; so this ends up running
/bin/rm scriptname
which deletes the script. (As Stéphane ...
122
votes
Accepted
What does "set --" do in this Dockerfile entrypoint?
The set command (when not setting options) sets the positional parameters
eg
$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c
The -- is the standard "don't treat anything following this as an option"
...
118
votes
Accepted
Bash throws error, line 8: $1: unbound variable
set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, ...
115
votes
Accepted
Shell Syntax: How to correctly use \ to break lines?
If the statement would be correct without continuation, you need to use \. Therefore, the following works without a backslash, as you can't end a command with a &&:
echo 1 &&
echo 2
...
110
votes
Delete the last character of a string using string manipulation in shell script
Using sed it should be as fast as
sed 's/.$//'
Your single echo is then echo ljk | sed 's/.$//'.
Using this, the 1-line string could be any size.
106
votes
Bash: run command2 if command1 fails
The pseudo-code in the question does not correspond to the title of the question.
If anybody needs to actually know how to run command 2 if command 1 fails, this is a simple explanation:
cmd1 || ...
105
votes
Accepted
`Syntax error: "(" unexpected` when creating an array
When you use ./scriptname.sh it executes with /bin/bash as in the first line with #!. But when you use sh scriptname.sh it executes sh, not bash.
The sh shell has no syntax to create arrays, but Bash ...
101
votes
Accepted
How do I remove the newline from the last line in a file in order to add text to that line?
If all you want to do is add text to the last line, it's very easy with sed. Replace $ (pattern matching at the end of the line) by the text you want to add, only on lines in the range $ (which means ...
98
votes
How to add line numbers in every line using shell command?
The right tool for this job is nl:
nl -w2 -s'> ' file
You may want to tune width option according to the total number of lines in the file (if you want numbers to be aligned nicely).
Output:
1&...
96
votes
Accepted
Using grep in conditional statement in bash
You're almost there. Just omit the exclamation mark:
OUTPUT='blah blah (Status: 200)'
if echo "$OUTPUT" | grep -q "(Status:\s200)"; then
echo "MATCH"
fi
Result:
MATCH
The if condition is ...
96
votes
Accepted
Possible to match multiple conditions in one case statement?
You can use the ;;& conjunction. From man bash:
Using ;;& in place of ;; causes the shell to test
the next pattern list in the statement, if any, and execute any
associated ...
90
votes
Accepted
How to get HOME, given USER?
There is a utility which will lookup user information regardless of whether that information is stored in local files such as /etc/passwd or in LDAP or some other method. It's called getent.
In order ...
89
votes
Passing named arguments to shell scripts
This is not a parser for positioned arguments, is for key=value aa=bb arguments;
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
KEY_LENGTH=${#KEY}
VALUE="${...
88
votes
What is the difference between the "...", '...', $'...', and $"..." quotes in the shell?
All of these mean something different, and you can write different things inside them (or the same things, with different meaning). Different kinds of quote interpret different escape sequences inside ...
85
votes
Accepted
bash loop through list of strings
Using arrays in bash can aid readability: this array syntax allows arbitrary whitespace between words.
strings=(
string1
string2
"string with spaces"
stringN
)
for i in "${strings[@]}"...
82
votes
redirecting to /dev/null
To understand "redirecting to /dev/null" easily, write it out explicitly. Below is an example command that tries to remove a non-existent file (to simulate an error).
rm nonexisting.txt 1>...
82
votes
Multiple logical operators, ((A || B) && C), and "syntax error near unexpected token"
The syntax of bash is not C-like, even if a little part of it is inspired by C. You can't simply try to write C code and expect it to work.
The main point of a shell is to run commands. The open-...
82
votes
The "proper" way to test if a service is running in a script
systemctl does have a mode suitable for scripting; use show rather than status, and add the -p / --properties and --value options to get only the output you want.
Here's an example (from an Ubuntu 17....
Only top scored, non community-wiki answers of a minimum length are eligible
Related Tags
shell-script × 16199bash × 6663
shell × 2349
linux × 1879
scripting × 1124
text-processing × 1096
awk × 980
sed × 825
files × 489
grep × 469
command-line × 405
ssh × 373
find × 360
variable × 327
ubuntu × 299
cron × 281
zsh × 279
regular-expression × 238
quoting × 229
ksh × 220
pipe × 217
io-redirection × 206
terminal × 199
date × 195
rename × 175