![명령 및 옵션을 사용한 입력 리디렉션](https://linux55.com/image/82017/%EB%AA%85%EB%A0%B9%20%EB%B0%8F%20%EC%98%B5%EC%85%98%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EC%9E%85%EB%A0%A5%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98.png)
프로그램 이름과 선택적 플래그라는 2개의 매개변수를 허용하는 스크립트를 작성하려고 합니다.
입력 파일에 프로그램 명령을 실행하고 출력 파일에 출력을 저장하려고 합니다.
$input_file < $($program options) > output_file
위의 동작을 달성하기 위해 다양한 구문 조합을 시도했지만 모호한 리디렉션, I/O 오류 등과 같은 오류가 발생합니다.
예:
./execute cat -n
프로그램 내에서 입력 파일에 cat을 적용하는 코드를 작성하고 싶습니다.
이것들은 작동하지 않습니다:
$(${1} ${2} names.txt) > test.out
names.txt < $($1 $2) > test.out
답변1
구문을 잘못 이해했습니다. 첫째, 입력 리디렉션 기호는 <
파일 끝이 아닌 앞쪽에 있습니다. 작업 순서는 중요하지 않습니다. 따라서 구문은 다음과 같습니다.
< inputfile command options > outputfile
또는
command options < inputfile > outputfile
(또는 다른 순열).
글쎄, 당신은 여분의 $
. 당신이 정말로 해야 할 일은
$program $options <$inputfile >$outputfile
${program}
및 을 및 ${options}
으로 바꿀 수 있습니다 .$1
$2
이 형태로 당신은 할 수 있습니다
#!/bin/bash
<names.txt $1 $2 >test.out
여러 옵션을 원하면 ./execute cat -n
또는 전화하세요. ./execute cat '-n -s'
이 형식에서는 여러 옵션을 가질 수 있지만 $2
따옴표 없이 따옴표로 묶어야 합니다. 공백은 인수를 다시 여러 단어로 확장합니다.
또 다른 (더 나은) 방법은 다음을 사용하는 것입니다.
#!/bin/bash
<names.txt "$@" >test.out
이제 인수에 인용된 문자열을 포함하여 원하는 만큼의 인수를 스크립트에 전달할 수 있으며, 인수는 스크립트에 전파된 후에도 함께 유지됩니다. 이제 작동합니다. ( ./execute cat -n - "bla bla.txt"
이전 형식에서는 파일 이름을 두 부분으로 분할했습니다.)
답변2
가능한 해결책은 다음과 같습니다.
명령과 옵션 문자열을 연결하면 많은 괄호를 처리할 필요가 없습니다.
command="$1 $2"
$command input_file > output_file
(제가 놓친 부분이 있으면 말씀해주세요)