כיצד לעבוד עם משתנים בבש

משתנים חיוניים אם אתה רוצה לכתוב סקריפטים ולהבין מה אותו קוד שאתה עומד לחתוך ולהדביק מהאינטרנט יעשה למחשב הלינוקס שלך. נתחיל!
משתנים 101
משתנים נקראים סמלים המייצגים מחרוזת או ערך מספרי. כאשר אתה משתמש בהם בפקודות ובביטויים, מתייחסים אליהם כאילו הקלדת את הערך שהם מחזיקים במקום את שם המשתנה.
כדי ליצור משתנה, אתה רק מספק שם וערך עבורו. שמות המשתנים שלך צריכים להיות תיאוריים ולהזכיר לך את הערך שהם מחזיקים. שם משתנה לא יכול להתחיל במספר, והוא גם לא יכול להכיל רווחים. זה יכול, עם זאת, להתחיל עם קו תחתון. מלבד זאת, אתה יכול להשתמש בכל תערובת של תווים אלפאנומריים קטנים וקטנים.
דוגמאות
כאן ניצור חמישה משתנים. הפורמט הוא להקליד את השם, את סימן השווה =
ואת הערך. שים לב שאין רווח לפני או אחרי סימן השווה. מתן ערך למשתנה נקרא לרוב הקצאת ערך למשתנה.
ניצור ארבעה משתני מחרוזות ומשתנה מספרי אחד, this_year:
אני = דייב
my_boost = לינוקס
אותו = פופאי
his_boost = תרד
שנה_זו = 2019
כדי לראות את הערך המוחזק במשתנה, השתמש echo
בפקודה. עליך להקדים את שם המשתנה בסימן דולר $
בכל פעם שאתה מפנה לערך שהוא מכיל, כמוצג להלן:
מהדהד $ my_name
הד $ my_boost
מהדהד $ this_year
בואו נשתמש בכל המשתנים שלנו בבת אחת:
הד "$ my_boost הוא ל- $ me כמו $ his_boost הוא ל- $ him (c) $ this_year"
ערכי המשתנים מחליפים את שמם. ניתן גם לשנות את ערכי המשתנים. כדי להקצות ערך חדש למשתנה, my_boost
אתה פשוט חוזר על מה שעשית כשהקצית את הערך הראשון שלו, כך:
my_boost = טקילה
אם אתה מריץ מחדש את הפקודה הקודמת, כעת תקבל תוצאה אחרת:
הד "$ my_boost הוא ל- $ me כמו $ his_boost הוא ל- $ him (c) $ this_year"
לכן, תוכלו להשתמש באותה פקודה המפנה לאותם משתנים ולקבל תוצאות שונות אם תשנו את הערכים המוחזקים במשתנים.
נדבר על ציטוט משתנים בהמשך. לעת עתה, הנה כמה דברים שכדאי לזכור:
- משתנה במרכאות בודדות
'
מטופל כמחרוזת מילולית, ולא כמשתנה. - משתנים במרכאות
"
מטופלים כמשתנים. - כדי להחזיק את הערך במשתנה, עליך לספק את סימן הדולר
$
. - משתנה ללא סימן הדולר
$
מספק רק את שם המשתנה.
ניתן גם ליצור משתנה שלוקח את ערכו ממשתנה קיים או ממספר משתנים. הפקודה הבאה מגדירה משתנה חדש בשם drink_of_the_Year,
ומקצה לו את הערכים המשותפים של my_boost
ו this_year
משתנים:
drink_of-the_Year = "$ my_boost $ this_year"
הד לשתות_השנה
כיצד להשתמש במשתנים בתסריטים
סקריפטים יופגעו לחלוטין ללא משתנים. משתנים מספקים את הגמישות ההופכת את התסריט לפתרון כללי ולא ספציפי. להמחשת ההבדל, הנה סקריפט הסופר את הקבצים /dev
בספריה.
הקלד את זה לקובץ טקסט ואז שמור אותו כ fcnt.sh
(עבור "ספירת קבצים"):
#! / bin / bash folder_to_count = / dev file_count = $ (ls $ folder_to_count | wc -l) מהדהד $ file_count קבצים ב- $ folder_to_count
לפני שתוכל להריץ את הסקריפט, עליך להפוך אותו להפעלה, כפי שמוצג להלן:
chmod + x fcnt.sh
הקלד את הפעולות הבאות להפעלת הסקריפט:
./fcnt.sh
זה מדפיס את מספר הקבצים /dev
בספריה. ככה זה עובד:
folder_to_count
מוגדר משתנה שנקרא והוא מוגדר להחזיק את המחרוזת "/ dev".file_count
מוגדר משתנה אחר, שנקרא . משתנה זה לוקח את ערכו החלפת פקודה. זהו ביטוי הפקודה בין הסוגריים$( )
. שימו לב שיש סימן דולר$
לפני הסוגריים הראשונים. מבנה זה$( )
מעריך את הפקודות בסוגריים ואז מחזיר את הערך הסופי שלהם. בדוגמה זו, ערך זה מוקצהfile_count
למשתנה. מבחינתfile_count
המשתנה, הוא עבר ערך להחזיק; זה לא עוסק באיך השגת הערך.- הפקודה המוערכת בהחלפת הפקודה מבצעת
ls
רישום קבצים בספריהfolder_to_count
במשתנה, שהוגדר כ- "/ dev". לכן, התסריט מבצע את הפקודה "ls / dev". - The output from this command is piped into the
wc
command. The-l
(line count) option causeswc
to count the number of lines in the output from thels
command. As each file is listed on a separate line, this is the count of files and subdirectories in the “/dev” directory. This value is assigned to thefile_count
variable. - The final line uses echo to output the result.
But this only works for the “/dev” directory. How can we make the script work with any directory? All it takes is one small change.
How to Use Command Line Parameters in Scripts
Many commands, such as ls
and wc
, take command line parameters. These provide information to the command, so it knows what you want it to do. If you want ls
to work on your home directory and also to show hidden files, you can use the following command, where the tilde ~
and the -a
(all) option are command line parameters:
ls ~ -a
Our scripts can accept command line parameters. They’re referenced as $1
for the first parameter, $2
as the second, and so on, up to $9
for the ninth parameter. (Actually, there’s a $0
, as well, but that’s reserved to always hold the script.)
You can reference command line parameters in a script just as you would regular variables. Let’s modify our script, as shown below, and save it with the new name fcnt2.sh
:
#!/bin/bash folder_to_count=$1 file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count
This time, the folder_to_count
variable is assigned the value of the first command line parameter, $1
.
The rest of the script works exactly as it did before. Rather than a specific solution, your script is now a general one. You can use it on any directory because it’s not hardcoded to work only with “/dev.”
Here’s how you make the script executable:
chmod +x fcnt2.sh
Now, try it with a few directories. You can do “/dev” first to make sure you get the same result as before. Type the following:
./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin
You get the same result (207 files) as before for the “/dev” directory. This is encouraging, and you get directory-specific results for each of the other command line parameters.
To shorten the script, you could dispense with the variable, folder_to_count
, altogether, and just reference $1
throughout, as follows:
#!/bin/bash file_count=$(ls $1 wc -l) echo $file_count files in $1
Working with Special Variables
We mentioned $0
, which is always set to the filename of the script. This allows you to use the script to do things like print its name out correctly, even if it’s renamed. This is useful in logging situations, in which you want to know the name of the process that added an entry.
The following are the other special preset variables:
- $#: How many command line parameters were passed to the script.
- [email protected]: All the command line parameters passed to the script.
- $?: The exit status of the last process to run.
- $$: The Process ID (PID) of the current script.
- $USER: The username of the user executing the script.
- $HOSTNAME: The hostname of the computer running the script.
- $SECONDS: The number of seconds the script has been running for.
- $RANDOM: Returns a random number.
- $LINENO: Returns the current line number of the script.
You want to see all of them in one script, don’t you? You can! Save the following as a text file called, special.sh
:
#!/bin/bash echo "There were $# command line parameters" echo "They are: [email protected]" echo "Parameter 1 is: $1" echo "The script is called: $0" # any old process so that we can report on the exit status pwd echo "pwd returned $?" echo "This script has Process ID $$" echo "The script was started by $USER" echo "It is running on $HOSTNAME" sleep 3 echo "It has been running for $SECONDS seconds" echo "Random number: $RANDOM" echo "This is line number $LINENO of the script"
Type the following to make it executable:
chmod +x special.sh
Now, you can run it with a bunch of different command line parameters, as shown below.
Environment Variables
Bash uses environment variables to define and record the properties of the environment it creates when it launches. These hold information Bash can readily access, such as your username, locale, the number of commands your history file can hold, your default editor, and lots more.
To see the active environment variables in your Bash session, use this command:
env | less
If you scroll through the list, you might find some that would be useful to reference in your scripts.
How to Export Variables
When a script runs, it’s in its own process, and the variables it uses cannot be seen outside of that process. If you want to share a variable with another script that your script launches, you have to export that variable. We’ll show you how to this with two scripts.
First, save the following with the filename script_one.sh
:
#!/bin/bash first_var=alpha second_var=bravo # check their values echo "$0: first_var=$first_var, second_var=$second_var" export first_var export second_var ./script_two.sh # check their values again echo "$0: first_var=$first_var, second_var=$second_var"
This creates two variables, first_var
and second_var
, and it assigns some values. It prints these to the terminal window, exports the variables, and calls script_two.sh
. When script_two.sh
terminates, and process flow returns to this script, it again prints the variables to the terminal window. Then, you can see if they changed.
The second script we’ll use is script_two.sh
. This is the script that script_one.sh
calls. Type the following:
#!/bin/bash # check their values echo "$0: first_var=$first_var, second_var=$second_var" # set new values first_var=charlie second_var=delta # check their values again echo "$0: first_var=$first_var, second_var=$second_var"
This second script prints the values of the two variables, assigns new values to them, and then prints them again.
To run these scripts, you have to type the following to make them executable:
chmod +x script_one.sh chmod +x script_two.sh
And now, type the following to launch script_one.sh
:
./script_one.sh
This is what the output tells us:
- script_one.sh prints the values of the variables, which are alpha and bravo.
- script_two.sh prints the values of the variables (alpha and bravo) as it received them.
- script_two.sh changes them to charlie and delta.
- script_one.sh prints the values of the variables, which are still alpha and bravo.
What happens in the second script, stays in the second script. It’s like copies of the variables are sent to the second script, but they’re discarded when that script exits. The original variables in the first script aren’t altered by anything that happens to the copies of them in the second.
How to Quote Variables
You might have noticed that when scripts reference variables, they’re in quotation marks "
. This allows variables to be referenced correctly, so their values are used when the line is executed in the script.
If the value you assign to a variable includes spaces, they must be in quotation marks when you assign them to the variable. This is because, by default, Bash uses a space as a delimiter.
Here’s an example:
site_name=How-To Geek
Bash sees the space before “Geek” as an indication that a new command is starting. It reports that there is no such command, and abandons the line. echo
shows us that the site_name
variable holds nothing—not even the “How-To” text.
Try that again with quotation marks around the value, as shown below:
site_name="How-To Geek"
This time, it’s recognized as a single value and assigned correctly to the site_name
variable.
echo Is Your Friend
It can take some time to get used to command substitution, quoting variables, and remembering when to include the dollar sign.
לפני שתלחץ על Enter ותבצע שורה של פקודות Bash, נסה אותה echo
לפניה. בדרך זו תוכלו לוודא שמה שיקרה הוא מה שאתם רוצים. אתה יכול גם לתפוס את כל הטעויות שעשית בתחביר.