basic-statement

title: "courses/bash-course - basic-statement.md"

- **fileName**: basic-statement
- **Created on**: 2024-06-07 11:05:24
echo "welcome from yossef"

adding variable name=$(whoami)

name=$(whoami)
echo "welcome mr , $name"

if statement man test

if [ -f /home/$USER/dotfiles]; then
	echo "the file is there"
else 
	echo "the config file not there"
fi

File-based conditions:

Condition True if Example/explanation
[ -a existingfile ] file 'existingfile' exists. if [ -a tmp.tmp ]; thenrm -f tmp.tmp # _Make sure we're not bothered by an old temporary file_fi
[ -b blockspecialfile ] file 'blockspecialfile' exists and is block special. Block special files are special kernel files found in /dev, mainly used for ATA devices like hard disks, cd-roms and floppy disks.if [ -b /dev/fd0 ]; thendd if=floppy.img of=/dev/fd0 # _Write an image to a floppy_fi
[ -c characterspecialfile ] file 'characterspecialfile' exists and is character special. Character special files are special kernel files found in /dev, used for all kinds of purposes (audio hardware, tty's, but also /dev/null).if [ -c /dev/dsp ]; thencat raw.wav > /dev/dsp # _This actually works for certain raw wav files_fi
[ -d directory ] file 'directory' exists and is a directory. In UNIX-style, directories are a special kind of file.if [ -d ~/.kde ]; thenecho "You seem to be a kde user."fi
[ -e existingfile ] file 'existingfile' exists. (same as -a, see that entry for an example)
[ -f regularfile ] file 'regularfile' exists and is a regular file. A regular file is neither a block or character special file nor a directory.if [ -f ~/.bashrc ]; thensource ~/.bashrcfi
[ -g sgidfile ] file 'sgidfile' exists and is set-group-ID. When the SGID-bit is set on a directory, all files created in that directory will inherit the group of the directory.if [ -g . ]; thenecho "Created files are inheriting the group '$(ls -ld . | awk '{ print $4 }')' from the working directory."fi
[ -G fileownedbyeffectivegroup ] file 'fileownedbyeffectivegroup' exists and is owned by the effective group ID. The effective group id is the primary group id of the executing user.if [ ! -G file ]; then # _An exclamation mark inverts the outcome of the condition following it_chgrp $(id -g) file # _Change the group if it's not the effective one_fi
[ -h symboliclink ] file 'symboliclink' exists and is a symbolic link. if [ -h pathtofile];thenpathtofile=(readlink -e $pathtofile) # _Make sure $pathtofile contains the actual file and not a symlink to it_fi
[ -k stickyfile ] file 'stickyfile' exists and has its sticky bit set. The sticky bit has got quite a history, but is now used to prevent world-writable directories from having their contents deletable by anyone.if [ ! -k /tmp ]; then # _An exclamation mark inverts the outcome of the condition following it_echo "Warning! Anyone can delete and/or rename your files in /tmp!"fi
[ -L symboliclink ] file 'symboliclink' exists and is a symbolic link. (same as -h, see that entry for an example)
[ -N modifiedsincelastread ] file 'modifiedsincelastread' exists and was modified after the last read. if [ -N /etc/crontab ]; thenkillall -HUP crond # _SIGHUP makes crond reread all crontabs_fi
[ -O fileownedbyeffectiveuser ] file 'fileownedbyeffectiveuser' exists and is owned by the user executing the script. if [ -O file ]; thenchmod 600 file # _Makes the file private, which is a bad idea if you don't own it_fi
[ -p namedpipe ] file 'namedpipe' exists and is a named pipe. A named pipe is a file in /dev/fd/ that can be read just once. See my bash tutorial for a case in which it's used.if [ -p $file ]; thencp $file tmp.tmp # _Make sure we'll be able to read_file="tmp.tmp"    # _the file as many times as we like_fi
[ -r readablefile ] file 'readablefile' exists and is readable to the script. if [-r file ]; thencontent=$(cat file) # _Set $content to the content of the file_fi
[ -s nonemptyfile ] file 'nonemptyfile' exists and has a size of more than 0 bytes. if [ -s logfile ]; thengzip logfile    # _Backup the old logfile_touch logfile # _before creating a fresh one._fi
[ -S socket ] file 'socket' exists and is a socket. A socket file is used for inter-process communication, and features an interface similar to a network connection.if [ -S /var/lib/mysql/mysql.sock ]; thenmysql --socket=/var/lib/mysql/mysql.sock # _See this MySQL tip_fi
[ -t openterminal ] file descriptor 'openterminal' exists and refers to an open terminal. Virtually everything is done using files on Linux/UNIX, and the terminal is no exception.if [ -t /dev/pts/3 ]; thenecho -e "nHello there. Message from terminal $(tty) to you." > /dev/pts/3 # _Anyone using that terminal will actually see this message!_fi
[ -u suidfile ] file 'suidfile' exists and is set-user-ID. Setting the suid-bit on a file causes execution of that file to be done with the credentials of the owner of the file, not of the executing user.if [ -u executable ]; thenecho "Running program executable as user $(ls -l executable | awk '{ print $3 }')."fi
[ -w writeablefile ] file 'writeablefile' exists and is writeable to the script. if [ -w /dev/hda ]; thengrub-install /dev/hdafi
[ -x executablefile ] file 'executablefile' exists and is executable for the script. Note that the execute permission on a directory means that it's searchable (you can see which files it contains).if [ -x /root ]; thenecho "You can view the contents of the /root directory."fi
[ newerfile -nt olderfile ] file 'newerfile' was changed more recently than 'olderfile', or if 'newerfile' exists and 'olderfile' doesn't. if [ story.txt1 -nt story.txt ]; thenecho "story.txt1 is newer than story.txt; I suggest continuing with the former."fi
[ olderfile -ot newerfile ] file 'olderfile' was changed longer ago than 'newerfile', or if 'newerfile' exists and 'olderfile' doesn't. if [ /mnt/remote/remotefile -ot localfile ]; thencp -f localfile /mnt/remote/remotefile # _Make sure the remote location has the newest version of the file, too_fi
[ same -ef file ] file 'same' and file 'file' refer to the same device/inode number. if [ /dev/cdrom -ef /dev/dvd ]; thenecho "Your primary cd drive appears to read dvd's, too."fi

String-based conditions:

Condition True if Example/explanation [ STRING1 == STRING2 ] STRING1 is equal to STRING2. if [ "$1" == "moo" ]; thenecho $cow # _Ever tried executing 'apt-get moo'?_fiNote: you can also use a single "=" instead of a double one. [ STRING1 != STRING2 ] STRING1 is not equal to STRING2. if [ "userinput"!="password" ]; thenecho "Access denied! Wrong password!"exit 1 # _Stops script execution right here_fi [ STRING1 > STRING2 ] STRING1 sorts after STRING2 in the current locale (lexographically). The backslash before the angle bracket is there because the bracket needs to be escaped to be interpreted correctly. As an example we have a basic bubble sort:_(Don't feel ashamed if you don't understand this, it is a more complex example)_array=( linux tutorial blog )swaps=1while (( swaps > 0 )); doswaps=0for (( i=0; i < (( {#array[@]} - 1 )) ; i++ )); doif [ "{array[i]}" > "{array[(( i + 1 ))]}" ]; then # _Here is the sorting condition_tempstring={array[i]}array[i]={array[(( i + 1 ))]}array[((i+1))]=tempstring(( swaps=swaps + 1 ))fidonedoneecho ${array[@]} # Returns "blog linux tutorial" [ STRING1 < STRING2 ] STRING1 sorts before STRING2 in the current locale (lexographically). [ -n NONEMPTYSTRING ] NONEMPTYSTRING has a length of more than zero. This condition only accepts valid strings, so be sure to quote anything you give to it.if [ -n "userinput"];thenuserinput=parse(userinput) # _Only parse if the user actually gave some input._fiNote that you can also omit the "-n", as brackets with just a string in it behave the same. [ -z EMPTYSTRING ] EMPTYSTRING is an empty string. This condition also accepts non-string input, like an uninitialized variable:if [ -z $uninitializedvar ]; thenuninitializedvar="initialized" # _-z returns true on an uninitialized variable, so we initialize it here._fi Double-bracket syntax only: STRING1 =~ REGEXPATTERN STRING1 matches REGEXPATTERN. If you are familiar with Regular Expressions, you can use this conditions to perform a regex match.if "email" =~ "b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}b" ; thenecho "$email contains a valid e-mail address."fi ###  3. Arithmetic (number-based) conditions: Condition True if Example/explanation [ NUM1 -eq NUM2 ] NUM1 is EQual to NUM2. These conditions only accept integer numbers. Strings will be converted to integer numbers, if possible. Some random examples:if [ ? -eq 0 ]; then # _? returns the exit status of the previous command_echo "Previous command ran succesfully."fiif [ $(ps -p $pid -o ni=) -ne $(nice) ]; thenecho "Process $pid is running with a non-default nice value"fiif [ $num -lt 0 ]; thenecho "Negative numbers not allowed; exiting..."exit 1fi [ NUM1 -ne NUM2 ] NUM1 is Not Equal to NUM2. [ NUM1 -gt NUM2 ] NUM1 is Greater Than NUM2. [ NUM1 -ge NUM2 ] NUM1 is Greater than or Equal to NUM2. [ NUM1 -lt NUM2 ] NUM1 is Less Than NUM2. [ NUM1 -le NUM2 ] NUM1 is Less than or Equal to NUM2. ### 4. Miscellaneous conditions: Condition True if Example/explanation [ -o shelloption ] shell option 'shelloption' is enabled. Shell options modify the behaviour of bash, except a few unmodifiable ones that indicate the shell status.if [ ! -o checkwinsize ] # _An exclamation mark inverts the outcome of the condition following it_echo "Shell option checkwinsize is disabled; enabling it so you can resize you terminal window without problems."shopt -s checkwinsize # _This shell option is modifiable_fiif [ -o login_shell ]; thenecho "This a a login shell." # _This shell option is not modifiable_fi

With the double-parenthesis syntax, you can use the following conditions:

Double-parenthesis syntax conditions:

Condition True if Example/explanation
(( NUM1 == NUM2 )) NUM1 is equal to NUM2. These conditions only accept integer numbers. Strings will be converted to integer numbers, if possible. Some random examples:if (( ? == 0 )); then # _? returns the exit status of the previous command_echo "Previous command ran succesfully."fiif (( $(ps -p $pid -o ni=) != $(nice) )); thenecho "Process $pid is running with a non-default nice value"fiif (( $num < 0 )); thenecho "Negative numbers not allowed; exiting..."exit 1fi
(( NUM1 != NUM2 )) NUM1 is not equal to NUM2.
(( NUM1 > NUM2 )) NUM1 is greater than NUM2.
(( NUM1 >= NUM2 )) NUM1 is greater than or equal to NUM2.
(( NUM1 < NUM2 )) NUM1 is less than NUM2.
(( NUM1 <= NUM2 )) NUM1 is less than or equal to NUM2.

continue:exit-code.md
before: intro-bash.md