English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell 변수

변수를 정의할 때, 변수 이름에 달러 기호($)를 추가하지 마세요. PHP 언어에서는 변수가 필요합니다.

your_name="w"3codebox.com"

주의하십시오. 변수 이름과 등호 사이에 공백이 있을 수 없습니다. 이것은 모든 프로그래밍 언어에서 익숙하지 않을 수 있습니다. 또한, 변수 이름의 이름은 다음과 같은 규칙을 따라야 합니다:

  •             이름은 영어 문자, 숫자 및 밑줄만 사용할 수 있으며, 첫 번째 문자는 숫자로 시작할 수 없습니다.

  •             중간에 공백이 있을 수 없습니다. 밑줄(_)를 사용할 수 있습니다.

  •             표 punctuations를 사용할 수 없습니다.

  •             bash에서의 키워드를 사용할 수 없습니다.(help 명령어로 보존된 키워드를 확인할 수 있습니다).

효과적인 Shell 변수 이름 예제 다음과 같습니다:

w3codebox
LD_LIBRARY_PATH
_var
var2

잘못된 변수 이름:

?var=123
user*name=w3codebox

명시적으로 직접 할당 외에도, 다음과 같은 문장으로 변수에 할당할 수 있습니다:

for file in `ls /etc`
또는
for file in $(ls /etc)

이 구문은 /etc 하위 디렉토리의 파일 이름을 반복적으로 가져옵니다.

변수 사용

정의된 변수를 사용하려면, 변수 이름 앞에 달러 기호($)를 추가하세요. 예를 들어:

your_name="qinjx"
echo $your_name
echo ${your_name}

변수 이름 외의 괄호는 선택 사항입니다. 추가하지 않아도 됩니다. 괄호를 추가하는 것은 인터프리터가 변수의 경계를 인식하는 데 도움이 되기 위해입니다. 예를 들어:

for skill in Ada Coffee Action Java; do
    echo "I am good at ${skill}Script"
done

skill 변수에 괄호를 추가하지 않으면 echo "I am good at $skillScript"라고 쓰면, 인터프리터는 $skillScript를 변수(값이 비어 있습니다)로 인식하고, 코드 실행 결과는 기대와 다릅니다.

모든 변수에 괄호를 추가하는 것을 추천합니다. 이것은 좋은 프로그래밍 습관입니다.

정의된 변수는 다시 정의될 수 있습니다. 예를 들어:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

이렇게 쓰는 것은 합법적이지만, 두 번째 할당 때는 $your_name="alibaba"라고 쓰지 마세요. 변수를 사용할 때에만 달러 기호($)를 추가하세요.

읽기 전용 변수

readonly 명령어를 사용하여 변수를 읽기 전용 변수로 정의할 수 있습니다. 읽기 전용 변수의 값은 변경할 수 없습니다.

다음 예제는 읽기 전용 변수를 변경하려고 시도했지만 오류가 발생합니다:

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://ko.oldtoolbag.com"

스크립트를 실행하면 다음과 같은 결과가 나타납니다:

/bin/sh: NAME: This variable is read only.

변수 제거

unset 명령어를 사용하여 변수를 제거할 수 있습니다. 문법:

unset variable_name

변수가 제거된 후에는 다시 사용할 수 없습니다. unset 명령어는 읽기 전용 변수를 제거할 수 없습니다.

예제

#!/bin/sh
myUrl="https://ko.oldtoolbag.com"
unset myUrl
echo $myUrl

위의 예제 실행 결과는 어떤 출력도 없습니다.

변수 타입

shell을 실행할 때, 세 가지 변수가 동시에 존재합니다:

  • 1) 로컬 변수로컬 변수는 스크립트나 명령어에서 정의되며, 현재 shell 예제에서만 유효하며, 다른 shell이 시작한 프로그램은 로컬 변수에 접근할 수 없습니다.

  • 2) 환경 변수모든 프로그램, shell이 시작한 프로그램을 포함하여, 환경 변수에 접근할 수 있습니다. 일부 프로그램은 정상적인 작동을 위해 환경 변수가 필요합니다. 필요할 때 shell 스크립트도 환경 변수를 정의할 수 있습니다.

  • 3) shell 변수shell 변수는 shell 프로그램이 설정한 특수 변수입니다. shell 변수 중 일부는 환경 변수이고, 일부는 로컬 변수입니다. 이러한 변수는 shell의 정상적인 작동을 보장합니다

Shell 문자열

문자열은 shell 프로그래밍에서 가장 일반적이고 유용한 데이터 타입입니다(숫자와 문자열 외에는 다른 타입이 없기 때문에), 문자열은 단따옴표, 쌍따옴표, 그리고 따옴표 없이도 사용할 수 있습니다.

단따옴표

str='this is a string'

