bash 스크립트에서 "tr -d"를 사용하여 사용자가 입력한 문자를 삭제하는 방법은 무엇입니까?

bash 스크립트에서 "tr -d"를 사용하여 사용자가 입력한 문자를 삭제하는 방법은 무엇입니까?
#!/bin/bash
while getopts ":r" opt; do
    case $opt in
    r)
    [ -f "$1" ] && input="$1" || input="-"
    read $userinp
    cat $input | tr -d "$userinp"
    ;;
    esac
done

여기 내 코드가 있습니다. 본질적으로 파일을 구문 분석하려고합니다.또는문자열을 사용하면 사용자가 텍스트나 문자열에서 제거할 문자를 선택할 수 있습니다.

호출은 다음과 같습니다.

/stripchars -r 'd' test > out

그러면 파일 d에서 문자열이나 텍스트의 모든 인스턴스가 제거 되고 test새 문자열이나 텍스트가 out. 현재는 빈 출력이 표시됩니다.

답변1

  1. 제거할 문자(또는 세트 또는 범위)는 플래그의 인수에 의해 제공되므로 -r필요 read하지 않습니다.
  2. 명령줄 처리가 완료된 후 파일 이름(있는 경우)이 위치 매개변수에 유지됩니다.
  3. 명령줄 플래그 처리가 완료되지 않은 동안에는 파일을 처리하지 마십시오.
  4. 옵션 문자열이 getopts거꾸로 되어 있습니다.

해결책:

#!/bin/bash

# Process command line.
#   Store r-flag's argument in ch,
#   Exit on invalid flags.
while getopts 'r:' opt; do
    case "$opt" in
        r) ch="$OPTARG" ;;
        *) echo 'Error' >&2
           exit 1 ;;
    esac
done

# Make sure we got r-flag.
if [[ -z "$ch" ]]; then
    echo 'Missing -r flag' >&2
    exit 1
fi

# Shift positional parameters so that first non-flag argument
# is left in $1.
shift "$(( OPTIND - 1 ))"

if [[ -f "$1" ]] || [[ -z "$1" ]]; then
    # $1 is a (regular) file, or unset.
    # Use file for input, or stdin if unset.
    cat "${1:--}" | tr -d "$ch"
else
    # $1 is set, but not a filename, pass it as string to tr.
    tr -d "$ch" <<<"$1"
fi

이는 다음과 같이 사용됩니다.

$ ./script -r 'a-z' file

( 의 모든 소문자를 제거하세요 file.)

$ ./script -r 'a-z' "Hello World!"

(주어진 문자열에서 모든 소문자를 제거합니다.파일 이름이 아닌 이상)

$ ./script -r 'a-z'

(표준 입력 스트림에서 모든 소문자를 제거합니다)

관련 정보