반응형

출처 : https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash

Bash에서 문자열 변수 합치는 방법

PHP에서 문자열들은 다음처럼 함께 합쳐질 수 있습니다.

$foo = "Hello";
$foo .= " World";

여기 $foo는 "Hello World"가 됩니다.

Bash로 이를 어떻게 이룰 수 있을까요?


30개의 답변 중 2개의 답변

foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

일반적으로 두 변수를 연결하려면 다음과 같이 하나씩 작성하면 됩니다.

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World

Bash도 이 코드에서 보듯이 += 연산자를 지원합니다.

A="X Y"
A+=" Z"
echo "$A"

출력

X Y Z

반응형
반응형

출처 : https://stackoverflow.com/questions/20449680/boolean-operators-a-o-in-bash

Bash에서 Boolean 연산자( &&, -a, ||, -o )

Unix 연산자 &&, -a, ||, -o 사이에 차이점을 설명해 주실수 있으신가요?

2가지 타입의 사용법에 제약은 무엇인가요?

간단히 &&|| 연산자는 조건에서 flag를 사용할 때만 사용되나요?

다음처럼 :

[ "$1" = "yes" ] && [ -r $2.txt ]

[ "$1" = "yes" -a $2 -lt 3 ]

입니다.

2개의 답변 중 1개의 답변

경험상 법칙 : 대괄호 안에 -a-o를 사용하고 밖에서는 &&||를 사용합니다.