단따옴표 문자열의 제한:

  •             단따옴표 안에는 어떤 문자도 원样으로 출력됩니다, 단따옴표 문자열에서는 변수는 유효하지 않습니다;

  •             단따옴표 문자열에서는 단따옴표를 단독으로 사용할 수 없습니다(단따옴표에 escape 문자를 사용해도 됩니다), 그러나 짝으로 사용하여 문자열 결합으로 사용할 수 있습니다.

쌍따옴표

your_name='w3codebox'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

출력 결과는 다음과 같습니다:

Hello, I know you are "w3codebox"!

쌍따옴표의 장점:

  •             쌍따옴표 안에는 변수가 있을 수 있습니다

  •             쌍따옴표 안에는 escape 문자가 나타날 수 있습니다

문자열 결합

your_name="w"3codebox"
# 더블quote로 결합
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 단일quote로 결합
greeting_2='hello, '${your_name}' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

출력 결과는 다음과 같습니다:

hello, w3codebox ! hello, w3codebox !
hello, w3codebox ! hello, ${your_name} !

문자열 길이를 가져옵니다

string="abcd"
echo ${#string} # 출력 4

서브 문자열을 추출합니다

다음 예제에서 문자열의 2 문자부터 잘라내기 4 문자:

string="w3codebox is a great site"
echo ${string:1:4} # 출력 unoo

주의:첫 번째 문자의 인덱스 값은 0

서브 문자열 찾기

문자 찾기 i 또는 o 의 위치(어떤 문자가 먼저 나타나면 그 문자를 계산합니다):

string="w3codebox is a great site"
echo `expr index "$string" io` # 출력 4

주의: 위 스크립트에서 `은反引号`가 아니라 단일quote '입니다. 잘못 보지 마세요.

Shell 배열

bash은 일维수그룹을 지원하며(다중维수그룹을 지원하지 않습니다) 수그룹의 크기를 제한하지 않습니다.

C 언어와 유사하게, 수그룹 요소의 인덱스는 0에서 시작됩니다. 수그룹 내 요소를 가져오려면 인덱스를 사용해야 하며, 인덱스는 정수나 수학 표현식이 될 수 있으며, 값은 0 이상이어야 합니다.

수그룹 정의

Shell에서는 괄호를 사용하여 수그룹을 표현하며, 수그룹 요소는 "공백" 기호로 구분됩니다. 수그룹을 정의하는 일반 형식은 다음과 같습니다:

수그룹=(값1 값2 ... value n)

예를 들어:

array_name=(value0 value1 value2 value3)

또는

array_name=(
value0
value1
value2
value3
)

수그룹의 각 구성 요소를 독립적으로 정의할 수도 있습니다:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

연속 인덱스를 사용하지 않을 수 있으며, 인덱스 범위는 제한이 없습니다.

수그룹을 읽습니다

수그룹 요소 값을 읽는 일반 형식은 다음과 같습니다:

${수그룹[인덱스]}

예를 들어:

valuen=${array_name[n]}

@ 기호를 사용하여 배열의 모든 요소를 가져올 수 있습니다. 예를 들어:

echo ${array_name[@]}

배열 길이를 가져오기

배열 길이를 가져오는 방법은 문자열 길이를 가져오는 방법과 동일합니다. 예를 들어:

# 배열 요소의 개수를 가져옵니다
length=${#array_name[@]}
# 또는
length=${#array_name[*]}
# 배열 단일 요소의 길이를 가져옵니다
lengthn=${#array_name[n]}

Shell 주석

시작하는 행은 주석으로 간주되며, 해석자에 의해 무시됩니다.

각 줄에 # 다중 줄 주석을 설정하려면 다음과 같이 합니다:

#--------------------------------------------
# 주석
# 작성자:기본 튜토리얼 웹사이트
# 사이트:ko.oldtoolbag.com
# 슬로건:기본을 잘 배우면 더 멀리 가실 수 있습니다!
#--------------------------------------------
##### 사용자 설정 구역 시작 #####
#
#
# 스크립트 설명 정보를 추가할 수 있습니다
# 
#
##### 사용자 설정 구역 종료 #####

개발 중에 대량의 코드를 일시적으로 주석으로 만들어 둔 후, 얼마 후 주석을 취소해야 할 때 어떻게 해야 합니까?

각 줄에 # 기호를 추가하는 것은 너무 귀찮다면, 이 부분을 주석으로 만들기 위해 괄호로 묶어서 함수로 정의할 수 있습니다. 이 함수는 어디에도 호출되지 않기 때문에 코드는 실행되지 않으며, 주석과 같은 효과를 얻을 수 있습니다.

다중 줄 주석

다중 줄 주석은 다음 형식으로도 사용할 수 있습니다:

:<<EOF
주석 내용...
주석 내용...
주석 내용...
EOF

EOF는 다른 기호도 사용할 수 있습니다:

:<<'
주석 내용...
주석 내용...
주석 내용...
'
:<<!
주석 내용...
주석 내용...
주석 내용...
!