쉘 확장 및 위치 매개변수

쉘 확장 및 위치 매개변수


zgrepor 와 동등한 스크립트를 만들고 싶지만 bzgrep.tar

나는 매우 유사한 두 가지 시도를 했는데 더 나은 시도가 있는지, 개선할 수 있는지, 아니면 어떤 이유로 인해 중단되는지 궁금합니다. tar및 사용법을 알고 있지만 bzip2쉘 확장에 문제가 있는 경우가 종종 있습니다.

처음 사용 $@:

#!/bin/bash
FILE_IN="${@: -1}"; ## Take last arg (file name) 
echo "FILE_IN: $FILE_IN"; 

INPUT_PARAMS="${@%%$FILE_IN}"; ## Take all args, but last (options and pattern)
echo "INPUT_PARAMS: $INPUT_PARAMS"; 

### Here I have to treat $INPUT_FILE before using grep (skipped) ###  

grep "$INPUT_PARAMS" "$FILE_IN"; 
exit $?; 

두 번째는 변수를 사용합니다(위와 거의 동일하지만 몇 가지 차이점이 있습니다).

#!/bin/bash
ARGS="$@" 
FILE_IN="${!ARGS[@]: -1}"; ## Take last arg (file name) 

INPUT_PARAMS=${ARGS%%$FILE_IN};

### From here is identical 

모두 작동하는 것 같았지만 대본을 보고 bzgrep훨씬 더 복잡하다는 것을 알았습니다. 그래서 이것은 내 스크립트가 작동하지 않을 것이라고 생각하게 만듭니다.

어떤 아이디어가 있나요? 개선될 수 있나요?

답변1

여러 매개변수를 저장하려면 배열이 필요합니다.

file_in="${@: -1}"
input_params=("${@:1:$#-1}")

또는:

file_in="${@: -1}"
input_params=("$@")
unset 'input_params[-1]'

또는 다음 sh구문을 사용하세요.

n=$#
for file_in do
  shift
  [ "$((n = n - 1))" -gt 0 ] || break
  set -- "$@" "$file_in"
done
# input_params in "$@"

(모든 대문자 변수는 환경 변수용으로 예약되어야 합니다.)

관련 정보