파일에 값이 있는지 테스트하는 방법은 무엇입니까?

파일에 값이 있는지 테스트하는 방법은 무엇입니까?

나는 사용하고있다

source ~/.rvm/scripts/rvm
repos="repo_1_ruby_193 repo_2_ruby_211 repo_3_ruby_191"
> rvm_check.txt
for repo in $repos
do
  cd ~/zipcar/$repo 2>rvm_check.txt
  cd ..
  echo $repo
  if [ -z `cat rvm_check.txt | grep not` ] # line 9
    then
      echo "YES"
    else
      echo "NO"
      exit 1
  fi  
done

대부분 잘 작동하지만 다음과 같은 결과를 얻습니다.

$ ./multi_repo_rubies.sh 
repo_1_ruby_193
YES
repo_2_ruby_211
YES
repo_3_ruby_191
./multi_repo_rubies.sh: line 9: [: too many arguments
NO
$

내가 -s무엇을 하려고 해도-z

원하는 "예/아니요"가 표시됩니다. 그런데 해당 [:오류를 방지하려면 어떻게 해야 합니까?

답변1

바꾸다:

if [ -z `cat rvm_check.txt | grep not` ]

그리고:

if ! grep -q not rvm_check.txt

test명령문에서 사용하는 이유 는 쉘이 OR 절로 if이동할지 여부를 결정하는 데 사용하는 종료 코드를 설정하기 때문입니다 . 종료 코드도 설정되어 있습니다. 따라서 여기서는 테스트가 필요하지 않습니다 . 문자열이 발견되면 종료 코드가 성공(0)으로 설정됩니다. 문자열을 찾을 수 없으면 성공할 것으로 예상됩니다. 따라서 종료 코드 결과를 무효화하는 데 사용합니다.thenelsegrep[grep!

설명하다

테스트 명령에는 [문자열이 따라올 것으로 예상됩니다 -z. grep 명령이 두 단어 이상을 생성하면 표시되는 오류와 함께 테스트가 실패합니다.

예를 들어 다음 샘플 파일을 고려해보세요.

$ cat rvm_check.txt
one not two

출력은 grep다음과 같습니다.

$ cat rvm_check.txt | grep not
one not two

test실행되면 세 단어가 모두 [...]내부에 나타나 명령이 실패하게 됩니다.

$ [ -z `cat rvm_check.txt | grep not` ]
bash: [: too many arguments

이는 입력한 내용과 동일합니다.

$ [ -z one not two ]
bash: [: too many arguments

한 가지 해결책은 큰따옴표를 사용하는 것입니다.

$ [ -z "`cat rvm_check.txt | grep not`" ]

큰따옴표로 인해 쉘 실행이 방지됩니다.분사. 따라서 grep여기의 출력은 별도의 단어로 분할되지 않고 단일 문자열로 처리됩니다.

그러나 grep합리적인 종료 코드가 설정되어 있으므로 위의 권장 줄에 표시된 것처럼 테스트가 필요하지 않습니다.

추가 댓글

  • 현재 선호되는 명령 대체 형식은 입니다 $(...). 백틱은 여전히 ​​작동하지만 취약합니다. 특히 백틱은 중첩될 수 없습니다.

  • cat이는 명령에서 파일 이름을 사용하는 명령에는 필요하지 않습니다. 바꾸다:

    cat somefile | grep something
    

    그냥 사용:

    grep something somefile
    

답변2

나는 결국 다음을 사용했습니다.

if [ -f ~/.rvm/scripts/rvm ]; then
  . ~/.rvm/scripts/rvm
else
  echo
  echo --- FAIL ---
  echo
  echo "You do not have a standard RVM install, cannot procede"
  echo "Please install rvm locally and re-run this program"
  exit 1
fi
repos="repo_3_ruby_191 repo_1_ruby_193 repo_2_ruby_211"
for repo in $repos
do
  if [ ! -f ~/zipcar/$repo/.ruby-version ]; then
    echo
    echo --- WARN ----
    echo
    echo No .ruby-version file present for $repo
    echo This *might* be an issue if there are ruby, e.g. rspec, tests.
    echo If so, please add and commit a .ruby-version file to $repo
    echo
  else
    version=$(cat ~/zipcar/$repo/.ruby-version)
    echo Checking ruby version: $version for repository: $repo"..."
    cd ~/zipcar/$repo 2>rvm_check.txt.$$
    if grep -qi 'not installed' ../rvm_check.txt.$$; then
      echo
      echo --- FAIL ---
      echo
      echo The required ruby version for $repo was not present on this machine
      echo Please install it with
      echo
      echo "  "RVM install $version
      echo
      echo and then re-run this program
      echo
      exit 1
    else
      echo $version Installed
    fi  
  fi  
done
echo
echo All required ruby versions verified as present through RVM

관련 정보