bashスクリプトで "tr -d"を使用してユーザーが入力した文字を削除する方法は?

bashスクリプトで
#!/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'

(標準入力ストリームからすべての小文字を削除します)

おすすめ記事