使用 Bash 案例语句删除文件

Using Bash Case Statement to remove files

我目前有几个文件名为 file1.txt file2.txt file3.txt

我想创建一个案例语句来选择要删除的内容,我目前有:

files=" "
read number

case $number in
1) files=rm file1.txt ;;
2) files=rm file2.txt ;;
3) files=rm file3.txt ;;
*) files='this file does not exist' ;;
esac
echo $options

然而,每当我尝试 运行 时,它都会显示一个错误,例如 "file1.txt: command not found."

谁能解释一下我做错了什么?

files=rm file1.txt

...将 file1.txt 作为环境变量 files 设置为值 rm 的命令运行。

这通常适用于 任何 前面有 KEY=VALUE 对的简单命令:这些对被视为环境变量,仅在该命令的持续时间内设置.


也许你想要:

files=file1.txt

...或者:

files=( ) # create an empty array, not a scalar (string) variable.
read number
case $number in
  1) files+=( file1.txt ) ;;  # or simply: 1) rm file1.txt ;;
  2) files+=( file2.txt ) ;;  # or simply: 2) rm file2.txt ;;
  3) files+=( file3.txt ) ;;  # or simply: 3) rm file3.txt ;;
  *) echo "This file does not exist" >&2 ; exit 1;;
esac

# ...if collecting filenames in an array, then...
echo "Removing files:" >&2
printf '  %q\n' "${files[@]}" >&2     # ...expand that array like so.

rm -f "${files[@]}" # likewise

要了解为什么像 cmd='rm file1.txt' 这样的东西——虽然语法正确——却很糟糕,并且容易出现错误,请参阅 BashFAQ #50