我正在尝试为学校编写一个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参数,这就有效。所以我一直试图逃避参数的内容,但我找不到答案。 我对任何解决方案都很好,是另一种测试第二个参数是否以 - 开头的方式,或者是一种逃避内容的方法。
感谢您阅读本文。
答案 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)
首选printf
到echo
,因为它的行为更好地定义,并且在各个实现中更加一致。
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选项。