2014-10-02 2 views
1

좋아 파일 이름, 여기에 내가있어 무엇 :값 읽기 배쉬 프로그래밍 및

#!/bin/bash 

read num 

while read line 
do 
    name=$line 
    echo "Text from file: $name" 
    for i in {0..num}; do 
     echo -e "\n" 
    done 
done <$1 

아이디어는 파일에 읽고 각 라인 사이에 공백을 넣어하는 것입니다. 사용자는 각 행 사이에 추가하려는 공백 수를 입력합니다 ("num"으로 읽음). 목적은 콘솔에 입력 할 수있게하는 것입니다 : ./fileName 3 readFile

그리고 각 줄 사이에 3 개의 공백을 넣은 텍스트를 readFile에서 출력해야합니다. 대신 나에게 "라인 13 : 3 : 그런 파일이나 디렉토리가 없다"라는 오류를줍니다. 따라서 정수로 3을 읽지 않고 "3"이라는 파일을 열려고합니다. 이걸 어떻게 막을 수 있을까요? 더 나은 해결책이 있다면, 귀하의 의견을 보내 주시면 감사하겠습니다. 나는 bash에 약간 새롭기 때문에 나는 멍청한 상태로 유감이다. 어떤 도움을 주시면 감사하겠습니다. 지역 사회에 감사드립니다.

+2

당신은 변수를 포함 할 수 없습니다'{}'확장, 사용'$ (서열 0 $ 인분)'. 또한 확장에서 1을 시작하고 싶을 것입니다. 그렇지 않으면 1 공간은 2 번의 반복 '0'과'1'과 같습니다. – BroSlow

+0

고마워요. 그걸 몰랐지만 여전히 "No such file or directory"라는 오류를줍니다. . 입력 사항을 올바르게 처리하고 있습니까? – user2891908

+0

파일에 파일 이름에 공백이 있습니까? '$ 1'은 리디렉션의 올바른 위치에서 단어 분할을 방지하기 위해 인용되어야합니다. – BroSlow

답변

0

이 당신을 위해 작동합니다 : here 가능한 나오지도 명령 (및 다른 많은 나오지 한 라이너)의

nSpaceFile() { 
    # Create the sed script we need to space the file out. 
    # One `G;` for each extra line we want to add. 
    declare sedscript=$(printf -- %*s $(($1 - 1)) | sed -e 's/ /G;/g'); 

    # Run the sed script on the file(s) given. 
    sed "$sedscript" "${@:2}" 
} 

nSpaceFile 3 file 

설명.

0

man bash을 인용 :

To avoid conflicts with parameter expansion, the string ${ is not 
considered eligible for brace expansion. 

은 그래서 변수는 중괄호 확장 내부 확장 할 수 없습니다. 이러한 상황에서는 seq을 사용합니다. eval을 대신 사용할 수도 있지만 코드 삽입까지 열어 줄 수 있으므로 피할 수 있으면 권장하지 않습니다. @BroSlow 언급했듯이 ./fileName 3 readFile 같은 호출시

, 3 인수 $1이고 readFile 인수 $2이다.

while read -r line; do 
    if [[ $line ]]; then 
     echo "$line" 
     for i in $(seq $1); do 
      echo 
     done 
    fi 
done < "$2" 

을하지만 특히 큰 파일를 들어, read 루프를 통해 awk를 사용하는 것이 더 효율적이 될 것이다 :

이 같은 스크립트를 작성할 수 있습니다.

#!/usr/bin/env awk -f 

NF { 
    print 
    for(i=1; i<=num;i++) 
     printf "\n" 
} 

스크립트 실행을 확인하고이처럼 호출 할 수

$ ./fileName.awk num=3 readFile