내 명령 구문은 다음과 같습니다
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
두 개의 다른 매개변수를 가지게 됩니다.
따옴표를 사용하지 않는 것은 일반적으로 보안 문제이므로 입력이 악의적이지 않다는 것을 확실히 알고 있는 경우에만 이 작업을 수행해야 합니다.