-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBashNotesForProfessionals.txt
executable file
·9366 lines (7668 loc) · 286 KB
/
BashNotesForProfessionals.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Bash
Bash
Notes for Professionals
Notes for Professionals
100+ pages
of professional hints and tricks
GoalKicker.com
Free Programming Books
Disclaimer
This is an unocial free book created for educational purposes and is
not aliated with ocial Bash group(s) or company(s).
All trademarks and registered trademarks are
the property of their respective owners
Contents
About ................................................................................................................................................................................... 1
Chapter 1: Getting started with Bash ................................................................................................................. 2
Section 1.1: Hello World ................................................................................................................................................. 2
Section 1.2: Hello World Using Variables ..................................................................................................................... 4
Section 1.3: Hello World with User Input ...................................................................................................................... 4
Section 1.4: Importance of Quoting in Strings ............................................................................................................ 5
Section 1.5: Viewing information for Bash built-ins .................................................................................................... 6
Section 1.6: Hello World in "Debug" mode .................................................................................................................. 6
Section 1.7: Handling Named Arguments .................................................................................................................... 7
Chapter 2: Script shebang ........................................................................................................................................ 8
Section 2.1: Env shebang .............................................................................................................................................. 8
Section 2.2: Direct shebang .......................................................................................................................................... 8
Section 2.3: Other shebangs ........................................................................................................................................ 8
Chapter 3: Navigating directories ...................................................................................................................... 10
Section 3.1: Absolute vs relative directories .............................................................................................................. 10
Section 3.2: Change to the last directory .................................................................................................................. 10
Section 3.3: Change to the home directory .............................................................................................................. 10
Section 3.4: Change to the Directory of the Script .................................................................................................. 10
Chapter 4: Listing Files ............................................................................................................................................ 12
Section 4.1: List Files in a Long Listing Format ......................................................................................................... 12
Section 4.2: List the Ten Most Recently Modified Files ............................................................................................ 13
Section 4.3: List All Files Including Dotfiles ................................................................................................................ 13
Section 4.4: List Files Without Using `ls` ..................................................................................................................... 13
Section 4.5: List Files ................................................................................................................................................... 14
Section 4.6: List Files in a Tree-Like Format ............................................................................................................. 14
Section 4.7: List Files Sorted by Size .......................................................................................................................... 14
Chapter 5: Using cat .................................................................................................................................................. 16
Section 5.1: Concatenate files ..................................................................................................................................... 16
Section 5.2: Printing the Contents of a File ............................................................................................................... 16
Section 5.3: Write to a file ........................................................................................................................................... 17
Section 5.4: Show non printable characters ............................................................................................................. 17
Section 5.5: Read from standard input ..................................................................................................................... 18
Section 5.6: Display line numbers with output ......................................................................................................... 18
Section 5.7: Concatenate gzipped files ..................................................................................................................... 18
Chapter 6: Grep ........................................................................................................................................................... 20
Section 6.1: How to search a file for a pattern ......................................................................................................... 20
Chapter 7: Aliasing ..................................................................................................................................................... 21
Section 7.1: Bypass an alias ........................................................................................................................................ 21
Section 7.2: Create an Alias ........................................................................................................................................ 21
Section 7.3: Remove an alias ..................................................................................................................................... 21
Section 7.4: The BASH_ALIASES is an internal bash assoc array .......................................................................... 22
Section 7.5: Expand alias ............................................................................................................................................ 22
Section 7.6: List all Aliases .......................................................................................................................................... 22
Chapter 8: Jobs and Processes ........................................................................................................................... 23
Section 8.1: Job handling ............................................................................................................................................ 23
Section 8.2: Check which process running on specific port .................................................................................... 25
Section 8.3: Disowning background job .................................................................................................................... 25
Section 8.4: List Current Jobs ..................................................................................................................................... 25
Section 8.5: Finding information about a running process ..................................................................................... 25
Section 8.6: List all processes ..................................................................................................................................... 26
Chapter 9: Redirection ............................................................................................................................................. 27
Section 9.1: Redirecting standard output .................................................................................................................. 27
Section 9.2: Append vs Truncate ............................................................................................................................... 27
Section 9.3: Redirecting both STDOUT and STDERR .............................................................................................. 28
Section 9.4: Using named pipes ................................................................................................................................. 28
Section 9.5: Redirection to network addresses ........................................................................................................ 30
Section 9.6: Print error messages to stderr .............................................................................................................. 30
Section 9.7: Redirecting multiple commands to the same file ............................................................................... 31
Section 9.8: Redirecting STDIN .................................................................................................................................. 31
Section 9.9: Redirecting STDERR ............................................................................................................................... 32
Section 9.10: STDIN, STDOUT and STDERR explained ............................................................................................ 32
Chapter 10: Control Structures ............................................................................................................................ 34
Section 10.1: Conditional execution of command lists ............................................................................................. 34
Section 10.2: If statement ............................................................................................................................................ 35
Section 10.3: Looping over an array .......................................................................................................................... 36
Section 10.4: Using For Loop to List Iterate Over Numbers .................................................................................... 37
Section 10.5: continue and break ............................................................................................................................... 37
Section 10.6: Loop break ............................................................................................................................................. 37
Section 10.7: While Loop ............................................................................................................................................. 38
Section 10.8: For Loop with C-style syntax ............................................................................................................... 39
Section 10.9: Until Loop ............................................................................................................................................... 39
Section 10.10: Switch statement with case ................................................................................................................ 39
Section 10.11: For Loop without a list-of-words parameter ..................................................................................... 40
Chapter 11: true, false and : commands .......................................................................................................... 41
Section 11.1: Infinite Loop ............................................................................................................................................. 41
Section 11.2: Function Return ...................................................................................................................................... 41
Section 11.3: Code that will always/never be executed ........................................................................................... 41
Chapter 12: Arrays ...................................................................................................................................................... 42
Section 12.1: Array Assignments ................................................................................................................................. 42
Section 12.2: Accessing Array Elements .................................................................................................................... 43
Section 12.3: Array Modification ................................................................................................................................. 43
Section 12.4: Array Iteration ....................................................................................................................................... 44
Section 12.5: Array Length .......................................................................................................................................... 45
Section 12.6: Associative Arrays ................................................................................................................................. 45
Section 12.7: Looping through an array .................................................................................................................... 46
Section 12.8: Destroy, Delete, or Unset an Array ..................................................................................................... 47
Section 12.9: Array from string ................................................................................................................................... 47
Section 12.10: List of initialized indexes ...................................................................................................................... 47
Section 12.11: Reading an entire file into an array .................................................................................................... 48
Section 12.12: Array insert function ............................................................................................................................ 48
Chapter 13: Associative arrays ............................................................................................................................ 50
Section 13.1: Examining assoc arrays ........................................................................................................................ 50
Chapter 14: Functions ............................................................................................................................................... 52
Section 14.1: Functions with arguments ..................................................................................................................... 52
Section 14.2: Simple Function ..................................................................................................................................... 53
Section 14.3: Handling flags and optional parameters ........................................................................................... 53
Section 14.4: Print the function definition .................................................................................................................. 54
Section 14.5: A function that accepts named parameters ...................................................................................... 54
Section 14.6: Return value from a function ............................................................................................................... 55
Section 14.7: The exit code of a function is the exit code of its last command ..................................................... 55
Chapter 15: Bash Parameter Expansion .......................................................................................................... 57
Section 15.1: Modifying the case of alphabetic characters ..................................................................................... 57
Section 15.2: Length of parameter ............................................................................................................................ 57
Section 15.3: Replace pattern in string ...................................................................................................................... 58
Section 15.4: Substrings and subarrays .................................................................................................................... 59
Section 15.5: Delete a pattern from the beginning of a string ................................................................................ 60
Section 15.6: Parameter indirection ........................................................................................................................... 61
Section 15.7: Parameter expansion and filenames .................................................................................................. 61
Section 15.8: Default value substitution ..................................................................................................................... 62
Section 15.9: Delete a pattern from the end of a string .......................................................................................... 62
Section 15.10: Munging during expansion ................................................................................................................. 63
Section 15.11: Error if variable is empty or unset ...................................................................................................... 64
Chapter 16: Copying (cp) ......................................................................................................................................... 65
Section 16.1: Copy a single file .................................................................................................................................... 65
Section 16.2: Copy folders ........................................................................................................................................... 65
Chapter 17: Find ........................................................................................................................................................... 66
Section 17.1: Searching for a file by name or extension .......................................................................................... 66
Section 17.2: Executing commands against a found file ......................................................................................... 66
Section 17.3: Finding file by access / modification time .......................................................................................... 67
Section 17.4: Finding files according to size .............................................................................................................. 68
Section 17.5: Filter the path ......................................................................................................................................... 69
Section 17.6: Finding files by type .............................................................................................................................. 70
Section 17.7: Finding files by specific extension ........................................................................................................ 70
Chapter 18: Using sort .............................................................................................................................................. 71
Section 18.1: Sort command output ........................................................................................................................... 71
Section 18.2: Make output unique .............................................................................................................................. 71
Section 18.3: Numeric sort .......................................................................................................................................... 71
Section 18.4: Sort by keys ........................................................................................................................................... 72
Chapter 19: Sourcing ................................................................................................................................................. 74
Section 19.1: Sourcing a file ......................................................................................................................................... 74
Section 19.2: Sourcing a virtual environment ........................................................................................................... 74
Chapter 20: Here documents and here strings ........................................................................................... 76
Section 20.1: Execute command with here document ............................................................................................. 76
Section 20.2: Indenting here documents .................................................................................................................. 76
Section 20.3: Create a file ........................................................................................................................................... 77
Section 20.4: Here strings ........................................................................................................................................... 77
Section 20.5: Run several commands with sudo ..................................................................................................... 78
Section 20.6: Limit Strings .......................................................................................................................................... 78
Chapter 21: Quoting ................................................................................................................................................... 80
Section 21.1: Double quotes for variable and command substitution .................................................................... 80
Section 21.2: Dierence between double quote and single quote ......................................................................... 80
Section 21.3: Newlines and control characters ......................................................................................................... 81
Section 21.4: Quoting literal text ................................................................................................................................. 81
Chapter 22: Conditional Expressions ................................................................................................................ 83
Section 22.1: File type tests ......................................................................................................................................... 83
Section 22.2: String comparison and matching ....................................................................................................... 83
Section 22.3: Test on exit status of a command ...................................................................................................... 85
Section 22.4: One liner test ......................................................................................................................................... 85
Section 22.5: File comparison .................................................................................................................................... 85
Section 22.6: File access tests .................................................................................................................................... 86
Section 22.7: Numerical comparisons ....................................................................................................................... 86
Chapter 23: Scripting with Parameters ........................................................................................................... 88
Section 23.1: Multiple Parameter Parsing .................................................................................................................. 88
Section 23.2: Argument parsing using a for loop .................................................................................................... 89
Section 23.3: Wrapper script ...................................................................................................................................... 89
Section 23.4: Accessing Parameters ......................................................................................................................... 90
Section 23.5: Split string into an array in Bash ......................................................................................................... 91
Chapter 24: Bash history substitutions ........................................................................................................... 92
Section 24.1: Quick Reference .................................................................................................................................... 92
Section 24.2: Repeat previous command with sudo ............................................................................................... 93
Section 24.3: Search in the command history by pattern ....................................................................................... 93
Section 24.4: Switch to newly created directory with !#:N ...................................................................................... 93
Section 24.5: Using !$ .................................................................................................................................................. 94
Section 24.6: Repeat the previous command with a substitution .......................................................................... 94
Chapter 25: Math ........................................................................................................................................................ 95
Section 25.1: Math using dc ........................................................................................................................................ 95
Section 25.2: Math using bash capabilities ............................................................................................................... 96
Section 25.3: Math using bc ........................................................................................................................................ 96
Section 25.4: Math using expr .................................................................................................................................... 97
Chapter 26: Bash Arithmetic ................................................................................................................................. 98
Section 26.1: Simple arithmetic with (( )) ................................................................................................................... 98
Section 26.2: Arithmetic command ........................................................................................................................... 98
Section 26.3: Simple arithmetic with expr ................................................................................................................. 99
Chapter 27: Scoping ................................................................................................................................................ 100
Section 27.1: Dynamic scoping in action ................................................................................................................. 100
Chapter 28: Process substitution ...................................................................................................................... 101
Section 28.1: Compare two files from the web ....................................................................................................... 101
Section 28.2: Feed a while loop with the output of a command .......................................................................... 101
Section 28.3: Concatenating files ............................................................................................................................ 101
Section 28.4: Stream a file through multiple programs at once .......................................................................... 101
Section 28.5: With paste command ........................................................................................................................ 102
Section 28.6: To avoid usage of a sub-shell ........................................................................................................... 102
Chapter 29: Programmable completion ....................................................................................................... 103
Section 29.1: Simple completion using function ..................................................................................................... 103
Section 29.2: Simple completion for options and filenames ................................................................................ 103
Chapter 30: Customizing PS1 .............................................................................................................................. 104
Section 30.1: Colorize and customize terminal prompt ......................................................................................... 104
Section 30.2: Show git branch name in terminal prompt ..................................................................................... 105
Section 30.3: Show time in terminal prompt ........................................................................................................... 105
Section 30.4: Show a git branch using PROMPT_COMMAND .............................................................................. 106
Section 30.5: Change PS1 prompt ............................................................................................................................ 106
Section 30.6: Show previous command return status and time .......................................................................... 107
Chapter 31: Brace Expansion ............................................................................................................................... 109
Section 31.1: Modifying filename extension ............................................................................................................. 109
Section 31.2: Create directories to group files by month and year ...................................................................... 109
Section 31.3: Create a backup of dotfiles ................................................................................................................ 109
Section 31.4: Use increments .................................................................................................................................... 109
Section 31.5: Using brace expansion to create lists ............................................................................................... 109
Section 31.6: Make Multiple Directories with Sub-Directories ............................................................................... 110
Chapter 32: getopts : smart positional-parameter parsing .............................................................. 111
Section 32.1: pingnmap ............................................................................................................................................. 111
Chapter 33: Debugging .......................................................................................................................................... 113
Section 33.1: Checking the syntax of a script with "-n" .......................................................................................... 113
Section 33.2: Debugging using bashdb .................................................................................................................. 113
Section 33.3: Debugging a bash script with "-x" .................................................................................................... 113
Chapter 34: Pattern matching and regular expressions ..................................................................... 115
Section 34.1: Get captured groups from a regex match against a string ........................................................... 115
Section 34.2: Behaviour when a glob does not match anything ......................................................................... 115
Section 34.3: Check if a string matches a regular expression .............................................................................. 116
Section 34.4: Regex matching .................................................................................................................................. 116
Section 34.5: The * glob ............................................................................................................................................ 116
Section 34.6: The ** glob ........................................................................................................................................... 117
Section 34.7: The ? glob ............................................................................................................................................ 117
Section 34.8: The [ ] glob ......................................................................................................................................... 118
Section 34.9: Matching hidden files ......................................................................................................................... 119
Section 34.10: Case insensitive matching ................................................................................................................ 119
Section 34.11: Extended globbing ............................................................................................................................. 119
Chapter 35: Change shell ...................................................................................................................................... 121
Section 35.1: Find the current shell .......................................................................................................................... 121
Section 35.2: List available shells ............................................................................................................................. 121
Section 35.3: Change the shell ................................................................................................................................. 121
Chapter 36: Internal variables ........................................................................................................................... 122
Section 36.1: Bash internal variables at a glance ................................................................................................... 122
Section 36.2: $@ ........................................................................................................................................................ 123
Section 36.3: $# ......................................................................................................................................................... 123
Section 36.4: $HISTSIZE ............................................................................................................................................ 124
Section 36.5: $FUNCNAME ....................................................................................................................................... 124
Section 36.6: $HOME ................................................................................................................................................. 124
Section 36.7: $IFS ....................................................................................................................................................... 124
Section 36.8: $OLDPWD ............................................................................................................................................ 125
Section 36.9: $PWD ................................................................................................................................................... 125
Section 36.10: $1 $2 $3 etc.. ....................................................................................................................................... 125
Section 36.11: $* .......................................................................................................................................................... 126
Section 36.12: $! .......................................................................................................................................................... 126
Section 36.13: $? ......................................................................................................................................................... 126
Section 36.14: $$ ........................................................................................................................................................ 126
Section 36.15: $RANDOM .......................................................................................................................................... 126
Section 36.16: $BASHPID ........................................................................................................................................... 127
Section 36.17: $BASH_ENV ....................................................................................................................................... 127
Section 36.18: $BASH_VERSINFO ............................................................................................................................ 127
Section 36.19: $BASH_VERSION .............................................................................................................................. 127
Section 36.20: $EDITOR ............................................................................................................................................ 127
Section 36.21: $HOSTNAME ...................................................................................................................................... 127
Section 36.22: $HOSTTYPE ....................................................................................................................................... 127
Section 36.23: $MACHTYPE ...................................................................................................................................... 128
Section 36.24: $OSTYPE ............................................................................................................................................ 128
Section 36.25: $PATH ................................................................................................................................................ 128
Section 36.26: $PPID .................................................................................................................................................. 128
Section 36.27: $SECONDS ......................................................................................................................................... 128
Section 36.28: $SHELLOPTS ..................................................................................................................................... 128
Section 36.29: $_ ....................................................................................................................................................... 129
Section 36.30: $GROUPS ........................................................................................................................................... 129
Section 36.31: $LINENO ............................................................................................................................................. 129
Section 36.32: $SHLVL .............................................................................................................................................. 129
Section 36.33: $UID .................................................................................................................................................... 130
Chapter 37: Job Control ........................................................................................................................................ 131
Section 37.1: List background processes ................................................................................................................ 131
Section 37.2: Bring a background process to the foreground ............................................................................. 131
Section 37.3: Restart stopped background process .............................................................................................. 131
Section 37.4: Run command in background .......................................................................................................... 131
Section 37.5: Stop a foreground process ................................................................................................................ 131
Chapter 38: Case statement ............................................................................................................................... 132
Section 38.1: Simple case statement ....................................................................................................................... 132
Section 38.2: Case statement with fall through ..................................................................................................... 132
Section 38.3: Fall through only if subsequent pattern(s) match .......................................................................... 132
Chapter 39: Read a file (data stream, variable) line-by-line (and/or field-by-field)? ......... 134
Section 39.1: Looping through a file line by line ..................................................................................................... 134
Section 39.2: Looping through the output of a command field by field ............................................................. 134
Section 39.3: Read lines of a file into an array ....................................................................................................... 134
Section 39.4: Read lines of a string into an array .................................................................................................. 134
Section 39.5: Looping through a string line by line ................................................................................................ 135
Section 39.6: Looping through the output of a command line by line ................................................................ 135
Section 39.7: Read a file field by field ..................................................................................................................... 135
Section 39.8: Read a string field by field ................................................................................................................ 136
Section 39.9: Read fields of a file into an array ..................................................................................................... 136
Section 39.10: Read fields of a string into an array ............................................................................................... 136
Section 39.11: Reads file (/etc/passwd) line by line and field by field ................................................................. 137
Chapter 40: File execution sequence ............................................................................................................. 139
Section 40.1: .profile vs .bash_profile (and .bash_login) ....................................................................................... 139
Chapter 41: Splitting Files .................................................................................................................................... 140
Section 41.1: Split a file ............................................................................................................................................... 140
Chapter 42: File Transfer using scp ................................................................................................................ 141
Section 42.1: scp transferring file ............................................................................................................................. 141
Section 42.2: scp transferring multiple files ........................................................................................................... 141
Section 42.3: Downloading file using scp ................................................................................................................ 141
Chapter 43: Pipelines .............................................................................................................................................. 142
Section 43.1: Using |& ................................................................................................................................................. 142
Section 43.2: Show all processes paginated .......................................................................................................... 143
Section 43.3: Modify continuous output of a command ....................................................................................... 143
Chapter 44: Managing PATH environment variable ............................................................................. 144
Section 44.1: Add a path to the PATH environment variable ................................................................................ 144
Section 44.2: Remove a path from the PATH environment variable .................................................................. 144
Chapter 45: Word splitting .................................................................................................................................. 146
Section 45.1: What, when and Why? ........................................................................................................................ 146
Section 45.2: Bad eects of word splitting ............................................................................................................. 146
Section 45.3: Usefulness of word splitting .............................................................................................................. 147
Section 45.4: Splitting by separator changes ......................................................................................................... 148
Section 45.5: Splitting with IFS .................................................................................................................................. 148
Section 45.6: IFS & word splitting ............................................................................................................................. 148
Chapter 46: Avoiding date using printf ........................................................................................................ 150
Section 46.1: Get the current date ............................................................................................................................ 150
Section 46.2: Set variable to current time .............................................................................................................. 150
Chapter 47: Using "trap" to react to signals and system events ................................................... 151
Section 47.1: Introduction: clean up temporary files .............................................................................................. 151
Section 47.2: Catching SIGINT or Ctl+C ................................................................................................................... 151
Section 47.3: Accumulate a list of trap work to run at exit ................................................................................... 152
Section 47.4: Killing Child Processes on Exit ........................................................................................................... 152
Section 47.5: react on change of terminals window size ...................................................................................... 152
Chapter 48: Chain of commands and operations ................................................................................... 154
Section 48.1: Counting a text pattern ocurrence .................................................................................................... 154
Section 48.2: transfer root cmd output to user file ............................................................................................... 154
Section 48.3: logical chaining of commands with && and || ................................................................................. 154
Section 48.4: serial chaining of commands with semicolon ................................................................................. 154
Section 48.5: chaining commands with | ................................................................................................................. 155
Chapter 49: Type of Shells .................................................................................................................................. 156
Section 49.1: Start an interactive shell ..................................................................................................................... 156
Section 49.2: Detect type of shell ............................................................................................................................ 156
Section 49.3: Introduction to dot files ...................................................................................................................... 156
Chapter 50: Color script output (cross-platform) ................................................................................... 158
Section 50.1: color-output.sh .................................................................................................................................... 158
Chapter 51: co-processes ..................................................................................................................................... 159
Section 51.1: Hello World ........................................................................................................................................... 159
Chapter 52: Typing variables ............................................................................................................................. 160
Section 52.1: declare weakly typed variables ........................................................................................................ 160
Chapter 53: Jobs at specific times .................................................................................................................. 161
Section 53.1: Execute job once at specific time ...................................................................................................... 161
Section 53.2: Doing jobs at specified times repeatedly using systemd.timer .................................................... 161
Chapter 54: Handling the system prompt .................................................................................................. 163
Section 54.1: Using the PROMPT_COMMAND envrionment variable .................................................................. 163
Section 54.2: Using PS2 ............................................................................................................................................ 164
Section 54.3: Using PS3 ............................................................................................................................................. 164
Section 54.4: Using PS4 ............................................................................................................................................ 164
Section 54.5: Using PS1 ............................................................................................................................................. 164
Chapter 55: The cut command .......................................................................................................................... 166
Section 55.1: Only one delimiter character ............................................................................................................. 166
Section 55.2: Repeated delimiters are interpreted as empty fields .................................................................... 166
Section 55.3: No quoting ........................................................................................................................................... 166
Section 55.4: Extracting, not manipulating ............................................................................................................. 166
Chapter 56: Bash on Windows 10 ...................................................................................................................... 168
Section 56.1: Readme ................................................................................................................................................ 168
Chapter 57: Cut Command .................................................................................................................................. 169
Section 57.1: Show the first column of a file ........................................................................................................... 169
Section 57.2: Show columns x to y of a file ............................................................................................................ 169
Chapter 58: global and local variables ......................................................................................................... 170
Section 58.1: Global variables ................................................................................................................................... 170
Section 58.2: Local variables .................................................................................................................................... 170
Section 58.3: Mixing the two together ..................................................................................................................... 170
Chapter 59: CGI Scripts .......................................................................................................................................... 172
Section 59.1: Request Method: GET ......................................................................................................................... 172
Section 59.2: Request Method: POST /w JSON ..................................................................................................... 174
Chapter 60: Select keyword ................................................................................................................................ 176
Section 60.1: Select keyword can be used for getting input argument in a menu format ................................ 176
Chapter 61: When to use eval ............................................................................................................................. 177
Section 61.1: Using Eval ............................................................................................................................................. 177
Section 61.2: Using Eval with Getopt ........................................................................................................................ 178
Chapter 62: Networking With Bash ................................................................................................................. 179
Section 62.1: Networking commands ...................................................................................................................... 179
Chapter 63: Parallel ................................................................................................................................................. 181
Section 63.1: Parallelize repetitive tasks on list of files .......................................................................................... 181
Section 63.2: Parallelize STDIN ................................................................................................................................ 181
Chapter 64: Decoding URL .................................................................................................................................. 183
Section 64.1: Simple example ................................................................................................................................... 183
Section 64.2: Using printf to decode a string ......................................................................................................... 183
Chapter 65: Design Patterns ............................................................................................................................... 184
Section 65.1: The Publish/Subscribe (Pub/Sub) Pattern ....................................................................................... 184
Chapter 66: Pitfalls .................................................................................................................................................. 186
Section 66.1: Whitespace When Assigning Variables ............................................................................................ 186
Section 66.2: Failed commands do not stop script execution .............................................................................. 186
Section 66.3: Missing The Last Line in a File ........................................................................................................... 186
Appendix A: Keyboard shortcuts ...................................................................................................................... 187
Section A.1: Editing Shortcuts ................................................................................................................................... 187
Section A.2: Recall Shortcuts ................................................................................................................................... 187
Section A.3: Macros ................................................................................................................................................... 187
Section A.4: Custome Key Bindings ........................................................................................................................ 187
Section A.5: Job Control ........................................................................................................................................... 188
Credits ............................................................................................................................................................................ 189
You may also like ...................................................................................................................................................... 193
About
Please feel free to share this PDF with anyone for free,
latest version of this book can be downloaded from:
http://GoalKicker.com/BashBook
This Bash Notes for Professionals book is compiled from Stack Overflow
Documentation, the content is written by the beautiful people at Stack Overflow.
Text content is released under Creative Commons BY-SA, see credits at the end
of this book whom contributed to the various chapters. Images may be copyright
of their respective owners unless otherwise specified
This is an unofficial free book created for educational purposes and is not
affiliated with official Bash group(s) or company(s) nor Stack Overflow. All
trademarks and registered trademarks are the property of their respective
company owners
The information presented in this book is not guaranteed to be correct nor
accurate, use at your own risk
Please send feedback and corrections to [email protected]
Bash Notes for Professionals
1
Chapter 1: Getting started with Bash
Version Release Date
0.99
1989-06-08
1.01
1989-06-23
2.0
1996-12-31
2.02
1998-04-20
2.03
1999-02-19
2.04
2001-03-21
2.05b 2002-07-17
3.0
2004-08-03
3.1
2005-12-08
3.2
2006-10-11
4.0
2009-02-20
4.1
2009-12-31
4.2
2011-02-13
4.3
2014-02-26
4.4
2016-09-15
Section 1.1: Hello World
Interactive Shell
The Bash shell is commonly used interactively: It lets you enter and edit commands, then executes them when
you press the Return key. Many Unix-based and Unix-like operating systems use Bash as their default shell
(notably Linux and macOS). The terminal automatically enters an interactive Bash shell process on startup.
Output Hello World by typing the following:
echo "Hello World"
#> Hello World # Output Example
Notes
You can change the shell by just typing the name of the shell in terminal. For example: sh, bash, etc.
echo is a Bash builtin command that writes the arguments it receives to the standard output. It appends a
newline to the output, by default.
Non-Interactive Shell
The Bash shell can also be run non-interactively from a script, making the shell require no human interaction.
Interactive behavior and scripted behavior should be identical – an important design consideration of Unix V7
Bourne shell and transitively Bash. Therefore anything that can be done at the command line can be put in a script
file for reuse.
Follow these steps to create a Hello World script:
1. Create a new file called hello-world.sh
touch hello-world.sh
2. Make the script executable by running chmod +x hello-world.sh
3. Add this code:
Bash Notes for Professionals
2
#!/bin/bash
echo "Hello World"
Line 1: The first line of the script must start with the character sequence #!, referred to as shebang1. The
shebang instructs the operating system to run /bin/bash, the Bash shell, passing it the script's path as an
argument.
E.g. /bin/bash hello-world.sh
Line 2: Uses the echo command to write Hello World to the standard output.
4. Execute the hello-world.sh script from the command line using one of the following:
./hello-world.sh – most commonly used, and recommended
/bin/bash hello-world.sh
bash hello-world.sh – assuming /bin is in your $PATH
sh hello-world.sh
For real production use, you would omit the .sh extension (which is misleading anyway, since this is a Bash script,
not a sh script) and perhaps move the file to a directory within your PATH so that it is available to you regardless of
your current working directory, just like a system command such as cat or ls.
Common mistakes include:
1. Forgetting to apply execute permission on the file, i.e., chmod +x hello-world.sh, resulting in the output of
./hello-world.sh: Permission denied.
2. Editing the script on Windows, which produces incorrect line ending characters that Bash cannot handle.
A common symptom is : command not found where the carriage return has forced the cursor to the
beginning of line, overwriting the text before the colon in the error message.
The script can be fixed using the dos2unix program.
An example use: dos2unix hello-world.sh
dos2unix edits the file inline.
3. Using sh ./hello-world.sh, not realizing that bash and sh are distinct shells with distinct features (though
since Bash is backwards-compatible, the opposite mistake is harmless).
Anyway, simply relying on the script's shebang line is vastly preferable to explicitly writing bash or sh (or
python or perl or awk or ruby or...) before each script's file name.
A common shebang line to use in order to make your script more portable is to use #!/usr/bin/env bash
instead of hard-coding a path to Bash. That way, /usr/bin/env has to exist, but beyond that point, bash just
needs to be on your PATH. On many systems, /bin/bash doesn't exist, and you should use
/usr/local/bin/bash or some other absolute path; this change avoids having to figure out the details of
that.
Bash Notes for Professionals
3
1 Also referred to as sha-bang, hashbang, pound-bang, hash-pling.
Section 1.2: Hello World Using Variables
Create a new file called hello.sh with the following content and give it executable permissions with chmod +x
hello.sh.
Execute/Run via: ./hello.sh
#!/usr/bin/env bash
# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"
# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
This will print Hello, World to standard output when executed.
To tell bash where the script is you need to be very specific, by pointing it to the containing directory, normally with
./ if it is your working directory, where . is an alias to the current directory. If you do not specify the directory, bash
tries to locate the script in one of the directories contained in the $PATH environment variable.
The following code accepts an argument $1, which is the first command line argument, and outputs it in a
formatted string, following Hello,.
Execute/Run via: ./hello.sh World
#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
It is important to note that $1 has to be quoted in double quote, not single quote. "$1" expands to the first
command line argument, as desired, while '$1' evaluates to literal string $1.
Security Note:
Read Security implications of forgetting to quote a variable in bash shells to understand the
importance of placing the variable text within double quotes.
Section 1.3: Hello World with User Input
The following will prompt a user for input, and then store that input as a string (text) in a variable. The variable is
then used to give a message to the user.
#!/usr/bin/env bash
echo "Who are you?"
read name
echo "Hello, $name."
The command read here reads one line of data from standard input into the variable name. This is then referenced
Bash Notes for Professionals
4
using $name and printed to standard out using echo.
Example output:
$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
Here the user entered the name "Matt", and this code was used to say Hello, Matt..
And if you want to append something to the variable value while printing it, use curly brackets around the variable
name as shown in the following example:
#!/usr/bin/env bash
echo "What are you doing?"
read action
echo "You are ${action}ing."
Example output:
$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
Here when user enters an action, "ing" is appended to that action while printing.
Section 1.4: Importance of Quoting in Strings
Quoting is important for string expansion in bash. With these, you can control how the bash parses and expands
your strings.
There are two types of quoting:
Weak: uses double quotes: "
Strong: uses single quotes: '
If you want to bash to expand your argument, you can use Weak Quoting:
#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
If you don't want to bash to expand your argument, you can use Strong Quoting:
#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
You can also use escape to prevent expansion:
#!/usr/bin/env bash
world="World"
Bash Notes for Professionals
5
echo "Hello \$world"
#> Hello $world
For more detailed information other than beginner details, you can continue to read it here.
Section 1.5: Viewing information for Bash built-ins
help <command>
This will display the Bash help (manual) page for the specified built-in.
For example, help unset will show:
unset: unset [-f] [-v] [-n] [name ...]
Unset values and attributes of shell variables and functions.
For each NAME, remove the corresponding variable or function.
Options:
-f
treat
-v
treat
-n
treat
rather than
each NAME as
each NAME as
each NAME as
the variable
a shell function
a shell variable
a name reference and unset the variable itself
it references
Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.
Some variables cannot be unset; also see `readonly'.
Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.
To see a list of all built-ins with a short description, use
help -d
Section 1.6: Hello World in "Debug" mode
$ cat hello.sh
#!/bin/bash
echo "Hello World"
$ bash -x hello.sh
+ echo Hello World
Hello World
The -x argument enables you to walk through each line in the script. One good example is here:
$ cat hello.sh
#!/bin/bash
echo "Hello World\n"
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number)
$ ./hello.sh
Hello World
Bash Notes for Professionals
6
expr: non-integer argument
The above prompted error is not enough to trace the script; however, using the following way gives you a better
sense where to look for the error in the script.
$ bash -x hello.sh
+ echo Hello World\n
Hello World
+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
Section 1.7: Handling Named Arguments
#!/bin/bash
deploy=false
uglify=false
while (( $# > 1 )); do case $1 in
--deploy) deploy="$2";;
--uglify) uglify="$2";;
*) break;
esac; shift 2
done
$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"
# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
Bash Notes for Professionals
7
Chapter 2: Script shebang
Section 2.1: Env shebang
To execute a script file with the bash executable found in the PATH environment variable by using the executable
env, the first line of a script file must indicate the absolute path to the env executable with the argument bash:
#!/usr/bin/env bash
The env path in the shebang is resolved and used only if a script is directly launch like this:
script.sh
The script must have execution permission.
The shebang is ignored when a bash interpreter is explicitly indicated to execute a script:
bash script.sh
Section 2.2: Direct shebang
To execute a script file with the bash interpreter, the first line of a script file must indicate the absolute path to the
bash executable to use:
#!/bin/bash
The bash path in the shebang is resolved and used only if a script is directly launch like this:
./script.sh
The script must have execution permission.
The shebang is ignored when a bash interpreter is explicitly indicated to execute a script:
bash script.sh
Section 2.3: Other shebangs
There are two kinds of programs the kernel knows of. A binary program is identified by it's ELF
(ExtenableLoadableFormat) header, which is usually produced by a compiler. The second one are scripts of any
kind.
If a file starts in the very first line with the sequence #! then the next string has to be a pathname of an interpreter.
If the kernel reads this line, it calls the interpreter named by this pathname and gives all of the following words in
this line as arguments to the interpreter. If there is no file named "something" or "wrong":
#!/bin/bash something wrong
echo "This line never gets printed"
bash tries to execute its argument "something wrong" which doesn't exist. The name of the script file is added too.
To see this clearly use an echo shebang:
Bash Notes for Professionals
8
#"/bin/echo something wrong
# and now call this script named "thisscript" like so:
# thisscript one two
# the output will be:
something wrong ./thisscript one two
Some programs like awk use this technique to run longer scripts residing in a disk file.
Bash Notes for Professionals
9
Chapter 3: Navigating directories
Section 3.1: Absolute vs relative directories
To change to an absolutely specified directory, use the entire name, starting with a slash /, thus:
cd /home/username/project/abc
If you want to change to a directory near your current on, you can specify a relative location. For example, if you are
already in /home/username/project, you can enter the subdirectory abc thus:
cd abc
If you want to go to the directory above the current directory, you can use the alias ... For example, if you were in
/home/username/project/abc and wanted to go to /home/username/project, then you would do the following:
cd ..
This may also be called going "up" a directory.
Section 3.2: Change to the last directory
For the current shell, this takes you to the previous directory that you were in, no matter where it was.
cd -
Doing it multiple times effectively "toggles" you being in the current directory or the previous one.
Section 3.3: Change to the home directory
The default directory is the home directory ($HOME, typically /home/username), so cd without any directory takes you
there
cd
Or you could be more explicit:
cd $HOME
A shortcut for the home directory is ~, so that could be used as well.
cd ~
Section 3.4: Change to the Directory of the Script
In general, there are two types of Bash scripts:
1. System tools which operate from the current working directory
2. Project tools which modify files relative to their own place in the files system
For the second type of scripts, it is useful to change to the directory where the script is stored. This can be done
with the following command:
Bash Notes for Professionals
10
cd "$(dirname "$(readlink -f "$0")")"
This command runs 3 commands:
1. readlink -f "$0" determines the path to the current script ($0)
2. dirname converts the path to script to the path to its directory
3. cd changes the current work directory to the directory it receives from dirname
Bash Notes for Professionals
11
Chapter 4: Listing Files
Option
Description
List all entries including ones that start with a dot
-A, --almost-all
List all entries excluding . and ..
-c
Sort files by change time
-d, --directory
List directory entries
-h, --human-readable Show sizes in human readable format (i.e. K, M)
-H
Same as above only with powers of 1000 instead of 1024
-l
Show contents in long-listing format
-o
Long -listing format without group info
-r, --reverse
Show contents in reverse order
-s, --size
Print size of each file in blocks
-S
Sort by file size
--sort=WORD
Sort contents by a word. (i.e size, version, status)
-t
Sort by modification time
-u
Sort by last access time
-v
Sort by version
-1
List one file per line
-a, --all
Section 4.1: List Files in a Long Listing Format
The ls command's -l option prints a specified directory's contents in a long listing format. If no directory is
specified then, by default, the contents of the current directory are listed.
ls -l /etc
Example Output:
total 1204
drwxr-xr-x
-rw-r--r-drwxr-xr-x
...
3 root root
1 root root
2 root root
4096 Apr 21 03:44 acpi
3028 Apr 21 03:38 adduser.conf
4096 Jun 11 20:42 alternatives
The output first displays total, which indicates the total size in blocks of all the files in the listed directory. It then
displays eight columns of information for each file in the listed directory. Below are the details for each column in
the output:
Column No. Example
Description
d
1.1
File type (see table below)
rwxr-xr-x
1.2
Permission string
3
2
Number of hard links
root
3
Owner name
root
4
Owner group
4096
5
File size in bytes
Apr 21 03:44 Modification time
6
acpi
7
File name
File Type
The file type can be one of any of the following characters.
Character
File Type
Bash Notes for Professionals
12
b
c
C
d
D
l
M
n