我有一个shell脚本,有时用户有时会忘记所需的arg。所以我需要在某种程度上,如果用户已经提供了特定的参数,那么不应该提示用户提供该特定的arg。有人可以帮忙吗?
示例脚本:
#!/bin/sh
if [ $GAME =="" ]
then
echo Enter path to GAME:
read GAME
else
echo $GAME
fi
示例O / P 1:
$ ./sd.sh -GAME asdasd
输入GAME的路径:
?ASD
示例O / P 2:
$ ./sd.sh
输入GAME的路径:
ASD
答案 0 :(得分:8)
if [ -z "$1" ]; then
echo "usage: $0 directory"
exit
fi
答案 1 :(得分:5)
您可以使用$#
if [ $# -ne 1 ];then
read -p "Enter game" GAME
else
GAME="$1"
fi
$#
表示参数数量。此脚本检查参数的数量是否为1.如果要检查第五个参数,请使用$5
。如果您真的想要更可靠的东西,可以选择使用getopts
。或者支持长选项的GNU getopt
答案 2 :(得分:2)
如果您想使用命名args,请查看getopts
。它是为了按名称提取args而制作的。该链接还有如何使用它的示例。
答案 3 :(得分:1)
#!/bin/sh
game=""
usage="usage: $0 -g game"
while getopts ":hg:" option; do
case "$option" in
h) echo "$usage"
exit
;;
g) game="$OPTARG"
;;
?) echo "illegal option: $OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
[ -z "$game" ] && read -p "enter game: " game
答案 4 :(得分:0)
这是我的shell脚本版本,没有使用可以解决问题的getopts。我使用getopts遇到的问题是将命名参数作为-GAME而不是-g工作,即单个字符。
注意:这里-user和-pass args是针对java的,所以我不需要sh脚本来询问它,因为如果没有提供它们,java会完成这项工作。
#!/bin/sh game=0 if [ $# -ge 1 ];then if [ ${6} = "-GAME" ];then game=1 fi if [ $game -ne 1 ];then echo "Enter path to GAME location" read GAME else GAME=${7} fi echo "Game:" $1 ", Game location: " $GAME else echo "usage: ./run.sh gamename" echo "usage: ./run.sh gamename [-user] [username] [-pass] [password] [-GAME] [path]" fi
输出1:
./ run.sh COD4 -user abhishek -pass hereiam -GAME / home / games
游戏:COD4,游戏地点:/ home / games
输出2:
./ run.sh COD4
./run.sh:line 4:[:=:一元运算符预期
输入GAME位置的路径
/家庭/ mygames
游戏:COD4,游戏地点:/ home / mygames
感谢大家的努力:)