Bash에서 변수로 작업하는 방법

스크립트를 작성하고 웹에서 잘라내어 붙여 넣으려는 코드가 Linux 컴퓨터에 미치는 영향을 이해하려면 변수가 중요합니다. 시작하겠습니다!

변수 101

변수는 문자열 또는 숫자 값을 나타내는 명명 된 기호입니다. 명령 및 표현식에서 사용하면 변수 이름 대신 보유한 값을 입력 한 것처럼 처리됩니다.

변수를 만들려면 이름과 값만 제공하면됩니다. 변수 이름은 설명 적이어야하며 보유한 값을 상기시켜야합니다. 변수 이름은 숫자로 시작할 수 없으며 공백을 포함 할 수 없습니다. 그러나 밑줄로 시작할 수 있습니다. 그 외에도 대문자 및 소문자 영숫자를 혼합하여 사용할 수 있습니다.

여기에서 5 개의 변수를 생성합니다. 형식은 이름, 등호 =및 값을 입력하는 것입니다. 등호 앞뒤에는 공백이 없습니다. 변수에 값을 부여하는 것은 종종 변수에 값을 할당 하는 것으로 참조됩니다 .

4 개의 문자열 변수와 1 개의 숫자 변수를 생성합니다. this_year:

me = 데이브
my_boost = 리눅스
him = 뽀빠이
his_boost = 시금치
this_year = 2019

변수에있는 값을 보려면 echo명령을 사용하십시오 . $아래와 같이 포함 된 값을 참조 할 때마다 변수 이름 앞에 달러 기호를 붙여야합니다 .

에코 $ my_name
에코 $ my_boost
echo $ this_year

모든 변수를 한 번에 사용합시다.

echo "$ my_boost는 $ me에게, $ his_boost는 $ him (c) $ this_year에게)"

변수 값이 이름을 대체합니다. 변수 값을 변경할 수도 있습니다. 변수에 새 값을 할당하려면  my_boost다음과 같이 첫 번째 값을 할당 할 때 수행 한 작업을 반복하면됩니다.

my_boost = 테킬라

이전 명령을 다시 실행하면 이제 다른 결과가 나타납니다.

echo "$ my_boost는 $ me에게, $ his_boost는 $ him (c) $ this_year에게)"

따라서 동일한 변수를 참조하는 동일한 명령을 사용하고 변수에 포함 된 값을 변경하면 다른 결과를 얻을 수 있습니다.

나중에 변수 인용에 대해 이야기하겠습니다. 지금은 기억해야 할 몇 가지 사항이 있습니다.

  • 작은 따옴표 ' 로 묶인 변수는 변수가 아닌 리터럴 문자열로 처리됩니다.
  • 따옴표 안의 변수는 변수로 "  취급됩니다.
  • 변수에 포함 된 값을 얻으려면 달러 기호를 제공해야합니다 $.
  • 달러 기호가없는 변수 $ 는 변수 이름 만 제공합니다.

기존 변수 또는 여러 변수에서 값을 가져 오는 변수를 만들 수도 있습니다. 다음 명령은라는 새 변수를 정의 drink_of_the_Year,하고 my_boostthis_year변수 의 결합 된 값을 할당합니다 .

drink_of-the_Year = "$ my_boost $ this_year"
Echo drink_of_the-Year

스크립트에서 변수를 사용하는 방법

스크립트는 변수없이 완전히 방해받을 수 있습니다. 변수는 스크립트를 특정 솔루션이 아닌 일반적인 솔루션으로 만드는 유연성을 제공합니다. 차이점을 설명하기 위해 다음은 /dev디렉토리 의 파일 수를 계산하는 스크립트입니다 .

이것을 텍스트 파일에 입력 한 다음 fcnt.sh( "파일 수") 로 저장합니다 .

#! / bin / bash folder_to_count = / dev file_count = $ (ls $ folder_to_count | wc -l) echo $ folder_to_count에있는 $ file_count 파일

스크립트를 실행하기 전에 아래와 같이 실행 가능하게 만들어야합니다.

chmod + x fcnt.sh

스크립트를 실행하려면 다음을 입력하십시오.

./fcnt.sh

이것은 /dev디렉토리 의 파일 수를 인쇄합니다 . 작동 방식은 다음과 같습니다.

  • 라는 변수 folder_to_count가 정의되고 "/ dev"문자열을 보유하도록 설정됩니다.
  • Another variable, called file_count, is defined. This variable takes its value from a command substitution. This is the command phrase between the parentheses $( ). Note there’s a dollar sign $ before the first parenthesis. This construct $( ) evaluates the commands within the parentheses, and then returns their final value. In this example, that value is assigned to the file_count variable. As far as the file_count variable is concerned, it’s passed a value to hold; it isn’t concerned with how the value was obtained.
  • The command evaluated in the command substitution performs an ls file listing on the directory in the folder_to_count variable, which has been set to “/dev.” So, the script executes the command “ls /dev.”
  • The output from this command is piped into the wc command. The -l (line count) option causes wc to count the number of lines in the output from the ls 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 the file_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.
  • $@: 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: $@" 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.shcalls. 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.

Before you hit Enter and execute a line of Bash commands, try it with echo in front of it. This way, you can make sure what’s going to happen is what you want. You can also catch any mistakes you might have made in the syntax.