2016-08-24 3 views
0

함수의 인수로 주어진 변수의 이름에 특정 문자열이 들어 있는지 테스트하고 싶습니다. 그렇지 않으면 다른 동작을 수행합니다. 여기 Bash 변수 이름에 문자열이 포함되어 있는지 확인하십시오.

내가 무엇을 달성하고자하는의 아주 기본적인 설명입니다

#!/bin/bash 

varA="a" 
varB="b" 
varC="c" 
varD="d" 
varE="e" 
varF="f" 

function1() 
{ 
     if name of argument $1 does not contain "A"; then 
       echo "no A in $1" 
       further actions done using the value of varA and others... 
     elif name of argument $1 contains "A"; then 
       echo "A in $1" 
       further actions done using the value of varA and others... 
     fi 
} 

function1 $varA $varB $varC 
function1 $varD $varE $varF  

을 실행 할 때 몇 가지 조사를하는 동안 나는 보았다

A in varA 
no A in varD 

을 줄 것이라고 변수의 이름을 수 $ {! var @}이라고하기 때문에 다음 코드를 시도해 보았습니다.

1 #!/bin/bash 
    2 
    3 varA="a" 
    4 varB="b" 
    5 varC="c" 
    6 varD="d" 
    7 varE="e" 
    8 varF="f" 
    9 
10 function1() 
11 { 
12   if [[ "${[email protected]}" != *"A" ]]; then 
13     echo "no A in $1" 
14   elif [[ "${[email protected]}" == *"A" ]]; then 
15     echo "A in $1" 
16   fi 
17 } 
18 
19 function1 $varA $varB $varC 
20 function1 $varD $varE $varF 

e 스크립트를 실행하면 다음과 같은 오류 메시지가 나타납니다.

./testx.sh: line 12: ${[email protected]}: bad substitution 
./testx.sh: line 12: ${[email protected]}: bad substitution 

어떤 도움을 주실 수 있나요? 당신이

+1

위치 적 인수로는 가능하지 않다고 생각합니다. 함수가 호출 될 때 변수는 이미 값으로 대체되므로 참조 할 변수 이름은 없습니다. – karakfa

+0

이 호출은 실제로'function1 $ varA $ varB $ varC' (제 2 코드 참조)이고 여기에 변수 값을 사용하고 있지는 않지만 실제로 작업중인 실제 스크립트에서는 그 값을 사용하고 싶습니다. 함수에서 다른 작업을 수행하십시오. – arielle

+0

@arielle : 확인. 이 경우에는 불가능합니다. '$ {! prefix @}' "이름이'prefix'"로 시작하는 변수의 이름으로 확장됩니다; 즉, glob'prefix *'와 같지만 쉘 변수의 이름에 해당합니다. 'prefix'는 문자의 문자열입니다. – rici

답변

1

당신이 만약 ""이라는 변수의 이름이 ""인지 확인한 다음 해당 함수에 부여하십시오.

변수의210

하지 내용 : 다음

function1 $varA    # INCORRECT 

, 당신은 함수 내에서 변수의 이름을 테스트 할 수 있습니다 :

if [[ $1 == *A* ]]; then 

스크립트는이 하나가 될 수 :

#!/bin/bash 

function1() 
{ 
     if [[ $1 == *A* ]]; then 
       echo "A in $1" 
     else 
       echo "no A in $1" 
     fi 
} 

function1 varA varB varC 
function1 varD varE varF 

"var 값"이 필요한 경우 다음을 사용하십시오.

value=${!1} 

man bash 내부에서 "간접 확장"이라고합니다.

그 후 value에는 $1이라는 변수의 복사본이 포함됩니다.

eval $1=newvalue 

: $ 1의 값이 외부 사용자에 의해 설정 될 수 있다면, 매우 불안

declare $1=newvalue 

을 또는 :

$1가 가리키는 변수의 값을 변경하려면 이것을 사용

${!var*} (또는 ${[email protected]})을 사용하면 목록의 이름을 사용하는 모든 변수를 얻을 수 있습니다. var으로 시작하십시오. 특정 변수를 참조하지 않습니다.

$ eval var{A..F}=1    # create the list of variables 
$ echo ${!var*}     # use the expansion to list variables 
varA varB varC varD varE varF 

${!1*}의 팽창이 시작 1 변수 목록 했어야. 이 변수 이름은 bash에서 유효하지 않습니다 (위치 매개 변수 제외). 즉 : 변수 이름을 숫자로 시작할 수 없습니다.

확장은 (따라서) 오류이므로 bash에 의해보고됩니다.

+0

그게 의미가 있습니다! 설명 할 시간을내어 주셔서 감사합니다 :) – arielle

1

당신은

if [[ "$1" == *"A"* ]] 
then 
    echo "At least one variable name has patttern A" 
fi 
+0

하지만 내 실제 스크립트에서는 함수 내에서 더 많은 작업을 수행하기 위해 첫 번째 인수의 값을 사용하고자합니다. 이름 만이 아니라 여전히 작동합니까? – arielle

+0

위치 인수 @arielle로는 불가능할 수도 있습니다. : – sjsam

+2

'$ {! var *} ''구문을 사용하여'var'으로 시작하는 모든 정의 된 변수를 찾지 못했습니다. 감사합니다! – anishsane

0

이주의

function1 "${!var*}" 

을하고 함수 내에서 했어야 감사는 함수 호출의 첫 번째 변수에 대한 확인 찾고있는 스크립트 (예 : $ (1)). 그래서 단지 당신이 쓴 의사 코드에서 기대하는 일을 할 것입니다 아래 varA

코드를 확인 할 function1 $varA $varB $varC 요구 :

#!/bin/bash 

varA="checkAinvariable" 
varB="b" 
varC="c" 
varD="d" 
varE="e" 
varF="f" 

function1() 
{ 
     if [[ "$1" != *"A"* ]]; then 
       echo "no A in $1" 
     elif [[ "$1" == *"A"* ]]; then 
       echo "A in $1" 
     fi 
} 

function1 $varA $varB $varC 
function1 $varD $varE $varF 

출력은 다음과 같습니다

A in checkAinvariable 
no A in d 
+1

'함수에 인수로 주어진 변수의 이름이 특정 문자열을 포함합니다 '라고 말한 경우 이름이 pal가 아니어야합니다! – sjsam

관련 문제