我正在使用简单方法写入文件echo
(我愿意使用其他方法)。
当写入已存在的文件时,我可以让 echo 提示用户是否覆盖?
例如,也许像这样的论点-i
会起作用?
echo -i "new text" > existing_file.txt
并且期望的结果是提示用户是否覆盖......
echo -i "new text" > existing_file.txt
Do you wish to overwrite 'existing_file.txt'? y or n:
答案1
重定向>
是由 shell 而不是 完成的echo
。事实上,shell 在命令启动之前就进行了重定向,默认情况下,shell 将覆盖任何同名文件(如果存在)。
如果文件存在,你可以使用 shellnoclobber
选项来阻止它被 shell 覆盖:
set -o noclobber
例子:
$ echo "new text" > existing_file.txt
$ set -o noclobber
$ echo "another text" > existing_file.txt
bash: existing_file.txt: cannot overwrite existing file
要取消设置该选项:
set +o noclobber
您将不会获得任何选项,例如接受用户输入来覆盖任何现有文件,而无需执行诸如定义函数并每次使用它之类的手动操作。
答案2
使用test
命令(以方括号为别名[
)查看文件是否存在
$ if [ -w testfile ]; then
> echo " Overwrite ? y/n "
> read ANSWER
> case $ANSWER in
> [yY]) echo "new text" > testfile ;;
> [nN]) echo "appending" >> testfile ;;
> esac
> fi
Overwrite ? y/n
y
$ cat testfile
new text
或者将其变成脚本:
$> ./confirm_overwrite.sh "testfile" "some string"
File exists. Overwrite? y/n
y
$> ./confirm_overwrite.sh "testfile" "some string"
File exists. Overwrite? y/n
n
OK, I won't touch the file
$> rm testfile
$> ./confirm_overwrite.sh "testfile" "some string"
$> cat testfile
some string
$> cat confirm_overwrite.sh
if [ -w "$1" ]; then
# File exists and write permission granted to user
# show prompt
echo "File exists. Overwrite? y/n"
read ANSWER
case $ANSWER in
[yY] ) echo "$2" > testfile ;;
[nN] ) echo "OK, I won't touch the file" ;;
esac
else
# file doesn't exist or no write permission granted
# will fail if no permission to write granted
echo "$2" > "$1"
fi