https://bobcopeland.com/blog/2012/10/goto-in-bash/ Skip to content Insignificant Bits Insignificant Bits Posted on October 26, 2012May 21, 2019 by bob goto in bash If you are as old and nerdy as I, you may have spent your grade school days hacking in the BASIC computer language. One of the (mostly hated) features of the (mostly hated) language was that any statement required a line number; this provided both the ability to edit individual lines of the program without a screen editor, as well as de facto labels for the (mostly hated) GOTO and GOSUB commands. But you could also use line numbers to run your program starting from any random point: "RUN 250" might start in the middle of a program, typically after line 250 exited with some syntax error and was subsequently fixed. Today, in bash, we have no such facility. Why on earth would anyone want it, with the presence of actual flow control constructs? Who knows, but asking Google about "bash goto" shows that I am not the first. For my part, at $work, I have a particular script which takes several days to run, each part of which may take many hours, and, due to moon phases, may fail haphazardly. If a command fails, the state up to that point is preserved, so I just need to continue where that left off. Each major part of the job is already factored into individual scripts, so I could cut-and-paste commands from the failure point onward, but I'm lazy. Thus, I present bash goto. It runs sed on itself to strip out any parts of the script that shouldn't run, and then evals it all. Prepare to cringe. #!/bin/bash # include this boilerplate function jumpto { label=$1 cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$') eval "$cmd" exit } start=${1:-"start"} jumpto $start start: # your script goes here... x=100 jumpto foo mid: x=101 echo "This is not printed!" foo: x=${x:-10} echo x is $x results in: $ ./test.sh x is 100 $ ./test.sh foo x is 10 $ ./test.sh mid This is not printed! x is 101 My quest to make bash look like assembly language draws ever nearer to completion. Update 2019/05/21: A reader pointed out that executing one of the labels results in bash complaining "command not found" and suggested putting the labels in a comment, which works just fine without any other changes (but if you like, you can drop the "grep -v" in that case). You might also be interested in the takes of folks on reddit, or my own take of being discussed on reddit. Categorieshacking Tagsbash, basic-hate Post navigation Previous PostPrevious Fake Thanksgiving Next PostNext Olio Search for: [ ] Search Recent Posts * Garden 2023 * Blues For Alice * Four * Moose the Mooche * My One and Only Love Tags amp android arduino ath5k ath9k ath9k_htc ath10k bash basic-hate c++-hate charts crosswords crypto fs fuse gardening git graphics halloween hbase hostapd ipv6 java-hate javascript-hate karma kernel keyboard logarithms mac-hate math memory mesh openwrt parenthood pcb psa python python-hate sd8787 soldering vim wifi wl12xx wmediumd x86 Meta * Log in * Entries RSS * Comments RSS * WordPress.org Proudly powered by WordPress