나는 사용하고있다
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)으로 설정됩니다. 문자열을 찾을 수 없으면 성공할 것으로 예상됩니다. 따라서 종료 코드 결과를 무효화하는 데 사용합니다.then
else
grep
[
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