1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-20 05:21:26 +02:00

Merge pull request #4488 from emilyseville7cf-scripts/feature/refresh-bash

[bash/en] Update bash help
This commit is contained in:
Marcel Ribeiro Dantas
2022-11-20 03:41:50 -03:00
committed by GitHub

View File

@@ -18,6 +18,7 @@ contributors:
- ["Harry Mumford-Turner", "https://github.com/harrymt"] - ["Harry Mumford-Turner", "https://github.com/harrymt"]
- ["Martin Nicholson", "https://github.com/mn113"] - ["Martin Nicholson", "https://github.com/mn113"]
- ["Mark Grimwood", "https://github.com/MarkGrimwood"] - ["Mark Grimwood", "https://github.com/MarkGrimwood"]
- ["Emily Grace Seville", "https://github.com/EmilySeville7cfg"]
filename: LearnBash.sh filename: LearnBash.sh
translators: translators:
- ["Dimitri Kokkonis", "https://github.com/kokkonisd"] - ["Dimitri Kokkonis", "https://github.com/kokkonisd"]
@@ -37,104 +38,107 @@ or executed directly in the shell.
# As you already figured, comments start with #. Shebang is also a comment. # As you already figured, comments start with #. Shebang is also a comment.
# Simple hello world example: # Simple hello world example:
echo Hello world! # => Hello world! echo "Hello world!" # => Hello world!
# Each command starts on a new line, or after a semicolon: # Each command starts on a new line, or after a semicolon:
echo 'This is the first line'; echo 'This is the second line' echo "This is the first command"; echo "This is the second command"
# => This is the first line # => This is the first command
# => This is the second line # => This is the second command
# Declaring a variable looks like this: # Declaring a variable looks like this:
Variable="Some string" variable="Some string"
# But not like this: # But not like this:
Variable = "Some string" # => returns error "Variable: command not found" variable = "Some string" # => returns error "variable: command not found"
# Bash will decide that Variable is a command it must execute and give an error # Bash will decide that `variable` is a command it must execute and give an error
# because it can't be found. # because it can't be found.
# Nor like this: # Nor like this:
Variable= 'Some string' # => returns error: "Some string: command not found" variable= "Some string" # => returns error: "Some string: command not found"
# Bash will decide that 'Some string' is a command it must execute and give an # Bash will decide that "Some string" is a command it must execute and give an
# error because it can't be found. (In this case the 'Variable=' part is seen # error because it can't be found. In this case the "variable=" part is seen
# as a variable assignment valid only for the scope of the 'Some string' # as a variable assignment valid only for the scope of the "Some string"
# command.) # command.
# Using the variable: # Using the variable:
echo $Variable # => Some string echo "$variable" # => Some string
echo "$Variable" # => Some string echo '$variable' # => $variable
echo '$Variable' # => $Variable # When you use a variable itself — assign it, export it, or else — you write
# When you use the variable itself — assign it, export it, or else — you write
# its name without $. If you want to use the variable's value, you should use $. # its name without $. If you want to use the variable's value, you should use $.
# Note that ' (single quote) won't expand the variables! # Note that ' (single quote) won't expand the variables!
# You can write variable without surrounding quotes but it's not recommended.
# Parameter expansion ${ }: # Parameter expansion ${...}:
echo ${Variable} # => Some string echo "${variable}" # => Some string
# This is a simple usage of parameter expansion # This is a simple usage of parameter expansion such as two examples above.
# Parameter Expansion gets a value from a variable. # Parameter expansion gets a value from a variable.
# It "expands" or prints the value # It "expands" or prints the value.
# During the expansion time the value or parameter can be modified # During the expansion time the value or parameter can be modified.
# Below are other modifications that add onto this expansion # Below are other modifications that add onto this expansion.
# String substitution in variables # String substitution in variables:
echo ${Variable/Some/A} # => A string echo "${variable/Some/A}" # => A string
# This will substitute the first occurrence of "Some" with "A" # This will substitute the first occurrence of "Some" with "A".
# Substring from a variable # Substring from a variable:
Length=7 length=7
echo ${Variable:0:Length} # => Some st echo "${variable:0:length}" # => Some st
# This will return only the first 7 characters of the value # This will return only the first 7 characters of the value
echo ${Variable: -5} # => tring echo "${variable: -5}" # => tring
# This will return the last 5 characters (note the space before -5) # This will return the last 5 characters (note the space before -5).
# The space before minus is mandatory here.
# String length # String length:
echo ${#Variable} # => 11 echo "${#variable}" # => 11
# Indirect expansion # Indirect expansion:
OtherVariable="Variable" other_variable="variable"
echo ${!OtherVariable} # => Some String echo ${!other_variable} # => Some string
# This will expand the value of OtherVariable # This will expand the value of `other_variable`.
# Default value for variable # The default value for variable:
echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"} echo "${foo:-"DefaultValueIfFooIsMissingOrEmpty"}"
# => DefaultValueIfFooIsMissingOrEmpty # => DefaultValueIfFooIsMissingOrEmpty
# This works for null (Foo=) and empty string (Foo=""); zero (Foo=0) returns 0. # This works for null (foo=) and empty string (foo=""); zero (foo=0) returns 0.
# Note that it only returns default value and doesn't change variable value. # Note that it only returns default value and doesn't change variable value.
# Declare an array with 6 elements # Declare an array with 6 elements:
array0=(one two three four five six) array=(one two three four five six)
# Print first element # Print the first element:
echo $array0 # => "one" echo "${array[0]}" # => "one"
# Print first element # Print all elements:
echo ${array0[0]} # => "one" echo "${array[@]}" # => "one two three four five six"
# Print all elements # Print the number of elements:
echo ${array0[@]} # => "one two three four five six" echo "${#array[@]}" # => "6"
# Print number of elements # Print the number of characters in third element
echo ${#array0[@]} # => "6" echo "${#array[2]}" # => "5"
# Print number of characters in third element # Print 2 elements starting from fourth:
echo ${#array0[2]} # => "5" echo "${array[@]:3:2}" # => "four five"
# Print 2 elements starting from fourth # Print all elements each of them on new line.
echo ${array0[@]:3:2} # => "four five" for item in "${array[@]}"; do
# Print all elements. Each of them on new line. echo "$item"
for i in "${array0[@]}"; do
echo "$i"
done done
# Brace Expansion { }
# Used to generate arbitrary strings
echo {1..10} # => 1 2 3 4 5 6 7 8 9 10
echo {a..z} # => a b c d e f g h i j k l m n o p q r s t u v w x y z
# This will output the range from the start value to the end value
# Built-in variables: # Built-in variables:
# There are some useful built-in variables, like # There are some useful built-in variables, like:
echo "Last program's return value: $?" echo "Last program's return value: $?"
echo "Script's PID: $$" echo "Script's PID: $$"
echo "Number of arguments passed to script: $#" echo "Number of arguments passed to script: $#"
echo "All arguments passed to script: $@" echo "All arguments passed to script: $@"
echo "Script's arguments separated into different variables: $1 $2..." echo "Script's arguments separated into different variables: $1 $2..."
# Brace Expansion {...}
# used to generate arbitrary strings:
echo {1..10} # => 1 2 3 4 5 6 7 8 9 10
echo {a..z} # => a b c d e f g h i j k l m n o p q r s t u v w x y z
# This will output the range from the start value to the end value.
# Note that you can't use variables here:
from=1
to=10
echo {$from..$to} # => {$from..$to}
# Now that we know how to echo and use variables, # Now that we know how to echo and use variables,
# let's learn some of the other basics of bash! # let's learn some of the other basics of Bash!
# Our current directory is available through the command `pwd`. # Our current directory is available through the command `pwd`.
# `pwd` stands for "print working directory". # `pwd` stands for "print working directory".
@@ -144,33 +148,46 @@ echo "I'm in $(pwd)" # execs `pwd` and interpolates output
echo "I'm in $PWD" # interpolates the variable echo "I'm in $PWD" # interpolates the variable
# If you get too much output in your terminal, or from a script, the command # If you get too much output in your terminal, or from a script, the command
# `clear` clears your screen # `clear` clears your screen:
clear clear
# Ctrl-L also works for clearing output # Ctrl-L also works for clearing output.
# Reading a value from input: # Reading a value from input:
echo "What's your name?" echo "What's your name?"
read Name # Note that we didn't need to declare a new variable read name
echo Hello, $Name! # Note that we didn't need to declare a new variable.
echo "Hello, $name!"
# We have the usual if structure: # We have the usual if structure.
# use `man test` for more info about conditionals # Condition is true if the value of $name is not equal to the current user's login username:
if [ $Name != $USER ] if [[ "$name" != "$USER" ]]; then
then
echo "Your name isn't your username" echo "Your name isn't your username"
else else
echo "Your name is your username" echo "Your name is your username"
fi fi
# True if the value of $Name is not equal to the current user's login username
# NOTE: if $Name is empty, bash sees the above condition as: # To use && and || with if statements, you need multiple pairs of square brackets:
if [ != $USER ] read age
# which is invalid syntax if [[ "$name" == "Steve" ]] && [[ "$age" -eq 15 ]]; then
# so the "safe" way to use potentially empty variables in bash is: echo "This will run if $name is Steve AND $age is 15."
if [ "$Name" != $USER ] ... fi
# which, when $Name is empty, is seen by bash as:
if [ "" != $USER ] ... if [[ "$name" == "Daniya" ]] || [[ "$name" == "Zach" ]]; then
# which works as expected echo "This will run if $name is Daniya OR Zach."
fi
# There are other comparison operators for numbers listed below:
# -ne - not equal
# -lt - less than
# -gt - greater than
# -le - less than or equal to
# -ge - greater than or equal to
# There is also the `=~` operator, which tests a string against the Regex pattern:
email=me@example.com
if [[ "$email" =~ [a-z]+@[a-z]{2,}\.(com|net|org) ]]
then
echo "Valid email!"
fi
# There is also conditional execution # There is also conditional execution
echo "Always executed" || echo "Only executed if first command fails" echo "Always executed" || echo "Only executed if first command fails"
@@ -193,27 +210,6 @@ bg
kill %2 kill %2
# %1, %2, etc. can be used for fg and bg as well # %1, %2, etc. can be used for fg and bg as well
# To use && and || with if statements, you need multiple pairs of square brackets:
if [ "$Name" == "Steve" ] && [ "$Age" -eq 15 ]
then
echo "This will run if $Name is Steve AND $Age is 15."
fi
if [ "$Name" == "Daniya" ] || [ "$Name" == "Zach" ]
then
echo "This will run if $Name is Daniya OR Zach."
fi
# There is also the `=~` operator, which tests a string against a Regex pattern:
Email=me@example.com
if [[ "$Email" =~ [a-z]+@[a-z]{2,}\.(com|net|org) ]]
then
echo "Valid email!"
fi
# Note that =~ only works within double [[ ]] square brackets,
# which are subtly different from single [ ].
# See https://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs for more on this.
# Redefine command `ping` as alias to send only 5 packets # Redefine command `ping` as alias to send only 5 packets
alias ping='ping -c 5' alias ping='ping -c 5'
# Escape the alias and use command with this name instead # Escape the alias and use command with this name instead