自定义脚本echo -e参数

时间:2017-02-06 09:05:51

标签: linux bash

我正在尝试为学校编写一个bash脚本。我们被要求使用linux工具进行备份。我正在尝试使用参数更好地体验,让用户自定义备份。我想在使用时考虑到这些参数,所以我试图看看第二个参数是否以 - 开头,知道如果它以 - 它是另一个参数,那么我想要一个不同的行为。

echo "$2" | grep "^-" > /dev/null
if [[ $? -eq 0 ]]; then
  #This works while the parameters are not -e, -E or -n
  echo $2
  echo "Input backup folder"
  read path
else
  path=$2
  shift
fi

所以,问题是: 你知道我怎么能绕过这个问题? 我发现只要参数不是-e,-E和-n是echo参数,这就有效。所以我一直试图逃避参数的内容,但我找不到答案。 我对任何解决方案都很好,是另一种测试第二个参数是否以 - 开头的方式,或者是一种逃避内容的方法。

感谢您阅读本文。

3 个答案:

答案 0 :(得分:2)

实现您的目标功能的更惯用的方式是

case "$2" in
  (-*)
    echo "Set parameter '$2'"
    read -p "Input backup folder: " path
  ;;
  (*)
    path="$2"
    echo "Path: $path"
  ;;
esac
shift

但这只是故事的一部分......你应该围绕一个while [ -n "$1" ]; do ...; done循环包裹它,依此类推。但你可能已经知道了。

(另外,使用$path作为备份文件夹是有效的,并且是完全合法的;变量名称区分大小写,shell不会混淆,但也许人类读者可能会被{{{ 1}}是一个完全不同的东西。)

答案 1 :(得分:1)

首选printfecho,因为它的行为更好地定义,并且在各个实现中更加一致。

if [[ $2 = -* ]]; then
    printf '%s\n'  "$2"
    echo "Input backup folder"
    read path
else
    path=$2
    shift
fi

但是,您应该查看getopt命令,该命令提供对选项及其参数的处理。

答案 2 :(得分:0)

默认情况下,参数分隔符是一个空格,因此请记住此测试:

$ function test { echo "First Parameter:$1";echo "Second Parameter:$2";}
$ test alpha veta
First Parameter:alpha
Second Parameter:veta

如果你需要将alpha veta作为一个参数传递,你需要在它们周围使用单引号,或者根据你自己的标准在你的脚本中以你自己的方式处理这些参数。

要测试参数是否以-开头,您可以使用第一个char ${1:0:1}然后您可以将其与"-"进行比较。 例如:

$ function test { echo "First Parameter:$1";echo "Second Parameter:$2"; if [[ "${1:0:1}" == "-" ]];then echo "First Char is a dash";fi;}
$ test -alpha veta
First Parameter:-alpha
Second Parameter:veta
First Char is a dash

更新:
如果您像这样修改grep,那么您的示例可以正常运行并且不会遇到像-e或-E这样的参数:

echo "$2" | grep -e "^-" > /dev/null

-e grep开关告诉grep它所遵循的是一个模式。

众所周知,如果grep中没有提供-e选项,则会导致以dash开头的模式出现问题,因为grep会将这些模式误解为grep选项。