shell 구문과 [명령의 구문 사이의 차이점을 이해하는 것이 중요합니다.

  • &&||는 shell 연산자입니다. 두 명령의 결과를 결합하는 데 사용됩니다. 그것들은 shell 구문이기 때문에 특별한 구문적 의미가 있으며 명령의 인수로 사용할 수 없습니다.

  • [ 는 특별한 구문이 아닙니다. 실제로 이름 [ 또는 test로 알려진 명령입니다. [ 는 일반적인 명령이므로 -a-oandor 또는 연산자로 사용합니다. &&||는 명령으로 볼 수 없는 쉘 구문이기 때문에 (안에서는) 사용할 수 없습니다.

하지만 기다리십시오! Bash에는 [[ ]] 형식의 더 멋진 테스트 구문이 있습니다. 이중 대괄호를 사용하면 정규식 및 와일드 카드와 같은 항목에 액세스 할 수 있습니다. 대괄호 안에서 &&, ||, <>와 같은 쉘 연산자를 자유롭게 사용할 수도 있습니다. [ 와 달리 이중 괄호 형식은 특수 쉘 구문이기 때문입니다. Bash는 [[ 자체를 파싱하여 [[$ foo == 5 && $ bar == 6]]와 같은 것을 쓸 수 있습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/29244351/how-to-sort-a-file-in-place/29244387

파일 자체를 정렬하는 방법

sort file 명령을 사용할 때, 파일의 내용을 정렬하여 보여줍니다. 어떤 종류의 출력이 아니라 정렬된 파일을 원하는 데 어떻게 해야 합니까?


7개 답변 중 1개

당신은 정렬된 출력으로 파일 redirection을 사용할 수 있습니다.

sort input-file > output_file
sort 입력파일 > 출력파일

아니면 당신은 -o, --output=FILE 옵션을 같은 입력과 출력 파일을 가리키며 정렬하여 사용할 수 있습니다.

sort -o file file
sort -o 파일 파일

파일 이름을 반복하지 않고 ( bash 중괄호 확장 으로 )

sort -o file{,}
sort -o 파일{,}

참고: 일반적인 실수는 출력을 동일한 입력 파일로 redirect 하는 것입니다(예: sort file > file). 이것은 쉘이 redirection(sort(1) 프로그램이 아님)을 하고 있기 때문에 작동하지 않으며, sort(1) 프로그램에 읽을 기회를 주기 직전에 입력 파일(출력이기도 함)이 지워집니다.

반응형
반응형

출처

https://stackoverflow.com/questions/40852784/how-can-i-use-a-variable-in-curl-call-within-bash-script

bash 스크립트에서 curl 호출시 변수를 어떻게 사용할 수 있을까요?

간단한 작업이 있고 제 bash 스크립트 안에 curl 호출시 변수를 어떻게 사용할 수 있을지 알아내기 위해 이미 여러 시간을 소비하였습니다.

message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'

이는 문법적으로 작은 따옴표 안에 있기 때문에 ${message}을 출력합니다. 만약 따옴표를 바깥쪽은 큰 따옴표 안쪽은 작은 따옴표로 변경하였을 때 Hello와 there 명령어가 없다고(command not found: Hello 다음에 command not found: there) 나옵니다.

어떻게 해야 합니까?


2개 답변 중 1개만 추림

변수는 작음 따옴표 안에서 확장될 수 없습니다. 큰 따옴표로 다음처럼 다시 작성할 수 있습니다.

curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"${message}\"}"

큰 따옴표 안에 큰 따옴표는 escape 문자(\)가 있어야 합니다.

다른 방법은 다음처럼 할 수 있습니다.

curl -X POST -H 'Content-type: application/json' --data '{"text": "'"${message}"'"}'

이것은 작은 따옴표에서 밖에서 단어 분할을 방지하기 위해 ${message} 를 큰 따옴표로 묶은 다음 다른 작은 따옴표 문자열로 끝납니다. 다음처럼 처리 됩니다.

... '{"text": "'"${message}"'"}'
    ^^^^^^^^^^^^
    작은 따옴표 문자열


... '{"text": "'"${message}"'"}'
                ^^^^^^^^^^^^
                큰 따옴표 문자열


... '{"text": "'"${message}"'"}'
                            ^^^^
                            작은 따옴표 문자열
반응형
반응형

출처 : https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash

bash에서 어떻게 "cat << EOF"가 작동합니까?

저는 프로그램(psql)에 여러줄의 입력을 넣기(enter) 위해 스크립트를 작성할 필요가 있습니다.

구글링을 좀 한 결과 다음 문법이 작동함을 발견하였습니다.

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF

이는 (BEGIN;부터 END;까지) 여러줄 문자열을 생성하고 psql의 입력으로 pipe 전달을 합니다.

하지만 저는 어떻게/왜 작동하는지 모르겠습니다. 아무나 설명해주실 수 있을까요?

저는 주로 cat << EOF를 참조하고 있습니다. 저는 >는 파일로 출력하기, >> 파일로 추가(append)하기, <는 파일로부터 읽기라는 것을 알고 있습니다.

<<는 정확히 무엇을 합니까?

그리고 이에 대한 man page가 있나요?


9 Answers

이는 표준입력으로 문자열을 제공하는 heredoc 포멧으로 불립니다. 더 자세한 내용은 https://en.wikipedia.org/wiki/Here_document#Unix_shells 를 보시면 됩니다.


man bash에서

Here Documents

이러한 유형의 redirection은 특정 단어만 포함된 행(뒤에 공백 없음)이 표시될 때까지 쉘이 현재 소스에서 입력을 읽도록 지시합니다.

그 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.

여기 문서의 형식은 다음과 같습니다.

          <<[-]word
                  here-document
         delimiter

매개 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어(word)에서 수행되지 않습니다. 단어(word)의 문자가 인용된 경우 구분(delimeter) 기호는 단어에서 따옴표 부호를 제거한 결과이며 here-document의 행은 확장되지 않습니다. 단어(word)가 따옴표가 없을 경우 here-document의 모든 행은 매개 변수 확장, 명령 대체 및 산술 확장의 대상이 됩니다. 후자의 경우 문자 시퀀스 \ 은 무시되며 인용하는 데 \, $ 및 ` 문자를 사용해야 합니다.

redirection 연산자가 <<- 이면 모든 탭이 먼저오는 문자가 입력 줄과 구분(delimiter) 기호를 포함하는 줄에서 제거됩니다. 이를 통해 쉘 스크립트 내의 here-document를 자연스럽게 들여 쓰기 할 수 있습니다.

반응형
반응형

출처 : https://superuser.com/questions/403800/how-can-i-make-the-bash-backtick-operator-keep-newlines-in-output

bash backtick() 연산자로 출력의 개행을 어떻게 유지할 수 있을까요?

backtick() 치환에 bash가 개행 문자를 먹지 않도록 하는 방법이 있습니까?

예를 들면

var=`echo line one && echo line two`
echo $var

line one line two

하지만 제가 원하는 것은 다음과 같습니다.

var=`echo line one && echo line two` # plus some magic
echo $var

line one
line two

3개의 답변 중 1개를 추려냄

이는 backtick() 치환 문제가 아닌 echo의 문제입니다. 제어 문자가 작동하려면 변수에 따옴표를 사용해야 합니다.

$ var=`echo line one && echo line two`
$ echo "$var"
line one
line two
반응형
반응형

출처 : https://stackoverflow.com/questions/6318809/how-do-i-grab-an-ini-value-within-a-shell-script

shell 스크립트에서 INI 파일 설정값을 얻는 방법은?

다음과 같은 parameters.ini 파일이 있습니다.

[parameters.ini]
    database_user    = user
    database_version = 20110611142248

bash 쉘 스크립트 내에서 parameters.ini 파일에 지정된 데이터베이스 버전을 읽고 사용하여 처리하려고 합니다.

#!/bin/sh
# 스크립트에서 사용하기 위해 parameters.ini 파일에서 데이터베이스 버전을 가져와야 함
PHP app/console doctrine:migrations:migrate $DATEBASE_VERSION

이를 어떻게 할 수 있을까요?


31개의 답변 중 1개

해당 라인의 값을 grep 하고난 뒤 awk를 사용하는 것은 어떨까요?

version=$(awk -F "=" '/database_version/ {print $2}' parameters.ini)
반응형
반응형

출처 : https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash

Bash에서 문자열이 부분 문자열을 포함하는지 확인하는 방법

저는 Bash에서 하나의 문자열을 가지고 있습니다.

string="My string"

저는 이 문자열이 다른 문자열을 포함하는지 어떻게 테스트할 수 있을까요?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

어디에 제가 모르는 연산자 ??가 있나요? 저는 어떻게 echo와 grep을 사용할 수 있을까요?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

저는 이 부분에 약간 서투른 것 같습니다.

26개의 답변 중 1개의 답변만 추려냄

당신은 만약 이중 괄호를 사용한다면 case 구문 바깥에서 Marcus의 답변(* 와일드 카드) 를 사용할 수도 있습니다.

string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

needle string의 공백은 큰 따옴표로 묶어야 하며 * 와일드 카드는 큰 따옴표 바깥에 있어야 합니다.

반응형
반응형

출처
https://stackoverflow.com/questions/4824590/propagate-all-arguments-in-a-bash-shell-script

bash 쉘 스크립트에서 모든 인수를 전달

저는 다른 스크립트를 호출하는 애무 간단한 스크립트를 작성하였고 현재 스크립트로부터 실행할 스크립트로 파라미터를 전달할 필요가 있습니다.
예를 들어 제 스크립트는 foo.sh이고 bar.sh를 호출합니다.
foo.sh:

bar $1 $2 $3 $4

각 파라미터를 명시적으로 지정하지 않고 이를 어떻게 할 수 있을까요?


8개의 답변 중 1개의 답변만 추려냄

같은 것을 파라미터로 사용하길 원하신다면 순수한 $@대신에 "$@"를 사용하세요.
확인:

$ cat foo.sh
#!/bin/bash
baz.sh $@

$ cat bar.sh
#!/bin/bash
baz.sh "$@"

$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4

$ ./foo.sh first second
Received: first
Received: second
Received:
Received:

$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:

$ ./bar.sh first second
Received: first
Received: second
Received:
Received:

$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:
반응형
반응형

출처 : http://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

크기로 du -h의 출력을 정렬할 수 있나요?

저는 du 출력을 사람이 읽을 수 있는 목록으로 얻고 싶습니다.

하지만, du는 "크기로 정렬"이란 옵션이 없기 때문에 sort로 pipe하는 것은 사람이 읽을 수 있도록 하는 플래그(human readable flag)가 작동하지 않습니다.

예를 들어 다음 명령을 실행하면

du | sort -n -r 

(내림차순으로) 크기로 정렬된 디스크 사용량이 출력됩니다.

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

하지만, 사람이 읽을 수 있도록 하는 플래그(human readable flag)를 사용하여 실행하면 적절하게 정렬되지 않습니다.

du -h | sort -n -r
508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

크기로 du -h를 정렬하는 방법을 아시는 분이 계신가요?


39 개의 답변 중 1개의 답변

2009년 8월에 GNU coreutils 7.5 가 나오고 부터, du -h와 같은 종류의 접미사를 사용하는 -h 파라미터를 sort에서 쓸 수 있습니다.

du -hs * | sort -h

만약 -h를 지원하지 않는 sort를 사용하신다면, GNU Coreutils를 설치할 수 있습니다. 다음은 오래된 Mac OS X 입니다.

brew install coreutils
du -hs * | gsort -h

다음은 sort 매뉴얼 내용입니다.

-h, --human-numeric-sort 사람이 읽을 수 있는 숫자를 비교한다 (예시, 2K 1G)

반응형

+ Recent posts