쉘 스크립트의 for 루프에서 변수 및 파일 사용에 대한 몇 가지 질문 [닫기]

쉘 스크립트의 for 루프에서 변수 및 파일 사용에 대한 몇 가지 질문 [닫기]

해결해야 할 문제가 있습니다. 저는 AWS 터미널에서 권한을 수정하는 것 외에 직장에서 Linux를 거의 사용하지 않기 때문에 지식이 많지 않습니다. 나 역시 오랫동안 검색을 해봤지만, 효과가 있을 것이라고 생각했던 모든 것이 효과가 없다는 것을 발견했다. 저는 Ubuntu를 사용하고 있으며 간단한 쉘 스크립트를 만들고 bash를 사용하여 실행했습니다.

  1. 읽기에서 사용자 정수 입력을 얻은 다음 for 루프에서 각 숫자를 개별적으로 사용하는 방법이 있습니까? 예를 들어, 명령을 읽고 공백으로만 구분된 3 4 45 5를 입력하면 각 명령을 개별적으로 반복하여 합계에 모두 추가할 수 있습니까?

  2. 동일한 루프에서 파일을 사용하는 것은 어떻습니까? 3 4 45 5 한 줄에 동일한 값을 담고 있는 file.txt가 있는 경우 값을 반복하여 함께 추가하는 동일한 기능을 수행할 수 있나요?

  3. for 루프에서 변수를 사용하는 올바른 형식은 무엇입니까? 다음 내용이 맞나요? 다양한 방법으로 봤습니다.

#this is what I was trying
read var
sum = 0  #even the sum doesn't seem to work I dont see a different way to declare a number though
for i in  '${var[0]}'
do
 $((sum += i))  #confused here also have seen ('$sum' += '$i')
done 

echo '$sum'

이번에도 파일을 가지고 하려는데 변수 대신 파일을 사용하고 있습니다.

files = "/Documents/numbers.txt"
for i in $files

너무 간단해서 죄송합니다. 하지만 몇 년 전 학교에서 저는 기본을 제외한 대부분의 일에 완전히 새로운 사람이었습니다.

답변1

read var
sum = 0 

sum=0공백 없이 이어야 합니다 . 다음을 참조하세요.쉘 스크립트에서 변수 할당의 공백

for i in  '${var[0]}'

"${var[0]}"리터럴 문자열을 가져오는 대신 변수를 확장하려면 큰따옴표를 사용하세요. 다음을 참조하세요."...", '...', $'...' 및 $"..." 따옴표의 차이점은 무엇입니까?

인덱싱은 스칼라 변수가 하나만 있기 때문에 다소 혼란스럽기는 하지만( 다른 인덱스 ${var[0]}와 동일 $var하지만 null 값을 제공함) for i in "$var".

$((sum += i))

이는 작동하지만 쉘이 이를 명령으로 실행하려고 시도하는 결과까지 확장됩니다. 비슷한 오류가 발생합니다 bash: 3: command not found. ((sum += i))(달러 기호 없이) 또는 를 사용하여 sum=$((sum + i))다음을 확인하세요.https://mywiki.wooledge.org/BashGuide/CompoundCommands#Arithmetic_Evaluation

echo '$sum'

var와 동일합니다 echo "$sum".

명령을 읽고 공백으로만 구분된 3 4 45 5를 입력하면 각 명령을 개별적으로 반복하여 합계에 모두 추가할 수 있습니까?

넌 할 수있어

read var
for x in $var; do ...

이번에는 따옴표가 없습니다.

이는 결과적으로 인용되지 않은 변수를 분할하는 쉘에 의존합니다.일반적으로 이 작업은 피해야 합니다. 오류의 원인이 됩니다.. 파일 이름 글로빙도 발생합니다. 예를 들어 사용자가 이를 입력하면 *현재 디렉터리의 모든 파일로 확장됩니다. 바라보다:공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?그리고https://mywiki.wooledge.org/WordSplitting

files = "/Documents/numbers.txt"

먼저 공백을 다시 제거하십시오. 그런 다음 변수에 파일 이름을 할당합니다. 쉘은 실제로 파일을 읽으려는 의도를 추측할 수 없습니다. 이를 수행하려면 명령을 실행하고 출력을 저장하라고 명시적으로 지시해야 합니다(단순히 화면에 인쇄하는 대신). 이와 같이: files=$(cat "/Documents/numbers.txt").


$((sum + i))숫자를 포함하지 않으면 arithmetic( )이 이상한 일을 하고 임의의 명령을 실행하도록 속일 수도 있으므로 실제 생활에서는i~해야 한다입력에 숫자만 포함되어 있는지 확인합니다. 다음을 참조하세요.쉘 산술 평가에서 정리되지 않은 데이터 사용의 보안 영향

관련 정보