bash 스크립트에 명령 행 인수 전달


114

스크립트 프로그래밍을 처음 접했습니다.

bash 스크립트 'deploymLog'를 구현하고 싶습니다.이 스크립트는 입력으로 하나의 문자열 인수 (name)를 허용합니다.

[root@localhost Desktop]# ./deploymLog.sh name

여기에 명령 줄을 통해 문자열 인수 (이름)를 전달하고 싶습니다

초기 단계로,이 입력 문자열과 함께 현재 타임 스탬프를 Logone.txt아래 형식으로 현재 디렉토리에 있는 로그 파일에 추가해야 합니다.

[name]=[System time timestamp1]

어떻게 가능합니까?

답변:


112
$> cat ./deploymLog.sh 
#!/bin/bash

name=$1
log_file="Logone.txt"

if [[ -n "$name" ]]; then
    echo "$1=$( date +%s )" >> ${log_file}
else
    echo "argument error"
fi

명령 행의 첫 번째 인수는 위치 매개 변수를 사용하여 찾을 수 있습니다 $1. 비어 있지 않은지 [[ -n "$name" ]]테스트합니다 $name. date +%s현재 타임 스탬프를 Unix 시간으로 반환합니다. >>연산자 파일 내의 기존의 데이터에 첨부하여 파일에 기록하는 데 사용된다.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

$> cat Logone.txt 
tt=1329810941
rr=1329810953

더 읽기 쉬운 타임 스탬프를 얻으려면 date인수로 재생할 수 있습니다 .


7
여기에 초보자가 있습니다 ... [[ -n "$name" ]]부분이 무엇을하는지 아는 것이 도움이 될 것 입니다.
MichaelChirico

네, 사실입니다. 나는 또한 멍청한 놈이며 내 스크립트는 그 줄에서 죽어 가고 있습니까 ???
pythonian29033

4
"[[-n"$ name "]]"은 "test"명령의 또 다른 형식입니다. 참조 : ss64.com/bash/test.html
jewettg

64

쉘 명령 행 인수는 $1(첫 번째), $n(n 번째) 또는 $*(모든 인수) 를 통해 액세스 할 수 있으므로 스크립트를 시작해야합니다.

#!/bin/bash

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1

이제 name 인수는 스크립트에서로 액세스 할 수 있습니다 $name.

타임 스탬프를 얻으려면 date(1)명령을 사용하고 원하는 형식을 생성하도록 형식 지정자를 지정하십시오.

now=$(date +%Y%m%d%H%M%S)

지금 $now현재 날짜와 시간이 포함되어 있습니다.

따라서 다음과 같이 로그 파일을 작성할 수 있습니다.

logfile=/path/to/log/file/mylogfile.$now
echo "[$name]=[$now]" >> $logfile

쉘 기능을 사용하여 메시지를 기록하는 것이 더 낫습니다.

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

쉘 함수는 스크립트와 같은 방식으로 자체 인수에 액세스합니다 $1.

따라서 초기 스크립트는 다음과 같습니다.

#!/bin/bash

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1
now=$(date +%Y%m%d%H%M%S)
logfile=/path/to/log/file/mylogfile.$now

logit name = $name

(로그 파일은 지정한 정확한 형식이 아니며 각 줄의 시작 부분에 타임 스탬프가있는 것이 좋습니다).


7
#!/bin/bash

name=$1

echo "$(date '+%Y%m%d-%H:%M:%S') => " $name >> x.log

"bash deploymLog.sh whatever"를 실행하면 x.log가

20120220-23:53:50 =>  whatever

투표 할 때 이유를 제시하십시오. 감사합니다.

downvoter가의 이유를 놓쳤다 고 생각합니다 name=$1. 문자열 'name'만 그대로 출력하므로 $ name 변수는 사용되지 않습니다.
manatwork

오, 나빠 지적 해 주셔서 감사합니다. 좀 더 조심해야 해요
Dyno Fu

@DynoHongjunFu 그래도 변수의 이름과 값은 동일하므로 예제를 읽을 수있는 좋은 방법이 아닙니다.
Volker Siegel

다음과 같이 이름 name="$1"
Jake
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.