Bash脚本中使用变量执行tar命令报错的问题排查
问题原因与解决办法
1. read命令的语法错误
你写错了read的用法——read后面直接写变量名就行,不能加$符号。$是用来读取变量值的,而read是给变量赋值,正确写法是read dir,不是read $dir。
当你写read $dir时,dir变量还没赋值,$dir是空的,相当于执行read(不带变量名),这时候你输入的内容会被存到默认变量REPLY里,而你的dir变量还是空的。所以tar命令里的$dir没有实际路径,tar找不到要打包的内容,就会报错“Cowardly refusing to create an empty archive”。
2. 波浪号(~)的扩展问题
就算修正了read的写法,直接输入~/test也可能出问题:read读取的字符串里的~不会被shell自动转换成你的家目录路径。解决这个问题有两种方式:
- 让用户输入绝对路径(比如
/home/你的用户名/test) - 用eval命令扩展波浪号,把输入的
~/test转换成实际路径
另外,给变量加上双引号"$dir",能避免路径里有空格时出现错误。
修正后的完整脚本
#!/bin/bash echo "Backup which directory?" read dir eval dir="$dir" tar --create --verbose --bzip2 --file=myfile.tbz "$dir"
内容的提问来源于stack exchange,提问作者WDUK
相关产品推荐
相关产品推荐

