Bash 스크립트의 작은따옴표

Bash 스크립트의 작은따옴표

내 명령 구문은 다음과 같습니다

command 'variable'

변수는 작은따옴표로 전달되어야 합니다.

이제 입력 파일과 함께 for 루프를 사용할 때

variable1
variable2
variable3

for i in `cat $1`
do
       command '$i'
done

shell>file.sh input

bash는 입력을 변수로 받아들이지 않기 때문에 작은 따옴표가 불완전합니다. 변수를 그대로 유지하기 위해 작은 따옴표를 사용하는 방법을 제안하십시오.

답변1

작은따옴표로 묶인 내용은 입력한 대로 정확하게 전달됩니다. 따라서 command '$i'두 문자의 합으로 구성된 문자열이 명령에 전달됩니다.$i

사용된 변수 값을 얻으려면 큰따옴표를 사용해야 합니다.

for i in `cat $1`
do
       command "$i"
done

또는 코드에 파일의 한 줄에 하나의 단어가 필요하므로 전체 루프를 다음 줄로 바꿉니다.

xargs -n1 -r command <"$1"

답변2

필요에 따라 이 작업을 수행할 수 있습니다.

while read i
do
       command "'$i'"
done < "$1"

답변3

command파일의 각 줄(경로가 에 저장되어 있음 )을 호출 $1하고 해당 줄의 내용을 그대로 단일 인수로 전달하려면 command다음을 사용할 수 있습니다.

  • GNU 사용 xargs:

    xargs -d '\n' -n 1 -r -a "$1" command
    
  • POSIX 쉘 사용:

    while IFS= read -r line <&3; do
      command "$line" 3<&-
    done 3< "$1"
    

당신의

for i in `cat $1`; do
  command '$i'
done

리터럴 문자열을 전달하는 데 $i따른 명백한 문제 외에도 command몇 가지 다른 문제가 있습니다.

  • 따옴표를 잊어버렸습니다 $1. 이는 분할+글로브의 영향을 받는다는 의미입니다. 즉, 공백, 탭, 개행 문자 또는 와일드카드가 포함된 파일 경로에 대해 제대로 작동하지 않음을 의미합니다.
  • --옵션의 끝을 표시하는 것을 잊었습니다 . cat즉, 로 시작하는 파일 경로에서는 제대로 작동하지 않습니다 -. 를 사용하더라도 cat -- "$1"와 함께 작동하지 않는 것이 좋습니다 -. 옵션도 수락 cat < "$1"하는 경우 ( 또는 )를 사용해야 할 수도 있습니다.command--xargs ... command --command -- "$line"
  • 이는 `cat $1`분할+글로브 연산자를 다시 호출합니다. 따라서 파일 줄을 반복하는 대신 파일 내용 분할로 인해 발생하는 각 glob 패턴과 일치하는 파일 목록을 반복합니다.

답변4

따옴표 없이 명령을 사용할 수 있습니다.

for i in `cat $1`
do
       command $i
done

작은따옴표를 사용하면 '$i'문자 그대로의 의미를 알 수 있습니다 $i.

큰따옴표 사용 "$i": 에서 값을 얻을 수 있지만 $i단일 문자열로 얻을 수 있습니다(일반적으로 원하는 동작입니다).

따옴표 없음 $i: 의 값으로 확장되지만 $i인수는 분할됩니다. 따라서 예를 들어 -a -b큰따옴표와 함께 공백이 있는 경우 -a -b일반적으로 예상되지 않는 매개변수를 가지게 되지만 마지막 경우에는 -a-b두 개의 다른 매개변수를 가지게 됩니다.

따옴표를 사용하지 않는 것은 일반적으로 보안 문제이므로 입력이 악의적이지 않다는 것을 확실히 알고 있는 경우에만 이 작업을 수행해야 합니다.

관련 정보