2009-04-13 5 views
2

"ls -la/etc/passwd"와 같은 유닉스 명령 목록이 들어있는 파일이 있습니다. 이 명령 목록을 반복하고 적절한 조치를 취하고 싶습니다.셸 프로그래밍에서 파일의 명령 목록을 반복합니다.

#!/bin/bash 
clear 
for cmds in `cat /tmp/cmd` 
do 
     if [ $cmds ] ; then 
       echo $cmds; 
     fi 
done 

하지만, 내가 무엇을 얻을하는 명령이

ls 
-la 
/etc/passwd 
ls 
-la 
/etc/shadow 

하지

ls -la /etc/passwd 
ls -la /etc/shadow 
처럼 다른 라인에서 깨진 출력은 다음과 같습니다

현재, 내 코드는 같은입니다

아이디어가 있으십니까?

IFS=' 
' 

또는 배쉬 :

답변

1

귀하의 루프 전에이 추가

IFS=$'\n' 

IFS이 필드에 입력을 분할하는 데 사용되는 문자의 목록이 포함되어 있습니다; 공백, 탭 및 줄 바꿈을 포함하므로 기본적으로 잘못된 동작이 발생합니다. 그것을 개행 문자로 설정하는 것은 개행 문자로만 나뉘며 원하는 것입니다.

+0

당신의 솔루션은 부분적으로 작동했지만 모든 n 또한 입력 필드를 분리하는 데 사용되었습니다.그리고, 잘못된 출력을했습니다. /etc/ssh/sshd_co fig svcs -a | grep 네트워크 etstat -a | grep -i liste 모든 n이 손실되고 incoorectly 새로운 줄이 표시되는 것을 볼 수 있듯이. – Epitaph

+0

죄송합니다. 내 버전의 Bash는 IFS에서 \ n을 특별히 해석합니다. 일반적으로 문자열에 개행 문자를 넣는 것은 작동하지 않습니다. 좀 더 이식성이 좋도록 내 대답을 편집했습니다. 문자열에 개행 문자를 넣거나 Bash의 C 스타일 인용을 사용할 수 있습니다. –

1

나는 당신이이 (큰 따옴표와 역 따옴표를 둘러싸고) 할 수 있다고 생각 :

"`cat /tmp/cmds`" 

어쩌면 확실하지 이런 식으로 뭔가를 (시도 점검 할 예정이다 "만일"당신의 무엇을 - 나는 그것을 수정 확인하기 위해 $의 CMDS의 var에 빈 문자열)하지 않았다 : - 여러 줄에 걸쳐 어떤 연속성을 -

#!/bin/bash 

clear 

for cmds in "`cat cmds.txt`" 
do 
    if [ "$cmds" != '' ]; then 
     echo "$cmds" 
    fi 
done 
+0

큰 따옴표를 넣은 후에 오류가 발생했습니다 /tmp/fo : 행 6 : [: 너무 많은 인수가 있습니다. – Epitaph

+0

예제가 추가되었으므로 확실하지 않습니다. :) –

1

파일의 각 라인은 전체 명령 인 경우, 당신은 사용할 수 있습니다 read :

당신은 선형 구조를 선호하고 while 루프는 다음과 무엇에 나타내는 서브 쉘에서 아무것도 필요하지 않은 경우

또는, 당신은 사용할 수 있습니다

cat cmds.txt | 
while read cmd 
do 
    if [ -z "$cmd" ] 
    then : Empty 
    elif $cmd 
    then : OK 
    else : Oops 
    fi 
done 

주에게 따옴표의 신중한 사용을 테스트 된 문자열. 나는 여전히 명시적인 '-z'연산자를 선호한다. 그것이 100 % 필요하지 않다고 주장하는 사람들이 있습니다. 저는 여전히 두 배가 아닌 하나의 대괄호를 사용합니다 - 주로 20 년 이상 된 습관이 아닙니다. bash 또는 ksh을 사용하여 쉘을 배운 사람들은 대개 이중 대괄호 연산자를 선호합니다.

물론 I/O 리디렉션을 조심하십시오.

sh cmds.txt 

이 중 지금까지 가장 신뢰할 수있는 방법입니다 : 당신은 다음과 다른 다양한에서 절을 아무 상관이없는 경우

또한, 당신은 단순히 쉘에 cmds.txt를 공급한다 여러 줄 명령을 처리합니다.

관련 문제