2012-11-12 4 views
0

"grep"명령을 사용하여 문자열에 슬래시가 포함되어 있는지 확인하고 싶습니다. 처음에는 쉽지만 다음 스크립트를 작성했습니다. 내가 위의 스크립트는 "공간"변수에 있기 때문에 실패한다쉘 스크립팅 grep 명령

foo="someone/books in stack" 

다음 문자열 변수 "foo는"을 설정하면

foo=someone/books 
if [ `echo "$foo" | grep '/'` ] 
then 
    echo "has forward slash" 
fi 

그러나, 문제는 모서리에 foo, 명령이 확장되면 if 문의 조건은 다음과 같습니다.

grep '/' someone/books in stack 

"공백"때문에 위의 "grep"명령에 인수가 너무 많아 불법입니다. 참고로, 나는 경우 문을 사용하여 해결이 문제에 시도 : 그것은 자세한 이후

case $foo in 
    */*) 
     echo "has forward slash" 
     ;; 
    *) 
     ;; 
esac 

는 그러나, 나는 case 문을 사용하지 않습니다. grep 명령이나 다른 명령을 사용하여이 문제를 어떻게 해결할 수 있습니까?

+0

실제로 문제가 존재하지 않는 당신이 그것을 설명하는 방법 : 당신이 GREP을 사용하여 주장 반환 그것에서 상태와하지를 출력을 사용하는 경우

case "$foo" in */*) echo "has forward slash" ;; esac 

grep에 설명 된 것처럼 greps 명령 행으로 확장되지 않으므로 잘 작동합니다./echo를 다시 확인하십시오. grep '/''실제로 잘 작동합니다. –

+0

@Yefim Dinitz 사실, 시도해 봅니다. 그것은 잘 작동하지 않습니다 – eleven

+0

그럼 내가 본 것 중 가장 이상한'grep'을 사용해야합니다 ... –

답변

2

if 문을 올바르게 사용하고 있지 않습니다. if-condition의 명령은 확장 될 때 단일 문자열이되도록 따옴표로 묶어야합니다. 이처럼 : 당신이 GREP의 반환 코드를 확인하면

if [ "`echo "$foo" | grep '/'`" ] 
then 
    echo "has forward slash" 
fi 

심지어 더 나은 귀하의 경우 조건 :

if $(echo "$foo" | grep -q '/') 
then 
    echo "has forward slash" 
fi 

또한 멀리 grep과 함께 할 대신에 이것을 사용할 수 있습니다 :

foo="someone/books in stack" 
if [[ "$foo" == */* ]] 
then 
    echo "has forward slash" 
fi 
+0

알아요. 하지만/bin/bash가 아닌/bin/sh는 어떨까요? – eleven

0
foo="someone/books with spaces" 
bar=`echo $foo | grep '/'` 
if [ $? -eq 0 ] 
then 
    echo "$foo has forward slash" 
fi 

이것은 저에게 효과적입니다.

이런 식으로 종료 상태를 사용하지 않으려는 경우보다 정확한 답을 얻기 위해 도그 베인의 답장을 살펴 보시기 바랍니다.

0

장황함에 아무런 문제가 없습니다. 종종 유지 관리가 용이합니다. 그러나, 당신은 그것을 간결하게 할 수있다. 당신은 아무것도하지 않으면 모든 개행이 필요하지 않으며 기본 분기를 필요로하지 않는다. 파이프 공백 문자를 사용하면 경우 -

if echo "$foo" | grep -q /; then 
    echo "has forward slash" 
fi