This page is about Os Shell scripts (with a accent on the Bash shell)
File extensions are meaningless in UNIX, unlike DOS, where EXE, COM, and BAT indicate executable files.
Linux uses a shebang to define the type of language.
Example of minimal bash text file
The .sh extension denotes shell script files but doesn't make the script executable. See file permission
In another process
Unlike DOS, UNIX does not automatically look in the current directory for a file to execute.
You have to specify:
- the full file name
- or the dot (.) shortcut that refers to the current directory
cd /usr/local/scripts/ $ ./myscript.sh
Unix/Linux search for executables only in directories identified in the PATH variable.
In the same process
If you want to get the variable back, you need to run the script in the same process. For this, you use:
- or Bash - Dot
Run and terminate (exec)
Run a script in the background
Run a script hosted on the internet
bash <(curl -f -L -sS https://example.com/myscript.sh) args
bash <(curl -f -L -sS https://raw.githubusercontent.com/pagespeed/ngx_pagespeed/master/scripts/build_ngx_pagespeed.sh) --help
Timing a script
$SECONDS: The number of seconds the script has been running.
#!/bin/bash TIME_LIMIT=10 INTERVAL=1 echo echo "Hit Control-C to exit before $TIME_LIMIT seconds." echo while [ "$SECONDS" -le "$TIME_LIMIT" ] do # $SECONDS is an internal shell variable. if [ "$SECONDS" -eq 1 ] then units=second else units=seconds fi echo "This script has been running $SECONDS $units." # On a slow or overburdened machine, the script may skip a count #+ every once in a while. sleep $INTERVAL done echo -e "\a" # Beep! exit 0
Get the script Name
The special parameter 0 Expands to the name of the shell or shell script. This is set at shell initialization. If bash is invoked with a file of commands, $0 is set to the name of that file.
If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present. Otherwise, it is set to the file name used to invoke bash, as given by argument zero.
# echo $0
Get the script directory
- for a file
echo $(dirname $0) # saw also echo $( cd $(dirname $0) ; pwd -P )
- for a symlink
echo $( dirname $(realpath "$0") )
Absolute path name
See the underscore special parameter $_
# $() run a subshell therefore there the cd command has no effect SCRIPT_PATH=$( cd $(dirname $0) ; pwd -P )
With the -n or -o noexec option of the set command, the command are not executed and you can then check a shell script for syntax errors.
An environmental variable pointing to a Bash startup file to be read when a script is invoked