2014-10-14 12 views
0

제목 : 스칼라 변수 내에서 bash 매개 변수 확장echo를 통한 스칼라 변수 내에서 bash 매개 변수 확장

두 파일간에 diff를 실행하는 bash 스크립트가 있습니다. diff가있는 경우 statement1과 statement2를 인쇄하십시오. 길기 때문에 변수에 넣을 수 있지만 echo 문 은 매개 변수를 확장하지 않습니다. bash에서이 작업을 수행 할 수 있습니까?

#!/bin/bash 
set -x 

source="/home/casper" 
target="data/scripts" 
statement1="There is a change in ${i}, please check the file" 
statement2="or cp /home/casper/${i} /data/scripts/$i" 

for i in file1 file2l file3 file4 file5 ; do 
    sleep 1 ; 
    if diff $source/$i $target/$i 2>&1 > /dev/null ; then 
     echo " " 
    else 
     echo "$statement1 " 
     echo "$statement2 " 
    fi 
done 
exit 0 

스크립트가 작동하는 것처럼 보입니다. 스크립트가 작동 할 때 diff가 발견됩니다. 그러나 이것이 인쇄됩니다.

There is a change in , please check the file 
or cp /home/casper/ data/scripts/ 

가 나는 eval를 사용

There is a change in file2, please check the file 
or cp /home/casper/file2 /data/scripts/file2 
+0

'2/& gt;/dev/null'을'>/dev/null 2> & 1'로 바꿉니다. – Cyrus

+0

첫 번째와 두 번째'$ {i}'를'\ $ {i} '로 바꿉니다. – Cyrus

+0

'source'는 명령의 이름이기도합니다. 대신 변수 이름에'src'를 사용하는 것이 좋습니다. 또한 각'statement' 변수를 두 번 이상 액세스하지 않으면 왜 변수를 모두 사용하지 않는 것이 좋을까요? 예 : 'echo "$ {i}에 변화가 있습니다. 작동 할" "파일을 확인하십시오. – vastlysuperiorman

답변

0
이 수행 할 수 있습니다

을하고 싶은 말 :

TEMPLATE_MSG="aaa \${VALUE} ccc" 
... 
VALUE="bbb" 
eval echo "${TEMPLATE_MSG}" 

그러나 eval 기타 옵션 :-) 악 때문에, 사용하지 않는 것이 좋습니다 패턴 대체를 사용 중입니다.

TEMPLATE_MSG="aaa @[email protected] ccc" 
... 
VALUE="bbb" 
echo "${TEMPLATE_MSG/@[email protected]/${VALUE}}" 

메시지에 고유 한 패턴을 넣으십시오. @[email protected]) 메시지를 인쇄 할 때 변수 내용으로 바꿉니다.

1

$i은 확장 할 때가 아니라 statement1statement2을 정의 할 때 확장됩니다. 셸 함수를 사용하여 텍스트를 출력하십시오.

notification() { 
    echo "There is a change in $1, please check the file" 
    echo "or cp /home/casper/$1 /data/scripts/$1" 
} 

source="/home/casper" 
target="data/scripts" 
for i in file1 file2l file3 file4 file5 ; do 
    sleep 1 ; 
    if diff "$source/$i" "$target/$i" 2>&1 > /dev/null ; then 
     echo " " 
    else 
     notification "$i" 
    fi 
done 
exit 0