여기에는 여러 가지 문제가 있습니다. 먼저 옵션 (getopts 루프)을 구문 분석 한 다음 인수 목록 (shift $(($OPTIND-1))
포함)에서 제거해야합니다. 다음은 $ 1 및 $ 2에서 FILE1 및 FILE2를 가져옵니다. 둘째, getopts에게 -o가 인수 (getopts "o:"
)를 취해야한다고 말할 필요가있다. 셋째, getopts 루프는 잘못된 옵션을 검사해야합니다 (FILE1과 FILE2가 모두 지정되었는지 확인해야합니다). 넷째, $ outputfile이 공백인지 검사 할 때, 그 주위에 큰 따옴표를 넣고 문자열 테스트 (-eq가 숫자 평등을 검사하고, 숫자 이외의 다른 값을 비교할 때 오류가 발생합니다)를 사용합니다. 다섯째, 파일 이름에 재미있는 문자가있는 경우 파일 이름 주위에 큰 따옴표를 두어야합니다. 마지막으로, 실행하려고하는 실제 명령 (붙여 넣기, tr 등)이 이해가되지 않습니다 (그래서 거의 혼자 남겨 두었습니다). 여기에 재 작성 내 샷이야 :
#!/bin/sh
outputfile=''
while getopts "o:" OPTION
do
case $OPTION in
o)
outputfile="$OPTARG"
;;
[?])
echo "Usage: $0 [-o outfile] file1 file2" >&2
exit 1
;;
esac
done
shift $(($OPTIND-1))
if [ $# -ne 2 ]; then
echo "Usage: $0 [-o outfile] file1 file2" >&2
exit 1
fi
FILE1="$1"
FILE2="$2"
if [ -n "$outputfile" ]; then
cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" | paste "$FILE1" "$FILE2" | tr '\t' '\n' > "$outputfile"
else
cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n"
paste "$FILE1" "$FILE2" | tr '\t' '\n'
fi
덕분에 나는 아주 배쉬 프로그래밍에 새로운입니다. 이 프로그램을 실행하고 ./test file1 file2라고 말하면 올바른 출력을 출력하지만 먼저 file1을 찾을 수 없다고 말하면서 ./test -o hello file1 file2를 사용하면 file1이 아직 발견되지 않는다고 말합니다. – BillPull
'... | "$ FILE1"- | ...'부분이 $ FILE1을 명령으로 실행하려고하는데,이 명령은 "명령을 찾을 수 없음"오류를 발생시킵니다. 그 부분은 제가 그 부분이별로 의미가 없다고 말한 이유의 일부입니다. –