반응형

출처 : 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/22683269/how-to-parse-a-config-file-conf-in-shell-script

shell 스크립트에서 설정 파일 (*.conf) 파싱하는 방법

저는 shell 스크립트 신입입니다. app.conf 파일이 다음처럼 있습니다.

[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306

[Logs]
level = logging.DEBUG

[Server]
port = 8080

저는 shell 스크립트에서 이 파일을 파싱하여 mysql 설정 정보를 추출하고 싶습니다. 어떻게 할 수 있을까요?

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

저는 다음처럼 하였습니다.

pw=$(awk '/^password/{print $3}' app.conf)
user=$(awk '/^user/{print $3}' app.conf)

echo $pw
root123

echo $user
root

$()는 변수 pw를 내부 명령의 출력으로 설정합니다. 안쪽의 명령은 app.conf 파일에서 password 로 시작하는 줄(line)에서 세 번째 필드를 출력합니다.

편집됨

설정 파일에서 많은 값을 파싱하려면 설정 파일 이름에 대한 변수를 만듭니다.

CONFIG=app.conf
pw=$(awk '/^password/{print $3}' "${CONFIG}")
user=$(awk '/^user/{print $3}' "${CONFIG}")

2개의 다른 포트가 있다면... 올바른 section이 나왔을 때 flag를 1로 설정하고 당신이 찾는 포트가 나왔을 때 종료(exit) 합니다.

mport=$(awk '/^\[MySQL\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")
sport=$(awk '/^\[Server\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")

역자 추가내용

저 같은 경우에는 다음처럼 파싱처리 하였습니다.

pw=$(awk -F "=" '/^\[MySQL\]/{f=1} f==1&&/^password/{print $2;exit}' "${CONFIG}")
반응형
반응형

출처 : https://stackoverflow.com/questions/4936807/how-to-do-ssh-with-a-timeout-in-a-script

script에서 ssh로 timeout을 주는 방법?

저는 원격 호스트로 비밀번호 없는 SSH로 접속하는 script를 실행하고 있습니다. 만약 원격호스트가 실행하는데 무한의 시간이 걸린다면 저는 timeout을 설정하여 그 ssh 세션을 빠져나와 저의 sh script에서 다음 행을 진행하고 싶습니다.

timeout을 어떻게 설정할 수 있나요?


6개의 답변 중 1개의 답변

ssh -o ConnectTimeout=10  <hostName>

10은 초로 된 시간을 의미합니다. 이 timeout은 연셜 생성에만 적용됩니다.

반응형
반응형

출처 : https://www.shellscript.sh/tips/getopts/

Shell Script 튜토리얼 - 팁 Getopts

명령줄 인자 파싱하기

대부분의 Unix, Linux 명령은 "마이너스" 심볼을 앞에 붙여 옵션을 사용합니다. 예를 들어 파일 목록을 긴 포멧으로, (역순으로) 시간순으로 정렬할 때 당신은 ls -l -r -t를 사용하거나 ls -lrt를 사용할 수 있습니다.
몇가지 명령은 인자를 가지는데, 당신은 "myfiles" 디렉터리를 "mytarfile.tar"로 압축할 수 있습니다. tar -c의 경우, 압축 하기 위해 파일 목록을 취하는 옵션이 오게 됩니다.

The tl;dr lowdown

여기에 "너무 길어 읽지 않았다"처럼 빠른 개요가 있습니다. 다음처럼 getopts를 사용할 수 있습니다.

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

간단한 "-f" 형식 대신 "--filename"과 같은 긴 형식 인수를 구문 분석하는 외부 유틸리티 getopt도 있습니다. 당신도 그 게시물을 읽고 싶을 것입니다.

그렇습니다. 바쁜 사람들은 위 예시에 만족할 것이며 getopts가 무엇인지 어떻게 작동하는지와 당신의 스크립트에서 어떻게 유용하게 사용할 수 있는지 알아보겠습니다.

getopts 소개

당신을 위해 이 옵션들을 파싱하는 편리한 유틸리티를 getops라 부릅니다. 그 사용법은 조금 이상하게 느껴지지만, 이 기술은 당신의 스크립트가 옵션을 표준화되고 친근하게 느끼는 방법으로 처리하도록 합니다..

getopts를 통해 당신이 전달한 첫번째 인자는 그것이 받아들일 어떤 문자(혹은 숫자, 또는 다른 한개의 글자))의 목록입니다. 각 글자 뒤에 colon(:)는 tar -f mytarfile 처럼 인자가 따라온다는 의미입니다. tar -f는 tar 파일의 이름이 항상 따라와야 합니다. 이 옵션 인자는 $OPTARG 변수에서 당신의 스크립트로 보내집니다.

getopts$OPTIND 변수도 세팅하는데 나중에 다룰 것입니다.

당신이 getopts로 전달하는 두번째 인자는 현재 switch의 문자가 위치하게 될 변수의 이름입니다. 주로 이는 opt 또는 c로 불리며, 아무 이름으로 올 수 있습니다.

이 예시 스크립트는 tarball로 파일을 저장하고 복구할 수 있습니다. 당신은 그것에 -s(저장) 또는 -r(복구)로 그것에 전달해야 합니다. 만약 당신이 -d databasefile을 전달하면 데이터베이스를 덤프(또는 복구)하는 이름으로 사용될 것입니다. 만약 -f tarball을 전달하면 파일을 생성(또는 해제하는) tarball의 이름으로 사용될 것입니다.

이 첫 번째 스크립트 초안에서 다루지 않는 몇 가지 사항이 있습니다. -s-r을 모두 전달하는 것은 유효하지 않습니다. 그렇게 하면 이 스크립트는 마지막으로 전달한 것을 취하므로 dbdump.sh -s -r -d 또는 dbdump.bin -s -r -s는 마지막으로 처리 한 것이 저장 명령이므로 (복원하지 않고) 저장합니다.

마찬가지로 -d-f 중 하나 이상을 전달하지 않으면 아무 일도 일어나지 않습니다.

DB_DUMP TARBALL ACTION 설정이 안되는 이유는 스크립트가 이미 설정된 환경 변수의 영향을 받지 않기 때문입니다. 이는 실행중인 스크립트의 범위에만 영향을 미칩니다. 호출 쉘은 변수가 변경되지 않습니다.

간결하게하기 위해 여기서 save_database(), save_files(), restore_database()restore_files() 함수를 정의하지 않았습니다. 다운로드 가능한 스크립트에는 더미 기능이 있어 스크립트가 실제로 실행됩니다. 수행할 작업만 표시하지만 실제로는 파일에 아무런 작업을 수행하지 않습니다.

이 스크립트 다운로드(getops1.sh)

#!/bin/bash

unset DB_DUMP TARBALL ACTION

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

if [ -n "$DB_DUMP" ]; then
  case $ACTION in
    SAVE)    save_database $DB_DUMP    ;;
    RESTORE) restore_database $DB_DUMP ;;
  esac
