آموزش تصویری

خوب از همه بگم اگر در ویندوز شما با bat فایل نوشته باشید یا پاورشل اسکریپت آشنایی با اسکریپتینگ دارید.

چرا باید اسکریپت نویسی را یاد بگیریم ؟

به عنوان کسی که بخواد شبکه کار بکنه تست نفوذ بکنه باگ بانتی کنه رد تیم بکنه یا حتی کار بلو تیم انجام بدید باید بتونید یک سری از فرآیندهایی که روزانه تکرار می کنید را بتونید اتومات بکنید وگرنه هر روز باید هزاران کار تکراری بکنید و وقتتان هدر می رود.

Bash scripting در واقع استفاده از کامندهای خود شل لینوکس هست به همراه یکسری عملگرها مثل if else while do …. که تو هر زبان اسکریپت نویسی وجود دارد.

برخی از مواردی که شما باید بدونید:

:                       Returns 0 or true

.                        Executes a shell script

bg                      Puts a job in the background

break                  Exits the current loop

cd                      Changes directory

continue               Resumes the current loop

echo                    Displays the command arguments

eval                    Evaluates the following expression

exec                    Executes the following command without creating a new process

exit                     Quits the shell

export                 Makes a variable or function available to other programs

fg                      Brings a job to the foreground

getopts                 Parses arguments to the shell script

jobs                    Lists background (bg) jobs

pwd                    Displays the current directory

read                    Reads a line from standard input

readonly               Declares as variable as read-only

set                      Lists all variables

shift                    Moves the parameters to the left

test                     Evaluates arguments

