2017-12-28 28 views
1

인수가 파일인지 확인하려면 인수가 파일인지 또는 폴더인지 확인하십시오. 줄 번호가 파일 인 경우 줄 수를 계산합니다. 큰 다음 20 이하 그는 문제가이 명령에 몇 가지 지침을 n= cat $a | wc -lwc 실패한 셸 스크립트에서 파일의 줄 수 얻기

내 스크립트 : 이것은 잘못된 명령 실행의 출력

#!/usr/bin/env bash 
echo 'Hello this is the test of' `date` 
echo 'arguments number is ' $# 
if [ $# -eq 4 ] 
then 
    for a in [email protected] 
    do 
    if [ -d $a ] 
    then 
     ls $a > /tmp/contenu 
     echo "contenu modified" 
    elif [ -f $a ] 
     then 
#  this instruction must set a numeric value into n 
      echo "my bad instruction" 
      n= cat $a | wc -l 
      echo "number of lines = " $n 
#  using the numeric value in a test (n must be numeric and takes the number of lines in the current file) 
      if [ $n -eq 0 ] 
      then 
       echo "empty file" 
      elif [ $n -gt 20 ] 
      then 
       echo ` head -n 10 $a ` 
      else 
       cat $a 
      fi 
    else 
     echo "no file or directory found" 
    fi 
    done 
else 
echo "args number must be 4" 
fi 

my bad instruction 
5 
number of lines = 
ExamenEx2.sh: line 19: [: -eq : opérateur unaire attendu 

답변

1

라인 n= cat $a | wc -l은 잘못된 명령입니다. bash 쉘 스크립팅은 대소 문자를 구분한다는 것을 항상 기억하십시오. 귀하의 명령은 두 개의 분리 된 명령

n= cat $a | wc -l 
#^^ ^^^^^^^^^^^^^^ 
#1   2 

첫 번째 부분은 바로 변수 n하고 다음 인쇄 변수 a에 저장된 파일의 라인 카운트에 빈 문자열을 저장을 실행하는 것으로 쉘에 의해 해석된다. 셸에서이 오류를 발생시키지 않습니다. 왜냐하면 구문을 위반하지 않기 때문입니다 (의미가 잘못되었습니다). 그러나 라인 수는 변수 n에 할당되지 않습니다.

LHS의 빈 변수와 비교할 때 조건부 if [ $n -eq 0 ]에 도달하면 오류가 발생합니다.

명령을 실행하고 출력을 저장하려면 명령 대체 ($(..))가 필요합니다. 파일의 이름은

n=$(wc -l < "$a") 

참고 내가 쓸모 cat 사용을 제거했다고는 $a 그냥 않는 포함되어 있다고 가정하고, wc에 배관. 그러나 wc은 입력 스트림에서 직접 읽을 수 있습니다.

또한 스크립트에 여러 가지 나쁜 습관이 있음에 유의하십시오. 다음

  1. 항상 따옴표 쉘 변수를 어떻게 기억 - "$#", "[email protected]", [ -f "$a" ]
  2. [ -d "$a" ]는 사용하지 마십시오``쉽게 중첩 될 수 없습니다이며 수도 있기 때문에, 명령 대체를위한 인용과 관련된 문제도 있습니다. 스크립트가 bash 아래에있는 공간을 포함하는 변수가 LHS
에 인용없이 사용할 수 있습니다 실행되고 있는지 확신하는 경우가 조건식 [[을 사용할 수 있습니다