From 19f6739cbaa06b6b40b835115a0361f5e77bd0e0 Mon Sep 17 00:00:00 2001 From: Sriram Sundarraj Date: Fri, 24 Apr 2015 02:36:54 +0530 Subject: [bash/en] Fixed overflowing line. --- bash.html.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 3b163638..35bed9a2 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -235,11 +235,13 @@ uniq -d file.txt cut -d ',' -f 1 file.txt # 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" +# 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 -# if you literally want to search for the string, and not the regex, use fgrep (or grep -F) +# if you literally want to search for the string, +# and not the regex, use fgrep (or grep -F) fgrep "^foo.*bar$" file.txt -- cgit v1.2.3 From 9d3462953604d0d331191bb1fca82295e1ece6ed Mon Sep 17 00:00:00 2001 From: Etan Reisner Date: Sun, 26 Apr 2015 13:22:48 -0400 Subject: Add myself as a contributor. --- bash.html.markdown | 1 + 1 file changed, 1 insertion(+) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 35bed9a2..b9cd53ff 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -10,6 +10,7 @@ contributors: - ["Anton Strömkvist", "http://lutic.org/"] - ["Rahil Momin", "https://github.com/iamrahil"] - ["Gregrory Kielian", "https://github.com/gskielian"] + - ["Etan Reisner", "https://github.com/deryni"] filename: LearnBash.sh --- -- cgit v1.2.3 From e2ca2c9550474ca3dad0f7ef8735e614da081258 Mon Sep 17 00:00:00 2001 From: Etan Reisner Date: Sun, 26 Apr 2015 13:32:41 -0400 Subject: Add another very common shell variable assignment mistake. --- bash.html.markdown | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index b9cd53ff..77ee37f6 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -37,7 +37,14 @@ VARIABLE="Some string" # But not like this: VARIABLE = "Some string" # Bash will decide that VARIABLE is a command it must execute and give an error -# because it couldn't be found. +# because it can't be found. + +# Or like this: +Variable= 'Some string' +# 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 -- cgit v1.2.3 From aa11cc659de990a6c4d4104bcc733f373b079ae7 Mon Sep 17 00:00:00 2001 From: Etan Reisner Date: Mon, 27 Apr 2015 07:30:17 -0400 Subject: Follow variable capitalization on this branch. --- bash.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 77ee37f6..e0c12f97 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -40,9 +40,9 @@ VARIABLE = "Some string" # because it can't be found. # Or like this: -Variable= 'Some string' +VARIABLE= 'Some string' # 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' # command.) -- cgit v1.2.3 From 8758bb845b063b76b55d2c178d0dc393b2a39c5c Mon Sep 17 00:00:00 2001 From: Andrey Samsonov Date: Sat, 2 May 2015 15:34:56 +0400 Subject: Clear that length and position can be set by variable in substring extraction --- bash.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index e0c12f97..81f85d28 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -59,7 +59,8 @@ echo ${VARIABLE/Some/A} # This will substitute the first occurance of "Some" with "A" # Substring from a variable -echo ${VARIABLE:0:7} +LENGTH=7 +echo ${VARIABLE:0:LENGTH} # This will return only the first 7 characters of the value # Default value for variable -- cgit v1.2.3 From 6848f45ebeee759afdaa34e6cdf367fe31bf1bab Mon Sep 17 00:00:00 2001 From: Andrey Samsonov Date: Sat, 2 May 2015 16:21:03 +0400 Subject: Clear explanation of default value expression --- bash.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index e0c12f97..58dc3003 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -64,7 +64,8 @@ echo ${VARIABLE:0:7} # Default value for variable echo ${FOO:-"DefaultValueIfFOOIsMissingOrEmpty"} -# This works for null (FOO=), 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. # Builtin variables: # There are some useful builtin variables, like -- cgit v1.2.3 From 8b7a2fff9a71b8fa8754947434b8b1f184ed2de1 Mon Sep 17 00:00:00 2001 From: Etan Reisner Date: Wed, 29 Apr 2015 22:11:20 -0400 Subject: Don't use ALL_CAPS variable names. ALL_CAPS variable names are traditionally "reserved" for use by the shell/system. (People often try to use PATH for things locally and then wonder why their commands all stop working for example. --- bash.html.markdown | 58 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 4c50c653..937d2c96 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -32,40 +32,40 @@ echo Hello world! echo 'This is the first line'; echo 'This is the second line' # Declaring a variable looks like this: -VARIABLE="Some string" +Variable="Some string" # But not like this: -VARIABLE = "Some string" -# Bash will decide that VARIABLE is a command it must execute and give an error +Variable = "Some string" +# 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' # 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' # command.) # Using the variable: -echo $VARIABLE -echo "$VARIABLE" -echo '$VARIABLE' +echo $Variable +echo "$Variable" +echo '$Variable' # When you use the variable itself — assign it, export it, or else — you write # its name without $. If you want to use variable's value, you should use $. # Note that ' (single quote) won't expand the variables! # String substitution in variables -echo ${VARIABLE/Some/A} +echo ${Variable/Some/A} # This will substitute the first occurance of "Some" with "A" # Substring from a variable -LENGTH=7 -echo ${VARIABLE:0:LENGTH} +Length=7 +echo ${Variable:0:Length} # This will return only the first 7 characters of the value # Default value for variable -echo ${FOO:-"DefaultValueIfFOOIsMissingOrEmpty"} -# This works for null (FOO=) and empty string (FOO=""); zero (FOO=0) returns 0. +echo ${Foo:-"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. # Builtin variables: @@ -78,12 +78,12 @@ echo "Scripts arguments seperated in different variables: $1 $2..." # Reading a value from input: echo "What's your name?" -read NAME # Note that we didn't need to declare a new variable -echo Hello, $NAME! +read Name # Note that we didn't need to declare a new variable +echo Hello, $Name! # We have the usual if structure: # use 'man test' for more info about conditionals -if [ $NAME -ne $USER ] +if [ $Name -ne $USER ] then echo "Your name isn't your username" else @@ -95,14 +95,14 @@ echo "Always executed" || echo "Only executed if first command fails" echo "Always executed" && echo "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 ] +if [ $Name == "Steve" ] && [ $Age -eq 15 ] then - echo "This will run if $NAME is Steve AND $AGE is 15." + echo "This will run if $Name is Steve AND $Age is 15." fi -if [ $NAME == "Daniya" ] || [ $NAME == "Zach" ] +if [ $Name == "Daniya" ] || [ $Name == "Zach" ] then - echo "This will run if $NAME is Daniya OR Zach." + echo "This will run if $Name is Daniya OR Zach." fi # Expressions are denoted with the following format: @@ -171,7 +171,7 @@ echo "There are $(ls | wc -l) items here." echo "There are `ls | wc -l` items here." # Bash uses a case statement that works similarly to switch in Java and C++: -case "$VARIABLE" in +case "$Variable" in #List patterns for the conditions you want to meet 0) echo "There is a zero.";; 1) echo "There is a one.";; @@ -179,10 +179,10 @@ case "$VARIABLE" in esac # for loops iterate for as many arguments given: -# The contents of $VARIABLE is printed three times. -for VARIABLE in {1..3} +# The contents of $Variable is printed three times. +for Variable in {1..3} do - echo "$VARIABLE" + echo "$Variable" done # Or write it the "traditional for loop" way: @@ -193,16 +193,16 @@ done # They can also be used to act on files.. # This will run the command 'cat' on file1 and file2 -for VARIABLE in file1 file2 +for Variable in file1 file2 do - cat "$VARIABLE" + cat "$Variable" done # ..or the output from a command # This will cat the output from ls. -for OUTPUT in $(ls) +for Output in $(ls) do - cat "$OUTPUT" + cat "$Output" done # while loop: @@ -230,7 +230,7 @@ bar () } # Calling your function -foo "My name is" $NAME +foo "My name is" $Name # There are a lot of useful commands you should learn: # prints last 10 lines of file.txt -- cgit v1.2.3 From e4c261567533921f35ce4e65ebfe6621a128992b Mon Sep 17 00:00:00 2001 From: Levi Bostian Date: Mon, 11 May 2015 21:20:02 -0500 Subject: Fix issue with referring to "output.txt" but examples use "output.out" Fixes https://github.com/adambard/learnxinyminutes-docs/issues/1095 --- bash.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 937d2c96..ee783c14 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -144,7 +144,7 @@ python hello.py > /dev/null 2>&1 # if you want to append instead, use ">>": python hello.py >> "output.out" 2>> "error.err" -# Overwrite output.txt, append to error.err, and count lines: +# Overwrite output.out, append to error.err, and count lines: info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err wc -l output.out error.err @@ -152,7 +152,7 @@ wc -l output.out error.err # see: man fd echo <(echo "#helloworld") -# Overwrite output.txt with "#helloworld": +# Overwrite output.out with "#helloworld": cat > output.out <(echo "#helloworld") echo "#helloworld" > output.out echo "#helloworld" | cat > output.out -- cgit v1.2.3 From 8909457ae46dc8fb151ef146acb3f6b8402f3407 Mon Sep 17 00:00:00 2001 From: Liam Edwards-Playne Date: Wed, 20 May 2015 11:23:55 +1000 Subject: fix spelling errors --- bash.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index ee783c14..c2312d7d 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -56,7 +56,7 @@ echo '$Variable' # String substitution in variables echo ${Variable/Some/A} -# This will substitute the first occurance of "Some" with "A" +# This will substitute the first occurence of "Some" with "A" # Substring from a variable Length=7 @@ -74,7 +74,7 @@ echo "Last program return value: $?" echo "Script's PID: $$" echo "Number of arguments: $#" echo "Scripts arguments: $@" -echo "Scripts arguments seperated in different variables: $1 $2..." +echo "Scripts arguments separated in different variables: $1 $2..." # Reading a value from input: echo "What's your name?" -- cgit v1.2.3 From de676b62b83fcaaa9977cca9adb9c38383b64f35 Mon Sep 17 00:00:00 2001 From: Liam Edwards-Playne Date: Tue, 26 May 2015 11:25:07 +1000 Subject: fixed spelling error --- bash.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index c2312d7d..08182c2c 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -56,7 +56,7 @@ echo '$Variable' # String substitution in variables echo ${Variable/Some/A} -# This will substitute the first occurence of "Some" with "A" +# This will substitute the first occurrence of "Some" with "A" # Substring from a variable Length=7 -- cgit v1.2.3 From acc9a73c018a28a9c8ead7b108dd1fdfee7a797b Mon Sep 17 00:00:00 2001 From: ksami Date: Fri, 2 Oct 2015 22:08:27 +0800 Subject: [bash/en] Improved descriptions --- bash.html.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 08182c2c..d4f3d424 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -51,7 +51,7 @@ echo $Variable echo "$Variable" echo '$Variable' # When you use the variable itself — assign it, export it, or else — you write -# its name without $. If you want to use 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! # String substitution in variables @@ -70,11 +70,11 @@ echo ${Foo:-"DefaultValueIfFooIsMissingOrEmpty"} # Builtin variables: # There are some useful builtin variables, like -echo "Last program return value: $?" +echo "Last program's return value: $?" echo "Script's PID: $$" -echo "Number of arguments: $#" -echo "Scripts arguments: $@" -echo "Scripts arguments separated in different variables: $1 $2..." +echo "Number of arguments passed to script: $#" +echo "All arguments passed to script: $@" +echo "Script's arguments separated into different variables: $1 $2..." # Reading a value from input: echo "What's your name?" @@ -108,8 +108,8 @@ fi # Expressions are denoted with the following format: echo $(( 10 + 5 )) -# Unlike other programming languages, bash is a shell — so it works in a context -# of current directory. You can list files and directories in the current +# 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 -- cgit v1.2.3 From 960ee4a1856db8eadb96277bb2422edfa8f2a81c Mon Sep 17 00:00:00 2001 From: Gabriel Halley Date: Wed, 7 Oct 2015 23:11:24 -0400 Subject: removing whitespace all over --- bash.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index d4f3d424..191f916a 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -252,7 +252,7 @@ grep "^foo.*bar$" file.txt grep -c "^foo.*bar$" file.txt # if you literally want to search for the string, # and not the regex, use fgrep (or grep -F) -fgrep "^foo.*bar$" file.txt +fgrep "^foo.*bar$" file.txt # Read Bash shell builtins documentation with the bash 'help' builtin: -- cgit v1.2.3 From f4022052471d6dc0a9c2fb8794e1352253b4c5ad Mon Sep 17 00:00:00 2001 From: Awal Garg Date: Wed, 14 Oct 2015 21:10:28 +0530 Subject: [bash/en] use $var with quotes in conditions --- bash.html.markdown | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 191f916a..211d2944 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -90,17 +90,26 @@ else echo "Your name is your username" fi +# NOTE: if $Name is empty, bash sees the above condition as: +if [ -ne $USER ] +# which is invalid syntax +# so the "safe" way to use potentially empty variables in bash is: +if [ "$Name" -ne $USER ] ... +# which, when $Name is empty, is seen by bash as: +if [ "" -ne $USER ] ... +# which works as expected + # There is also conditional execution echo "Always executed" || echo "Only executed if first command fails" echo "Always executed" && echo "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 ] +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" ] +if [ "$Name" == "Daniya" ] || [ "$Name" == "Zach" ] then echo "This will run if $Name is Daniya OR Zach." fi -- cgit v1.2.3 From 5c8942f7bcb02a59d1e0acefb0069e80de57e01e Mon Sep 17 00:00:00 2001 From: viv1 Date: Mon, 19 Oct 2015 02:50:55 +0530 Subject: [bash/en]...Added info on changing directories --- bash.html.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 211d2944..dfbf9a89 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -130,6 +130,15 @@ ls -l # Lists every file and directory on a separate line # .txt files in the current directory: ls -l | grep "\.txt" +# Since bash works in the context of a current directory, you might want to +# run your command in some other directory. We have cd for changing location: +cd ~ # change to home directory +cd .. # go up one directory + # (^^say, from /home/username/Downloads to /home/username) +cd /home/username/Documents # change to specified directory +cd ~/Documents/.. # still in home directory..isn't it?? + + # You can redirect command input and output (stdin, stdout, and stderr). # Read from stdin until ^EOF$ and overwrite hello.py with the lines # between "EOF": -- cgit v1.2.3 From f94dea8379b5e7a28990eac371f9c9cca19ab472 Mon Sep 17 00:00:00 2001 From: Matteo Baglini Date: Tue, 12 Jan 2016 00:32:03 +0100 Subject: Use proper string comparison syntax --- bash.html.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 211d2944..bd2d5984 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -83,7 +83,7 @@ echo Hello, $Name! # We have the usual if structure: # use 'man test' for more info about conditionals -if [ $Name -ne $USER ] +if [ $Name != $USER ] then echo "Your name isn't your username" else @@ -91,12 +91,12 @@ else fi # NOTE: if $Name is empty, bash sees the above condition as: -if [ -ne $USER ] +if [ != $USER ] # which is invalid syntax # so the "safe" way to use potentially empty variables in bash is: -if [ "$Name" -ne $USER ] ... +if [ "$Name" != $USER ] ... # which, when $Name is empty, is seen by bash as: -if [ "" -ne $USER ] ... +if [ "" != $USER ] ... # which works as expected # There is also conditional execution -- cgit v1.2.3 From 4e5439c21f5ab5ba33e46926b2fc5e44e25362ae Mon Sep 17 00:00:00 2001 From: Viren Nadkarni Date: Thu, 12 May 2016 16:37:50 +0530 Subject: Fix a mistake in fgrep example (#2254) --- bash.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index f3c9cccc..02d7f31e 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -270,7 +270,7 @@ grep "^foo.*bar$" file.txt grep -c "^foo.*bar$" file.txt # if you literally want to search for the string, # and not the regex, use fgrep (or grep -F) -fgrep "^foo.*bar$" file.txt +fgrep "foobar" file.txt # Read Bash shell builtins documentation with the bash 'help' builtin: -- cgit v1.2.3 From d1216a4253c1b03641c10b171030d04227ad8408 Mon Sep 17 00:00:00 2001 From: Sachin Divekar Date: Sun, 26 Jun 2016 18:08:05 +0530 Subject: Add an example of trap command (#1826) * Begin writing document for PCRE Started writing learnxinyminutes document for PCRE to cover general purpose regular expressions. Added introduction and a couple of details. * Change introductory example for regex The old example was incorrect. It's replaced with a simple one. * Add some more introductory text * Add first example * Added more example and a table for proper formatting * Add few more examples * Formatting * Improve example * Edit description of character classes * Add a way to test regex Add https://regex101.com/ web application to test the regex provided in example. * Add example of trap command trap is a very important command to intercept a fatal signal, perform cleanup, and then exit gracefully. It needs an entry in this document. Here a simple and most common example of using trap command i.e. cleanup upon receiving signal is added. * Revert "Add example of trap command" * Add an example of trap command `trap` is a very important command to intercept a fatal signal, perform cleanup, and then exit gracefully. It needs an entry in this document. Here a simple and most common example of using `trap` command i.e. cleanup upon receiving signal is added. --- bash.html.markdown | 3 +++ 1 file changed, 3 insertions(+) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 02d7f31e..c2c3e3f1 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -272,6 +272,9 @@ grep -c "^foo.*bar$" file.txt # 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. +trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM # Read Bash shell builtins documentation with the bash 'help' builtin: help -- cgit v1.2.3 From 8cd7c230aaa708dffb544887baa85de8f3377251 Mon Sep 17 00:00:00 2001 From: Jonathan Wang Date: Sun, 26 Jun 2016 09:04:11 -0400 Subject: [bash/en] basic parameter expansion, and brace expansion (#1533) * Added brace expansion as well as basic parameter expansion * frogot my name * Update bash.html.markdown Added to parameter expansion --- bash.html.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index c2c3e3f1..a62bd167 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -11,6 +11,7 @@ contributors: - ["Rahil Momin", "https://github.com/iamrahil"] - ["Gregrory Kielian", "https://github.com/gskielian"] - ["Etan Reisner", "https://github.com/deryni"] + - ["Jonathan Wang", "https://github.com/Jonathansw" ] filename: LearnBash.sh --- @@ -54,6 +55,13 @@ echo '$Variable' # 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} +# 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} # This will substitute the first occurrence of "Some" with "A" @@ -68,6 +76,12 @@ echo ${Foo:-"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} +# This will output the range from the start value to the end value + # Builtin variables: # There are some useful builtin variables, like echo "Last program's return value: $?" -- cgit v1.2.3 From b16c7ee2d8b41b5db4f713360280c284ca9b1a80 Mon Sep 17 00:00:00 2001 From: Leo Rudberg Date: Sun, 10 Jul 2016 02:04:08 -0500 Subject: [bash/en] Addition to bash (#2302) * Added bash intro edits * Fixed page header * Finalizing updates Implemented my changes in the main bash code chunk instead of as an out-of-code prologue * Final touches * Added citation for John and mkdir content * Added removed original intro back in * Update bash.html.markdown Moved "hard way" link to top of article Fixed spacing Grouped `rm` commands * Fixed typos --- bash.html.markdown | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index a62bd167..b1a14bdb 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -11,7 +11,10 @@ contributors: - ["Rahil Momin", "https://github.com/iamrahil"] - ["Gregrory Kielian", "https://github.com/gskielian"] - ["Etan Reisner", "https://github.com/deryni"] - - ["Jonathan Wang", "https://github.com/Jonathansw" ] + - ["Jonathan Wang", "https://github.com/Jonathansw"] + - ["Leo Rudberg", "https://github.com/LOZORD"] + - ["Betsy Lorton", "https://github.com/schbetsy"] + - ["John Detter", "https://github.com/jdetter"] filename: LearnBash.sh --- @@ -20,6 +23,8 @@ Nearly all examples below can be a part of a shell script or executed directly i [Read more here.](http://www.gnu.org/software/bash/manual/bashref.html) +Another recommened link: [The Command Line Crash Course](http://cli.learncodethehardway.org/book/) + ```bash #!/bin/bash # First line of the script is shebang which tells the system how to execute @@ -90,6 +95,21 @@ echo "Number of arguments passed to script: $#" echo "All arguments passed to script: $@" echo "Script's arguments separated into different variables: $1 $2..." +# Now that we know how to echo and use variables, +# let's learn some of the other basics of bash! + +# Getting our current directory is available through the command `pwd`. +# `pwd` stands for "print working directory". +# We can also use the builtin variable `$PWD`. +# Observer that the following are equivalent: +echo "I'm in $(pwd)" # execs `pwd` and interpolates output +echo "I'm in $PWD" # interpolates the variable + +# If you get too much output in your terminal, or from a script, the command +# `clear` clears your screen +clear +# Ctrl-L also works for clearing output + # Reading a value from input: echo "What's your name?" read Name # Note that we didn't need to declare a new variable @@ -138,12 +158,37 @@ ls # These commands have options that control their execution: ls -l # Lists every file and directory on a separate line +ls -t # Sort the directory contents by last-modified date (descending) +ls -R # Recursively `ls` this directory and all of its subdirectories # Results of the previous command can be passed to the next command as input. # grep command filters the input with provided patterns. That's how we can list # .txt files in the current directory: ls -l | grep "\.txt" +# Use `cat` to print files to stdout: +cat file.txt + +# We can also read the file using `cat`: +Contents=$(cat file.txt) +echo "START OF FILE\n$Contents\nEND OF FILE" + +# Use `cp` to copy files or directories from one place to another. +# `cp` creates NEW versions of the sources, +# so editing the copy won't affect the original (and vice versa). +# Note that it will overwrite the destination if it already exists. +cp srcFile.txt clone.txt +cp -r srcDirectory/ dst/ # recursively copy + +# Look into `scp` or `sftp` if you plan on exchanging files between computers. +# `scp` behaves very similarly to `cp`. +# `sftp` is more interactive. + +# Use `mv` to move files or directories from one place to another. +# `mv` is similar to `cp`, but it deletes the source. +# `mv` is also useful for renaming files! +mv s0urc3.txt dst.txt # sorry, l33t hackers... + # Since bash works in the context of a current directory, you might want to # run your command in some other directory. We have cd for changing location: cd ~ # change to home directory @@ -152,6 +197,14 @@ cd .. # go up one directory cd /home/username/Documents # change to specified directory cd ~/Documents/.. # still in home directory..isn't it?? +# Use subshells to work across directories +(echo "First, I'm here: $PWD") && (cd someDir; echo "Then, I'm here: $PWD") +pwd # still in first directory + +# Use `mkdir` to create new directories. +mkdir myNewDir +# The `-p` flag causes new intermediate directories to be created as necessary. +mkdir -p myNewDir/with/intermediate/directories # You can redirect command input and output (stdin, stdout, and stderr). # Read from stdin until ^EOF$ and overwrite hello.py with the lines @@ -191,7 +244,9 @@ echo "#helloworld" | cat > output.out echo "#helloworld" | tee output.out >/dev/null # Cleanup temporary files verbosely (add '-i' for interactive) +# WARNING: `rm` commands cannot be undone rm -v output.out error.err output-and-error.log +rm -r tempDir/ # recursively delete # Commands can be substituted within other commands using $( ): # The following command displays the number of files and directories in the @@ -282,6 +337,13 @@ sed -i 's/okay/great/g' file.txt 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" + # if you literally want to search for the string, # and not the regex, use fgrep (or grep -F) fgrep "foobar" file.txt @@ -290,6 +352,11 @@ fgrep "foobar" file.txt # Here trap command will execute rm if any one of the three listed signals is received. trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM +# `sudo` is used to perform commands as the superuser +$NAME1=$(whoami) +$NAME2=$(sudo whoami) +echo "Was $NAME1, then became more powerful $NAME2" + # Read Bash shell builtins documentation with the bash 'help' builtin: help help help -- cgit v1.2.3 From 527eab7108f4b5587f4a4afd9dad53ef0de2c565 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Fri, 16 Sep 2016 17:53:18 +1000 Subject: [bash/en] Remove link unavailable resource (#2372) (#2373) Link pointed to a book which was not released. Fixes #2372. --- bash.html.markdown | 2 -- 1 file changed, 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index b1a14bdb..c5260915 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -23,8 +23,6 @@ Nearly all examples below can be a part of a shell script or executed directly i [Read more here.](http://www.gnu.org/software/bash/manual/bashref.html) -Another recommened link: [The Command Line Crash Course](http://cli.learncodethehardway.org/book/) - ```bash #!/bin/bash # First line of the script is shebang which tells the system how to execute -- cgit v1.2.3 From 81975893a7c1ac2dbc4d0db0c16864d751f6c845 Mon Sep 17 00:00:00 2001 From: Tim Heaney Date: Sun, 2 Oct 2016 13:16:12 -0400 Subject: Reword pwd comments (#2402) Getting is redundant. Observe, not observer. --- bash.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index c5260915..7b7a3eef 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -96,10 +96,10 @@ echo "Script's arguments separated into different variables: $1 $2..." # Now that we know how to echo and use variables, # let's learn some of the other basics of bash! -# Getting our current directory is available through the command `pwd`. +# Our current directory is available through the command `pwd`. # `pwd` stands for "print working directory". # We can also use the builtin variable `$PWD`. -# Observer that the following are equivalent: +# Observe that the following are equivalent: echo "I'm in $(pwd)" # execs `pwd` and interpolates output echo "I'm in $PWD" # interpolates the variable -- cgit v1.2.3 From 9b2da0936507da307d2535f65a79a1161d4c2c11 Mon Sep 17 00:00:00 2001 From: Remigiusz Suwalski Date: Thu, 13 Oct 2016 08:25:44 +0200 Subject: Removed excessive dollar signs (#2447) There is no $ when one referencec the name of a variable as Bash is not PHP. --- bash.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 7b7a3eef..271ef62c 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -351,8 +351,8 @@ fgrep "foobar" file.txt trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM # `sudo` is used to perform commands as the superuser -$NAME1=$(whoami) -$NAME2=$(sudo whoami) +NAME1=$(whoami) +NAME2=$(sudo whoami) echo "Was $NAME1, then became more powerful $NAME2" # Read Bash shell builtins documentation with the bash 'help' builtin: -- cgit v1.2.3 From 303de42a2c62193de9418ed5060ed5e99f26ba3a Mon Sep 17 00:00:00 2001 From: Rholais Lii Date: Sun, 12 Feb 2017 23:06:21 +0800 Subject: [bash/en-us]Fix spelling (#2654) * Fix spelling * Remove the contributor tag --- bash.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 271ef62c..14366e4c 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -156,7 +156,7 @@ ls # These commands have options that control their execution: ls -l # Lists every file and directory on a separate line -ls -t # Sort the directory contents by last-modified date (descending) +ls -t # Sorts the directory contents by last-modified date (descending) ls -R # Recursively `ls` this directory and all of its subdirectories # Results of the previous command can be passed to the next command as input. -- cgit v1.2.3 From 96f62560ba5a7be6f2571656fa16f99446da87a0 Mon Sep 17 00:00:00 2001 From: Keith Miyake Date: Fri, 29 Sep 2017 09:09:39 -0700 Subject: [bash/en] Provide example outputs for #549 --- bash.html.markdown | 90 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 24 deletions(-) (limited to 'bash.html.markdown') 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 -- cgit v1.2.3 From 4f86cfaa4433a739b1aa9828138da0f61c664bcd Mon Sep 17 00:00:00 2001 From: Harry Mumford-Turner Date: Mon, 2 Oct 2017 14:10:53 +0100 Subject: [bash/en] Fixed formatting for The Black Hole - [x] I solemnly swear that this is all original content of which I am the original author - [x] Pull request title is prepended with `[language/lang-code]` - [x] Pull request touches only one file (or a set of logically related files with similar changes made) - [x] Content changes are aimed at *intermediate to experienced programmers* (this is a poor format for explaining fundamental programming concepts) - [x] If you've changed any part of the YAML Frontmatter, make sure it is formatted according to [CONTRIBUTING.md](https://github.com/adambard/learnxinyminutes-docs/blob/master/CONTRIBUTING.markdown) - [x] Yes, I have double-checked quotes and field names! --- bash.html.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 76710aa8..981d7a1e 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -15,6 +15,7 @@ contributors: - ["Leo Rudberg", "https://github.com/LOZORD"] - ["Betsy Lorton", "https://github.com/schbetsy"] - ["John Detter", "https://github.com/jdetter"] + - ["Harry Mumford-Turner", "https://github.com/harrymt"] filename: LearnBash.sh --- @@ -235,10 +236,8 @@ EOF 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 +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" -- cgit v1.2.3 From 027e152dda5f26e2aa74f6739c21f9ca3a8a4fde Mon Sep 17 00:00:00 2001 From: Joyce Kung Date: Fri, 13 Oct 2017 12:10:32 -0400 Subject: Fixed line 59 - printing Using echo with ' ' means that the variable won't be expanded, so it should print the literal $Variable instead of some string. --- bash.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bash.html.markdown') diff --git a/bash.html.markdown b/bash.html.markdown index 981d7a1e..0c097c27 100644 --- a/bash.html.markdown +++ b/bash.html.markdown @@ -56,7 +56,7 @@ Variable= 'Some string' # => returns error: "Some string: command not found" # Using the variable: echo $Variable # => Some string echo "$Variable" # => Some string -echo '$Variable' # => Some string +echo '$Variable' # => $Variable # 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! -- cgit v1.2.3