fi

if [ -n "$TARBALL" ]; then
  case $ACTION in
    SAVE)    save_files $TARBALL    ;;
    RESTORE) restore_files $TARBALL ;;
  esac
fi

getopts 명령은 while 루프에 대한 인수입니다. 루프를 통해 매번 switch를 처리하고 $c 변수를 switch의 문자로 설정합니다. 기본 튜토리얼에서 루프case에 대해 자세히 읽을 수 있습니다.

이 스크립트를 dbdump.sh -s -r -d /tmp/dbdump.bin -f /tmp/files.tar -s로 호출하면 -s를 처리하고 $c=s를 설정하고 처음으로 case`` 구문을 실행합니다.$c=s$ACTION=SAVE를 설정하고 그 줄의 끝에는 처리를 중지하라고 알려주고 while 루프 주위의 다음 실행을 위해 getopts로 돌아갑니다. 논리적으로 의미가 없는 -r을 읽지만 (백업을 저장하고 동시에 백업을 복원 할 수는 없지만) 스크립트는 이를 알지 못하므로$c=r을 설정합니다. case 문은$ACTION = RESTORE를 설정하고 다음 인수를 처리하기 위해getopts`로 돌아갑니다.

이제 getopts는 $c=d를 설정하고 $OPTARG = /tmp/dbdump.bin 도 설정합니다. getopts 호출에서 'd:는 -d 다음에 인수 (데이터베이스 덤프 파일의 이름)가 옵니다. 실행은 case 문으로 진행하여 $DBDUMP=/tmp/dbdump.bin을 설정합니다. 스크립트의 본문에 들어갈 때 $ DBDUMP 변수에 값이 있으면 데이터베이스를 해당 파일에 저장하거나 해당 파일에서 복원합니다.

다음 옵션은 -f /tmp/files.tar 이며 동일한 프로세스가 수행됩니다. getopts는 $c=f 를 설정하고 $OPTARG=/tmp/files.tar도 설정합니다. case 문은 이것을 읽고 $TARBALL=/tmp/files.tar를 설정합니다.

마지막으로 또 다른 -s 스위치를 전달하여 $ACTION 변수를 다시 SAVE로 변경합니다.

기본 스크립트가 시작되면 $DB_DUMP가 설정되어 있는지 확인한 다음 $ACTION 값을 확인하고 $ACTION 값에 따라 $DB_DUMP를 사용하여 데이터베이스를 저장하거나 복원합니다.

마찬가지로 $TARBALL이 설정되어 있는지 확인하고 $TARBALL을 인수로 사용하여 파일을 저장하거나 복원합니다.

반응형
반응형

CentOS6에서 gradle을 설치할 일이 있어서 다음 주소들을 참고하여 shell 스크립트를 만들었습니다 :)
참고

Gradle 설치

  • install-gradle-centos.sh
    • root 계정에서 다음 스크립트를 실행하여 설치하였습니다.
# installs to /opt/gradle
# existing versions are not overwritten/deleted
# seamless upgrades/downgrades
# $GRADLE_HOME points to latest *installed* (not released)
gradle_version=3.4.1
wget -N https://services.gradle.org/distributions/gradle-${gradle_version}-all.zip
unzip gradle-${gradle_version}-all.zip -d /opt/gradle
ln -sfn gradle-${gradle_version} /opt/gradle/latest
printf "export GRADLE_HOME=/opt/gradle/latest\nexport PATH=\$PATH:\$GRADLE_HOME/bin" > /etc/profile.d/gradle.sh
. /etc/profile.d/gradle.sh
# check installation
gradle -v
반응형
반응형

출처
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:
반응형
반응형

출처

https://stackoverflow.com/questions/10856447/sed-command-find-and-replace-in-even-lines-of-a-file


sed에서 파일의 짝수 줄만 찾아 치환하는 명령

저는 이 stackoverflow에서 신입입니다. 저는 SED를 사용하여 파일의 짝수 줄만 표현식으로 치환하고 싶습니다. 제 문제는 원래 파일의 변화는 원래 파일에서 변한 내용을 저장하는 방법을 생각할 수 없다는 점입니다. (예: 파일에서 변한 내용을 덮어쓰는 방법) 저는 다음을 시도해 보았습니다.

sed -n 'n;p;' filename | sed 's/aaa/bbb/'

하지만 이는 변한 내용을 저장할 수 없습니다. 이에 대한 당신의 도움에 감사드립니다.

------

4개의 답변 중 1 개의 답변만 추려냄.

다음을 시도하세요.

sed -i '2~2 s/aaa/bbb/' filename

-i 옵션은 sed에게 해당 filename에서 작동하도록 표준출력(stdout)으로 수정된 버전을 쓰지 않고 즉 원래 파일을 나두지 않고 파일의 변경 내용을 적용하도록 합니다. 2~2부분은 명령어를 통해 적용되어야 할 sed의 줄(라인)에 대한 주소입니다. 2~2는 짝수 줄만 편집(수정)함을 의미합니다. 1~2는 홀수 줄만 편집(수정)함을 의미합니다. 5~6는 6줄마다 편집(수정)하고 5번째 줄부터 시작합니다.

-- 역자 추가 내용--

참고주소

https://www.gnu.org/software/sed/manual/html_node/Addresses.html


반응형
반응형

출처 : https://stackoverflow.com/questions/4585929/how-to-use-cp-command-to-exclude-a-specific-directory

특정 디렉터리를 제외하고 'cp' 명령 사용하는 방법

저는 특정 하위 디렉터리(sub-directory)에서 몇 개의 파일을 제외하고 그 디렉터리의 모든 파일을 복사하고 싶습니다. 저는 cp 명령어는 --exclude 옵션이 없는 것을 알게 되었습니다. 이를 어떻게 할 수 있을까요?

19개 답변 중 1개

rsync는 빠르고 쉽습니다.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
rsync -av --progress 원본폴더 /대상폴더 --exclude 제외할폴더

당신은 --exclude를 여러번 사용할 수 있습니다.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
rsync -av --progress 원본폴더 /대상폴더 --exclude 제외할폴더 --exclude 또다른제외할폴더

--exclude 뒤의 폴더에 thefoldertoexclude 디렉터리는 sourcefolder, 즉 sourcefolder / thefoldertoexclude와 관련이 있습니다.

또한 실제 명령을 실행하기 전에 무엇이 복사되는 지 보기만 하려면 -n을 추가할 수 있고 괜찮다면 명령줄에서 -n을 제거하면 됩니다.

반응형
반응형

출처

https://unix.stackexchange.com/questions/223543/get-the-date-of-last-months-last-day-in-a-shell-script


shell 스크립트에서 지난 달의 마지막 날짜 구하기

어떻게 처리할 날짜에 기반하여 지난 달의 날짜를 구할 수 있습니까?

예시:

* 처리할 날짜 = 15jan2015, 2015년 1월 15일

* 예상 날짜 = 31dec2014, 2014년 12월 31일

* 처리할 날짜 = 15feb2015, 2015년 2월 15일

* 예상 날짜 = 31Jan2015, 2015년 1월 31일

------

4개의 답변 중 1개의 답변만 추려냄.

GNU의 date로 

몇 가지 shell은 날짜 조작 지원이 내장되어 있습니다.

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

ksh93로 

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

zsh로 

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015


반응형
반응형
출처 

https://unix.stackexchange.com/questions/3586/what-do-the-numbers-in-a-man-page-mean

man 페이지에 숫자들은 무엇입니까?

예를 들면, 제가 man ls를 쳤을 때 저는 LS(1)볼 수 있습니다. 하지만 man apachectl을 쳤을 때 APACHECTL(8)을 볼 수 있었고 man cd를 쳤다면 cd(n)로 끝났습니다.

저는 괄호 안에 숫자의 의미가 무엇인지 궁금합니다.

 

------

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

 

숫자는 페이지의 매뉴얼이 무슨 섹션인가를 뜻합니다. 1은 사용자 명령이고 8은 시스템 관리 도구입니다. man 페이지 그 자체(man man )는 이를 설명하고 그 표준을 보여줍니다.

매뉴얼 섹션매뉴얼의 표준 섹션은 다음을 포함합니다.1 사용자 명령2 시스템 콜3 C 라이브러리 함수4 장치와 특별한 파일5 파일 포멧과 규칙6 게임 외7 기타8 시스템 관리 도구 및 대몬매뉴얼 배포는 추가적인 섹션을 주로 포함하는 그 세부사항에 대한 매뉴얼 섹션을 사용자 정의합니다.

다른 섹션에 특정 용어가 있을 수 있습니다. (예 섹션 1에 shell 명령으로

printf

와 섹션 3에

stdlib

 라이브러리 함수로써 printf) 이런 경우 man 명령어에 섹션 번호를 전달하여 원하는 것을 선택하거나 man -a를 사용하여 일치하는 모든 페이지를 연속으로 표시할 수 있습니다.

$ man 1 printf $ man 3 printf $ man -a printf

man -k (apropos 명령과 같음)를 통해 용어가 어느 섹션에 속하는지 물어볼 수 있습니다. 이는 부분문자열이 일치 하더라도 찾을 것입니다. (

man -k printf

를 실행한다면 sprintf를 보여줄 것입니다.) 그래서 이를 제한하려면

^용어

를 사용해야 합니다.

$ man -k '^printf' printf (1) - format and print data printf (1p) - write formatted output printf (3) - formatted output conversion printf (3p) - print formatted output printf [builtins] (1) - bash built-in commands, see bash(1)

섹션에는 때때로 하위 섹션이 포함될 수 있습니다 (예 : 위의 1p 및 3p의 p). p 하위 섹션은 POSIX 사양을 위한 것입니다. x 하위 섹션은 X Window System 문서 용입니다.

반응형

+ Recent posts