eolas/Programming_Languages/Shell/Test_values_in_Bash.md

92 lines
2.3 KiB
Markdown
Raw Normal View History

2023-02-03 14:51:52 +00:00
---
categories:
- Programming Languages
tags:
- shell
---
2023-02-10 18:22:04 +00:00
# Test values in Bash
2023-02-03 14:51:52 +00:00
`test` is a built-in command that is used to compare values or determine whether something is the case.
2023-02-08 13:47:35 +00:00
We can use the command `test` but it is more common to test a condition implicity by using square brackets. The square brackets are an alias for `test`. We use this alias when we use `IF` logic.
2023-02-08 13:17:19 +00:00
2023-02-08 13:47:35 +00:00
When we run a test the result we get back is a return status of a `0` or a `1`. `0` indicates that the test was a success and `1` means failure. (Bear in mind this is in contrast to most all other programming languages.)
If we run a test in the command line we won't get a `0` or a `1` or back, there will just be silence from the shell. We can explicitly invoke the return value with variable `$?`, e.g:
```bash
[ -d ~ ] # is the home directory a directory?
echo $?
0 # yes
[ -d /bin/zsh ] # is this binary a directory?
echo $
01 # no
```
## Test structures
Many tests can be run with flags as a shorthand like we saw above:
### File operators
```
-a FILE True if file exists.
-d FILE True if file is a directory.
-e FILE True if file exists.
2023-03-07 07:39:05 +00:00
-h FILE True if file is a symbolic link
2023-02-08 13:47:35 +00:00
-s FILE True if file exists and is not empty.
-N FILE True if the file has been modified since it was last read.
```
### String operators
```
-z STRING True if string is empty.
-n STRING True if string is not empty.
```
## Differences between comparing numbers and strings
- `=` is reserved for comparing strings
- For numbers we use, e.g, `[ 4 -lt 5 ]`
## Negation
We can negate a test condition with `!`:
```bash
[ ! 4 -lt 3 ]; echo $?
0
```
## Extended test: `[[...]]`
When we use **double brackets** we are using _extended_ `test`.
The extended test supports the standard `test` comparisons and adds other features:
- The use of Boolean operators:
2023-02-10 09:49:28 +00:00
```
2023-02-08 13:47:35 +00:00
[[ -d ~ || -a /bin/mash ]]; echo $?
```
2023-02-26 11:56:30 +00:00
## Further examples
**Test if a character exists in two strings**
```bash
string1="hello"
string2="world"
char="l"
if [[ "$string1" == *"$char"* ]] && [[ "$string2" == *"$char"* ]]; then
echo "Character '$char' exists in both strings."
else
echo "Character '$char' does not exist in both strings."
fi
```
2023-03-07 07:39:05 +00:00
> Note: this syntax can also be used to test if a given element exists in an [array](/Programming_Languages/Shell/Lists_and_arrays.md).