[                       Performs a conditional test

times                   Prints the user and system times

trap                    Traps a signal

type                    Displays how each argument would be interpreted as a command

umask                  Changes the default permissions for a new file

unset                   Deletes values from a variable or function

wait                    Waits for a background process to complete

من میخوام بحث رو از ساده ترین موضوع شروع کنم و شما را با ابعاد مختلف اسکریپت نویسی بش آشنا کنم این ویدیو شما را بش اسکریپت نویس نخواهد کرد برای تسلط به بش اسکریپت نویسی باید تمرین کنید و برای خودتان اسکریپت های مختلف بنویسید تا ابتدا با ساختار اسکریپت نویسی بش آشنا بشید و سپس بعد از شروع کنید به بهینه نوشتن اسکریپت !

نوشتن یک hello world  ساده دریک بش اسکریپت

Nano hello.sh

cat helloworld.sh

#!/bin/bash

#Author

#Discription

#changes

echo “hello world”;

chmod +x helloworld.sh

./helloworld.sh

چطور یک متغیر تعریف کنم؟ انواع مختلف متغیر های local و Global

#!/bin/bash

VAR=”Global Var”

تعریف تابع در بش

function bash {

local VAR=”Local Var”

echo $VAR

}

echo $VAR

bash

چطور می تونیم آرگومان بدیم به اسکریپت مان ؟

argument.sh

#!/bin/bash

echo $1 $2 $3

#!/bin/bash

args=(“$@”)

echo ${args[0]} ${args[1]}

#!/bin/bash

args=(“$@”)

#echo ${args[0]} ${args[1]}

echo $@

#!/bin/bash

args=(“$@”)

#echo ${args[0]} ${args[1]}

echo “you type $# argument so”

echo $@

چطوری از کاربر ورودی بگیریم؟

read -p  “salam esmet chie ?” esm

چطوری در اسکریپتم یک فایل را بخوانم ؟

Reading from a file

while read line

do

  echo $line

done < input.txt

یادتون هست گفتم در لینوکس ما سیگنال interrupt داریم ctrl + c  می توانیم در لینوکس تشخیص دهیم سیگنال ها رو

#!/bin/bash

trap “echo The script is terminated; exit” SIGINT

while true

do

    echo Test

    sleep 1

done

#!/bin/bash

trap “echo The script is terminated; echo na…” SIGINT

while true

do

    echo Test

    sleep 1

done

نمایش خروجی یک بش اسکریپت

echo “Hello, World!”

echo “This is some text.” > output.txt

echo “More text.” >> output.txt

Redirecting output:

ls > files.txt

$ ./redirecting.sh

Redirect this STDOUT to STDERR

$ ./redirecting.sh > STDOUT.txt

$ cat STDOUT.txt

$ ./redirecting.sh 1> STDOUT.txt

 2> STDERR.txt

$ cat STDERR.txt

Redirect this STDOUT to STDERR

STDERR from bash script to STDOUT

xarg tee

شرط گذاری در بش اسکریپت

if [[ condition ]];

then

            statement

elif [[ condition ]]; then

            statement

else

            do this by default

fi

a=70

b=90

if [[ $a -gt 90 ]];

then

echo “condition 1 ok”

elif [[ $b -lt 100 ]];

then

echo “condition 2 ok”

else

echo no

fi

Arithmetic Comparisons

-lt         <

-gt        >

-le        <=

-ge       >=

-eq       ==

-ne       !=

String Comparisons

=          equal

!=         not equal

<          less then

>          greater then

-n s1     string s1 is not empty

-z s1     string s1 is empty

#!/bin/bash

S1=”Bash”

#Declare string S2

S2=”Scripting”

if [ $S1 = $S2 ]; then

            echo “Both Strings are equal”

else

            echo “Strings are NOT equal”

fi

چطوری با شرط می توانم فایل ها لینوکسی را چک کنم ؟

Bash File Testing

b filename        Block special file

-c filename       Special character file

-d directoryname        Check for directory existence

-e filename       Check for file existence

-f filename       Check for regular file existence not a directory

-G filename      Check if file exists and is owned by effective group ID.

-g filename       true if file exists and is set-group-id.

-k filename      Sticky bit

-L filename      Symbolic link

-O filename      True if file exists and is owned by the effective user id.

-r filename       Check if file is a readable

-S filename      Check if file is socket

-s filename       Check if file is nonzero size

-u filename      Check if file set-ser-id bit is set

-w filename      Check if file is writable

-x filename       Check if file is executable

مثل:

#!/bin/bash

file=”/etc/passwd”

if [ -e $file ]; then

            echo “File exists”

else

            echo “File does not exist”

fi

استفاده از select

Bash Select

#!/bin/bash

PS3=’Choose one word: ‘

# bash select

select word in “linux” “bash” “scripting” “tutorial”

do

  echo “The word you have selected is: $word”

# Break, otherwise endless loop

  break

done

exit 0

چطور می توانم از Especial character ها در اسکریپت هام استفاده کنم و به مشکل نخورم به قول معروف به چه صورت می شود escape  کرد especial character ها رو؟

Escaping Meta characters

#!/bin/bash

#Declare bash string variable

BASH_VAR=”Bash Script”

# echo variable BASH_VAR

echo $BASH_VAR

#when meta character such us “$” is escaped with “\” it will be read literally

echo \$BASH_VAR

# backslash has also special meaning and it can be suppressed with yet another “\”

echo “\\”

Single quotes

#!/bin/bash

# Declare bash string variable

BASH_VAR=”Bash Script”

# echo variable BASH_VAR

echo $BASH_VAR

# meta characters special meaning in bash is suppressed when  using single quotes

echo ‘$BASH_VAR  “$BASH_VAR”‘

Double quotes

#!/bin/bash

#Declare bash string variable

BASH_VAR=”Bash Script”

# echo variable BASH_VAR

echo $BASH_VAR

# meta characters and its special meaning in bash is

# suppressed when using double quotes except “$”, “\” and “`”

echo “It’s $BASH_VAR  and \”$BASH_VAR\” using backticks: `date`”

Bash quoting with ANSI-C style

\a         alert (bell)        \b         backspace

\e          an escape character     \f          form feed

\n         newline            \r          carriage return

\t          horizontal tab \v         vertical tab

\\          backslash         \`          single quote

\nnn     octal value of characters ( see [http://www.asciitable.com/ ASCII table] )       \xnn     hexadecimal value of characters ( see [http://www.asciitable.com/ ASCII table] )

#!/bin/bash

# as a example we have used \n as a new line, \x40 is hex value for @

# and \56 is octal value for .

echo $’web: www.linuxconfig.org\nemail: web\x40linuxconfig\56org’

چطوری میشه عملیات های ریاضی را در بش انجام داد؟

Bash Addition Calculator Example

#!/bin/bash

let RESULT1=$1+$2

echo $1+$2=$RESULT1 ‘ -> # let RESULT1=$1+$2’

declare -i RESULT2

RESULT2=$1+$2

echo $1+$2=$RESULT2 ‘ -> # declare -i RESULT2; RESULT2=$1+$2’

echo $1+$2=$(($1 + $2)) ‘ -> # $(($1 + $2))’

انواع مختلف لوپ در بش اسکریپت:

While loop

#!/bin/bash

i=1

while [[ $i -le 10 ]] ; do

   echo “$i”

  (( i += 1 ))

done

For loop

#!/bin/bash

for i in {1..5}

do

    echo $i

done

استفاده از آرایه در بش اسکریپت

#!/bin/bash

ARRAY=( ‘Debian Linux’ ‘Redhat Linux’ ‘Ubuntu Linux’ )

ELEMENTS=${#ARRAY[@]}

for (( i=0;i<$ELEMENTS;i++)); do

    echo ${ARRAY[${i}]}

done

چطور می تونم case  بنویسم در بش اسکریپت:

Case statements

case expression in

    pattern1)

        # code to execute if expression matches pattern1

        ;;

    pattern2)

        # code to execute if expression matches pattern2

        ;;

    pattern3)

        # code to execute if expression matches pattern3

        ;;

    *)

        # code to execute if none of the above patterns match expression

        ;;

Esac

یک ویدیو حتما برای crontab داریم ولی چند مثال برای اتومات کردن اسکریپت هایمان:

How to Schedule Scripts using cron

# Cron job example

* * * * * sh /path/to/script.sh

0 0 * * *    Run a script at midnight every day    0 0 * * * /path/to/script.sh

*/5 * * * * Run a script every 5 minutes */5 * * * * /path/to/script.sh

0 6 * * 1-5 Run a script at 6 am from Monday to Friday 0 6 * * 1-5 /path/to/script.sh

0 0 1-7 * * Run a script on the first 7 days of every month        0 0 1-7 * * /path/to/script.sh

0 12 1 * *   Run a script on the first day of every month at noon 0 12 1 * * /path/to/script.sh

چطور در اسکریپتمان دیباگینگ داشته باشیم ؟

چندین روش برای دیباگ کردن اسکریپت هایمان می توانیم استفاده کنیم استفاده از قابلیت دیباگینگ در بش اسکریپت:

debuggign

Set the set -x option

Check the exit code

#!/bin/bash

# Your script goes here

if [ $? -ne 0 ]; then

    echo “Error occurred.”

Fi

استفاده از echo برای مشخص کردن اینکه تا کجا اسکریپت سالم کار کرده است:

Use echo statements

#!/bin/bash

# Your script goes here

echo “Value of variable x is: $x”

# More code goes here

می توانیم از set -e  استفاده کنیم که هر کجا به مشکل خورد اسکریپت سریع بسته شود.

If you want your script to exit immediately when any command in the script fails

#!/bin/bash

set -e

# Your script goes here

یا می توانیم از لاگ سیستم متوجه بشیم

Troubleshooting crons by verifying logs

/var/log/syslog

باید توجه داشت هر چه اسکریپت ما حجمش زیاد می شود دیباگ کردن آن دشوارتر خواهد شد پس باید خیلی تمیز اسکریپت بنویسیم و کامنت بزاریم و از function ها استفاده کنیم تا بتوانیم function به function دیباگ کنیم بدون استفاده از function دیباگ کردن خیلی زمان می برد و بعضی موقع ها غیر ممکن می شود.