#!/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
它。 - 命令行处理完成后,文件名(如果有)保留在位置参数中。
- 当您尚未处理完命令行标志时,请勿处理该文件。
- 选项字符串 to
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'
(删除标准输入流中的所有小写字符)