# Bash

GNU Bourne-Again SHell, an POSIX(file system standard) compliant shell thingy. `sh` is a earlier verison

*The language with literally multiple ways to do everything xO*

Alternatives include zsh shell which is default *interactive* shell after Catalina(you can still run bash scripts with bash with a shebang)

## Defining a Bash Script

```bash
#!/bin/bash
echo Hello World, arg $1
```

Call with `./scriptname.sh test` as that uses the shebang

*Can just run in bash without permission with `bash scriptname.sh` or `. scriptname.sh`*

## Variables

```bash
var1='soap' #no spaces
var1=soap

echo $var1 		# => soap
echo ${var1}	# => soap
echo var1 		# => var1
```

Make var avaliable to all subprocesses

```bash
export name=value 
```

#### String Interpolation

Single quotes won't interpolate anything, but double quotes will.

```bash
"$var1".txt #basically $(echo $var1).txt
```

## Print

printf has more standard behavior doing stuff like newlines

```bash
echo "Hello"
printf "Hello\n"
```

## Evaluate

```bash
$( echo $1 ) 
echo $(echo hi) # => hi
```

^generally better(newer and ez nesting without esacpes)

```bash
echo `echo 1`  # => 1
```

#### Find Length

```bash
test=pets.com
echo ${#test} 	# => 8 (b/c its length 8)
```

## Functions

We supply the arguments directly after the function name. Within the function they are accessible as **$1, $2, etc**.

```bash
print_something () { #create ft
    echo Hello $1 #access arguments
    return 5
}
#OR
function print_something() {
    echo Hello $1 #access arguments
    5
    return #empty return will return output of last command 
}

print_something Mars # call ft
print_something Jupiter
echo The previous function has a return value of $? #$? is last return value 
```

*Export with `export -f myfun` so usable by subshells*

#### Special Parameters

| Symbol | Equivalent                                                 | Example             |
| ------ | ---------------------------------------------------------- | ------------------- |
| $@     | "$1 " "$2"                                                 | \`for INPUT in "$@" |
| $\*    | "$1c$2c..." where c is the first value of the IFS variable |                     |

## Conditionals

`man test` for info about conditionals

```bash
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else 
    echo "$FILE does not exist."
fi

if [ ! -f "$FILE" ]; then
    echo "$FILE does not exist."
fi
```

`man test` for a shit ton more about `[ ]`, p.s never forget the spaces

## Controls

```bash
for i in $( ls ); do
	echo item: $i
done

while [  $COUNTER -lt 10 ]; do
    echo The counter is $COUNTER
    let COUNTER=COUNTER+1 
done

COUNTER=20
until [  $COUNTER -lt 10 ]; do
    echo COUNTER $COUNTER
    let COUNTER-=1
done
```

## Exit

`exit [n]` will close shell with exit status of `[n]`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://openai.gitbook.io/code-cheatsheets/all/bash.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
