在 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. 选项字符串 togetopts是向后的。

解决方案:

#!/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'

(删除标准输入流中的所有小写字符)

相关内容