
#!/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
- 削除する文字(またはセットまたは範囲)はフラグの引数によって提供されるため、
-r
必要read
ありません。 - コマンドライン処理が完了した後、ファイル名(存在する場合)は場所パラメータに保持されます。
- コマンドラインフラグの処理が完了していない間はファイルを処理しないでください。
- オプション文字列が
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'
(標準入力ストリームからすべての小文字を削除します)