آموزش تصویری
خوب از همه بگم اگر در ویندوز شما با 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 دیباگ کردن خیلی زمان می برد و بعضی موقع ها غیر ممکن می شود.