diff options
| author | Keith Miyake <keith.miyake@gmail.com> | 2017-09-29 09:09:39 -0700 | 
|---|---|---|
| committer | Keith Miyake <keith.miyake@gmail.com> | 2017-09-29 09:09:39 -0700 | 
| commit | 96f62560ba5a7be6f2571656fa16f99446da87a0 (patch) | |
| tree | 72e38c0a5cc0e86c60e9aefcb610ccf2ed27a413 | |
| parent | e27533f7d108c351f3024541e611457509d3d833 (diff) | |
[bash/en] Provide example outputs for #549
| -rw-r--r-- | bash.html.markdown | 90 | 
1 files changed, 66 insertions, 24 deletions
| diff --git a/bash.html.markdown b/bash.html.markdown index 14366e4c..76710aa8 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -30,59 +30,62 @@ Nearly all examples below can be a part of a shell script or executed directly i  # As you already figured, comments start with #. Shebang is also a comment.  # Simple hello world example: -echo Hello world! +echo Hello world! # => Hello world!  # Each command starts on a new line, or after semicolon:  echo 'This is the first line'; echo 'This is the second line' +# => This is the first line +# => This is the second line  # Declaring a variable looks like this:  Variable="Some string"  # But not like this: -Variable = "Some string" +Variable = "Some string" # => returns error "Variable: command not found"  # Bash will decide that Variable is a command it must execute and give an error  # because it can't be found.  # Or like this: -Variable= 'Some string' +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  # 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'  # command.)  # Using the variable: -echo $Variable -echo "$Variable" -echo '$Variable' +echo $Variable # => Some string +echo "$Variable" # => Some string +echo '$Variable' # => Some string  # 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 $.  # Note that ' (single quote) won't expand the variables!  # Parameter expansion ${ }: -echo ${Variable} +echo ${Variable} # => Some string  # This is a simple usage of parameter expansion  # Parameter Expansion gets a value from a variable.  It "expands" or prints the value  # During the expansion time the value or parameter are able to be modified  # Below are other modifications that add onto this expansion  # String substitution in variables -echo ${Variable/Some/A} +echo ${Variable/Some/A} # => A string  # This will substitute the first occurrence of "Some" with "A"  # Substring from a variable  Length=7 -echo ${Variable:0:Length} +echo ${Variable:0:Length} # => Some st  # This will return only the first 7 characters of the value  # Default value for variable -echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"} +echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"}  +# => DefaultValueIfFooIsMissingOrEmpty  # 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.  # Brace Expansion { }  # Used to generate arbitrary strings -echo {1..10} -echo {a..z} +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  # Builtin variables: @@ -121,6 +124,7 @@ then  else      echo "Your name is your username"  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:  if [ != $USER ] @@ -133,7 +137,11 @@ if [ "" != $USER ] ...  # There is also conditional execution  echo "Always executed" || echo "Only executed if first command fails" +# => Always executed  echo "Always executed" && echo "Only executed if first command does NOT fail" +# => Always executed +# => Only executed if first command does NOT fail +  # To use && and || with if statements, you need multiple pairs of square brackets:  if [ "$Name" == "Steve" ] && [ "$Age" -eq 15 ] @@ -147,12 +155,12 @@ then  fi  # Expressions are denoted with the following format: -echo $(( 10 + 5 )) +echo $(( 10 + 5 )) # => 15  # Unlike other programming languages, bash is a shell so it works in the context  # of a current directory. You can list files and directories in the current  # directory with the ls command: -ls +ls # Lists the files and subdirectories contained in the current directory  # These commands have options that control their execution:  ls -l # Lists every file and directory on a separate line @@ -169,7 +177,10 @@ cat file.txt  # We can also read the file using `cat`:  Contents=$(cat file.txt) -echo "START OF FILE\n$Contents\nEND OF FILE" +echo "START OF FILE\n$Contents\nEND OF FILE" # "\n" prints a new line character +# => START OF FILE +# => [contents of file.txt] +# => END OF FILE  # Use `cp` to copy files or directories from one place to another.  # `cp` creates NEW versions of the sources, @@ -203,6 +214,8 @@ pwd # still in first directory  mkdir myNewDir  # The `-p` flag causes new intermediate directories to be created as necessary.  mkdir -p myNewDir/with/intermediate/directories +# if the intermediate directories didn't already exist, running the above +# command without the `-p` flag would return an error  # You can redirect command input and output (stdin, stdout, and stderr).  # Read from stdin until ^EOF$ and overwrite hello.py with the lines @@ -217,12 +230,15 @@ for line in sys.stdin:      print(line, file=sys.stdout)  EOF -# Run hello.py with various stdin, stdout, and stderr redirections: -python hello.py < "input.in" -python hello.py > "output.out" -python hello.py 2> "error.err" -python hello.py > "output-and-error.log" 2>&1 -python hello.py > /dev/null 2>&1 +# Run the hello.py Python script with various stdin, stdout, and  +# stderr redirections: +python hello.py < "input.in" # pass input.in as input to the script +python hello.py > "output.out" # redirect output from the script to output.out +python hello.py 2> "error.err" # redirect error output to error.err +python hello.py > "output-and-error.log" 2>&1 # redirect both output and +																						  # errors to output-and-error.log +python hello.py > /dev/null 2>&1 # redirect all output and errors to  +																 # the black hole, /dev/null, i.e., no output  # The output error will overwrite the file if it exists,  # if you want to append instead, use ">>":  python hello.py >> "output.out" 2>> "error.err" @@ -269,12 +285,19 @@ for Variable in {1..3}  do      echo "$Variable"  done +# => 1 +# => 2 +# => 3 +  # Or write it the "traditional for loop" way:  for ((a=1; a <= 3; a++))  do      echo $a  done +# => 1 +# => 2 +# => 3  # They can also be used to act on files..  # This will run the command 'cat' on file1 and file2 @@ -296,6 +319,7 @@ do      echo "loop body here..."      break  done +# => loop body here...  # You can also define functions  # Definition: @@ -306,6 +330,11 @@ function foo ()      echo "This is a function"      return 0  } +# Call the function `foo` with two arguments, arg1 and arg2: +foo arg1 arg2 +# => Arguments work just like script arguments: arg1 arg2 +# => And: arg1 arg2... +# => This is a function  # or simply  bar () @@ -313,6 +342,8 @@ bar ()      echo "Another way to declare functions!"      return 0  } +# Call the function `bar` with no arguments: +bar # => Another way to declare functions!  # Calling your function  foo "My name is" $Name @@ -320,25 +351,35 @@ foo "My name is" $Name  # There are a lot of useful commands you should learn:  # prints last 10 lines of file.txt  tail -n 10 file.txt +  # prints first 10 lines of file.txt  head -n 10 file.txt +  # sort file.txt's lines  sort file.txt +  # report or omit repeated lines, with -d it reports them  uniq -d file.txt +  # prints only the first column before the ',' character  cut -d ',' -f 1 file.txt -# replaces every occurrence of 'okay' with 'great' in file.txt, (regex compatible) + +# replaces every occurrence of 'okay' with 'great' in file.txt +# (regex compatible)  sed -i 's/okay/great/g' file.txt +  # print to stdout all lines of file.txt which match some regex  # The example prints lines which begin with "foo" and end in "bar"  grep "^foo.*bar$" file.txt +  # pass the option "-c" to instead print the number of lines matching the regex  grep -c "^foo.*bar$" file.txt +  # Other useful options are:  grep -r "^foo.*bar$" someDir/ # recursively `grep`  grep -n "^foo.*bar$" file.txt # give line numbers  grep -rI "^foo.*bar$" someDir/ # recursively `grep`, but ignore binary files +  # perform the same initial search, but filter out the lines containing "baz"  grep "^foo.*bar$" file.txt | grep -v "baz" @@ -346,8 +387,9 @@ grep "^foo.*bar$" file.txt | grep -v "baz"  # and not the regex, use fgrep (or grep -F)  fgrep "foobar" file.txt -# trap command allows you to execute a command when a signal is received by your script. -# Here trap command will execute rm if any one of the three listed signals is received. +# The trap command allows you to execute a command whenever your script  +# receives a signal. Here, trap will execute `rm` if it receives any of the  +# three listed signals.  trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM  # `sudo` is used to perform commands as the superuser | 
