HackerRank Linux Shell - Bash

01. Write a bash script that prints the string "HELLO".

Answer

echo "HELLO"

02. Looping and Skipping

Answer

문제를 보면 1부터 2씩 증가하는 것을 알 수 있다.

https://devpouch.tistory.com/128 에서 참고해 보면 for 문을 사용하는데 {시작..끝..증감폭} 이렇게 입력하면 된다고 한다.

for var in {1..99..2}
do
    echo $var
done

03. A Personalized Echo

Answer

read input
echo "Welcome" $input

04. Looping with Numbers

Answer

for var in {1..50}
do
    echo $var
done

05. The World of Numbers

Answer

read inputA
read inputB

echo $(($inputA + $inputB))
echo $(($inputA - $inputB))
echo $(($inputA * $inputB))
echo $(($inputA / $inputB))

inputA와 inputB 두 개의 변수를 읽고, 이를 이용해 덧셈, 뺄셈, 곱셈, 나눗셈을 수행한 결과를 출력

 

Bash에서 괄호는 산술 연산을 수행하는 데 사용됩니다. 

괄호 안에는 산술 연산을 할 수 있는 수식이 들어갑니다. 

예를 들어, $(($inputA + $inputB))는 inputA와 inputB를 더한 값을 출력하는 것이며, 이를 위해서는 괄호 안에 수식 "$inputA + $inputB"가 들어갑니다.

또한, $(( ))는 산술 연산을 수행하는 표현식을 나타내므로, 괄호 안에 더 복잡한 산술 연산을 수행할 수도 있습니다. 

예를 들어, $(($inputA + $inputB * 2))는 inputB를 2배한 값과 inputA를 더한 결과를 출력합니다.


06. Comparing Numbers

Answer

read inputA
read inputB

if [ $inputA -eq $inputB ]
then
    echo "X is equal to Y"
elif [ $inputA -gt $inputB ]
then
    echo "X is greater than Y"
elif [ $inputA -lt $inputB ]
then
    echo "X is less than Y"
fi

Bash에서 [ ]는 조건식을 나타내는 데 사용되며, if 문과 함께 조건문을 구성할 때 자주 사용됩니다. 

조건식은 일반적으로 변수나 상수, 연산자 등을 포함합니다.

위의 조건식 [ $inputA -eq $inputB ]은 inputA와 inputB가 같은지를 비교하는 조건식입니다. 

여기서 -eq는 "equal"을 의미하는 비교 연산자입니다. 

따라서, inputA와 inputB가 같으면 조건식은 참(true)이 되고, 그렇지 않으면 거짓(false)이 됩니다.

if [ $inputA -eq $inputB ]; then
    echo "inputA와 inputB는 같습니다."
else
    echo "inputA와 inputB는 다릅니다."
fi

위의 코드는 inputA와 inputB를 비교하여 같으면 "inputA와 inputB는 같습니다."를 출력하고, 다르면 "inputA와 inputB는 다릅니다."를 출력합니다.


07. Getting started with conditionals

Answer

read var

Lowercase()
{
 echo $* | tr "[A-Z]" "[a-z]"
}


if [ $(Lowercase $var) == "y" ]
then
    echo "YES"
else
    echo "NO"
fi

 

- echo $*: 사용자 입력값을 모두 출력합니다. $*는 모든 인자를 전달하는 변수입니다.
- |: 파이프 기호는 앞 명령어의 결과를 뒤 명령어의 입력값으로 전달합니다.
- tr "[A-Z]" "[a-z]": tr은 문자열을 변환하는 명령어입니다. "[A-Z]"는 대문자 알파벳을, "[a-z]"는 소문자 알파벳으로 변환하도록 지정합니다.

예를 들어, "Hello World"를 입력했다면, 위의 명령어는 "hello world"를 출력합니다.

 

- echo $*: 사용자 입력값을 모두 출력합니다. $*는 모든 인자를 전달하는 변수입니다.
- |: 파이프 기호는 앞 명령어의 결과를 뒤 명령어의 입력값으로 전달합니다.
- tr "[A-Z]" "[a-z]": tr은 문자열을 변환하는 명령어입니다. "[A-Z]"는 대문자 알파벳을, "[a-z]"는 소문자 알파벳으로 변환하도록 지정합니다.

예를 들어, "Hello World"를 입력했다면, 위의 명령어는 "hello world"를 출력합니다.


08. More on Conditionals

Answer

read x
read y
read z

if [ $x -eq $y -a $x -eq $z ]
then
    echo EQUILATERAL
elif [ $x -eq $y -o $y -eq $z ]
then
    echo ISOSCELES
else
    echo SCALENE
fi

09. Arithmetic Operations

Answer

read var

var=${var// /}

function Cut(){
    echo "scale=$1;${2}" | bc
}

bRound=`Cut 4 $var`

if [ ${bRound: -1} -eq 5 ];then
    dest=`echo "${#bRound}-1" | bc`
    echo "${bRound:0:$dest}+0.001" | bc
else
    Cut 3 $var
fi

- ${bRound: -1}: bRound 문자열의 마지막 문자를 가져옵니다. ${parameter:offset:length} 형태로 사용됩니다. : -1은 문자열 끝에서부터 1번째 문자를 가져오라는 의미입니다.
- -eq: 같은지를 비교하는 연산자입니다.
- dest=`echo "${#bRound}-1" | bc`: bRound 문자열에서 마지막 문자를 제외한 문자열의 길이를 구합니다. ${parameter#word} 형태로도 사용 가능합니다. 이때, $()를 사용하여 명령어 출력값을 변수에 저장합니다.
- echo "${bRound:0:$dest}+0.001" | bc: bRound 문자열에서 마지막 문자를 제외한 문자열의 값에 0.001을 더합니다. 이때, :0:$dest는 문자열의 처음부터 dest 길이까지를 가져오라는 의미입니다. 마지막으로 bc 명령어를 사용하여 수식을 계산합니다.

따라서, 위의 코드는 bRound 문자열의 마지막 문자가 5인 경우 true를 반환하고, bRound 값을 0.001 증가시킨 결과를 출력합니다.

조건문은 일반적으로 if 문과 함께 사용되며, 조건이 참(true)일 경우 실행할 명령어를 지정합니다. $()는 명령어 출력값을 변수에 저장할 때 사용됩니다.


10. Compute the Average

Answer

sum=0
read N

for i in $(seq 1 $N); do
    read number
    sum=$(( $sum + $number ))
done

printf "%.3f\n" `echo "$sum / $N" | bc -l`

지금 보니 SUBDOMAINS에 Bash 말고 다른 것들도 있어 확인해 봐야 할 듯 하다.
- Bash
- Text Processing
- Arrays in Bash
- Grep Sed Awk