Аргумент сценария оболочки присутствует или нет - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть сценарий оболочки, где иногда пользователь дает требуемый аргумент, а иногда забывает.Так что мне нужно было каким-то образом, чтобы, если пользователь уже предоставил конкретный аргумент, пользователю не нужно было запрашивать этот конкретный аргумент.Кто-нибудь может помочь?

Пример сценария:

#!/bin/sh
if [ $GAME =="" ]
then
    echo Enter path to GAME:
    read GAME
else
    echo $GAME
fi

Пример O / P 1:

$ ./sd.sh -GAME asdasdВведите путь к игре:? ASD

Пример O / P 2:

$ ./sd.shВведите путь к игре:ASD

Ответы [ 5 ]

8 голосов
/ 21 апреля 2011
if [ -z "$1" ]; then
    echo "usage: $0 directory"
    exit
fi
5 голосов
/ 21 апреля 2011

вы можете проверить первый аргумент, используя $#

if [ $# -ne 1 ];then
    read -p "Enter game" GAME
else
    GAME="$1"
fi

$# означает количество аргументов.Этот сценарий проверяет, равно ли число аргументов 1. Если вы хотите проверить пятый аргумент, используйте $5.Если вы действительно хотите что-то более надежное, вы можете использовать getopts.Или GNU getopt , который поддерживает длинные опции

2 голосов
/ 21 апреля 2011

Если вы хотите использовать именованные аргументы, проверьте getopts.Это сделано для извлечения аргументов по имени.Эта ссылка также содержит примеры того, как ее использовать.

1 голос
/ 21 апреля 2011
#!/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
0 голосов
/ 23 апреля 2011

Вот моя версия сценария оболочки без использования getopts, которая решает проблему.Проблема, с которой я сталкиваюсь при использовании getopts, состоит в том, чтобы задавать именованные аргументы как -GAME, вместо этого работает только -g, то есть один символ.

Примечание.Сценарий 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 -пользовательский абхишек -пропустить здесь -GAME / home / gamesИгра: COD4, Расположение игры: / дома / игры

Выход 2:

. / Run.sh COD4./run.sh: строка 4: [: =: ожидается унарный операторВведите путь к месту игры/ главная / MyGamesИгра: COD4, Местоположение игры: / home / mygames

Спасибо всем за усилия :) 1020 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...