示例:
./ cmp.sh / home / user
将是/ home / user /home/user_2018-03-11.tar.bz2
我已经领先,但我被困了
#!/bin/bash
if ["$1" == ""]; then
echo "Help : To compress file use argument with directory"
exit 0
fi
if [[ -f "$1" || -d "$1" ]]; then
tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1
fi
但输出是_22-04-2018.tar.bz2
答案 0 :(得分:3)
我看到你正在使用引号来避免下划线被用作变量名称的一部分的问题。因此,虽然$1
是位置参数,但$1_
是您未在脚本中设置的变量。您可以使用花括号来避免此问题,例如${1}
。大括号内的任何内容都是变量名称的一部分,因此${1}_
起作用。这种表示法优于$1"_"
,它将用户提供的变量留在引号之外。 (当然,"$1"_
也可以完成这项工作。)
此外,在变量中设置文件名可能更安全,然后将其用于满足您的所有需求:
#!/bin/bash
if [ -z "$1" ]; then
echo "Help : To compress file use argument with directory"
exit 0
fi
filename="${1}_$(date '+%F').tar.bz2"
if [ -e "$filename" ]; then
echo "WARNING: file exists: $filename" >&2
else
tar -cvjSf "$filename" "$@"
fi
的变化:
if
条件下方括号周围需要空格-z
更干净,但你也可以测试[ $# -eq 0 ]
,计算所提供的参数,$filename
确保您的测试和tar
将始终使用相同的名称,即使脚本在午夜运行,并且更具可读性,另外,您确定tar的-S
选项吗?在我的系统上,该选项提取稀疏文件,仅与-x
一起使用。
另外,我应该注意到,当我重写它时,此脚本中没有任何内容特定于 bash ,并且它也应该可移植到POSIX shell(灰/短划线/等) )。 Bash很棒,但它并不普及,如果通过你的学习之旅你可以学到两者,它将为你提供跨多种操作系统和环境的有用技能。
答案 1 :(得分:1)
使用-z开关检查是否为空白
#!/bin/bash
if [[ -z "$1" ]]; then
echo "Help : To compress file use argument with directory"
exit 0
fi
if [[ -f "$1" || -d "$1" ]]; then
tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1
fi