bash-скриптинг: если аргументы равны этой строке, определите переменную как эту строку - PullRequest
187 голосов
/ 16 марта 2012

Я делаю некоторый скрипт bash, и теперь я получил один вызов переменной source и один массив с именем samples, например:

source='country'
samples=(US Canada Mexico...)

, поскольку я хочу увеличить количество источникову каждого источника есть свои образцы) Я попытался добавить некоторые аргументы для этого.Я попробовал это:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

, но когда я запустил свой скрипт source countries.sh country, он не работал.Что я делаю не так?

Ответы [ 4 ]

346 голосов
/ 16 марта 2012

Не забывайте про пробелы:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
156 голосов
/ 14 августа 2013

Вы можете использовать операторы "=" или "==" для сравнения строк в bash.Важным фактором является расстояние в скобках.Правильный метод заключается в том, чтобы в скобках содержался интервал, а в операторах - интервал.В некоторых случаях работают разные комбинации;тем не менее, следующий пример предназначен для универсального примера.

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

Кроме того, обратите внимание, что двойные скобки обрабатываются несколько иначе, чем одиночные скобки ...

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

Надеюсь, это поможет!

10 голосов
/ 16 марта 2012

Похоже, что вы хотите проанализировать аргументы командной строки в вашем bash-скрипте. Я искал это недавно сам. Я наткнулся на следующее, которое, я думаю, поможет вам в анализе аргументов:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

Я добавил фрагмент ниже как tl; dr

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

. / Script.sh -t test -r сервер -p пароль -v

4 голосов
/ 16 марта 2012

На первый взгляд, вы выполняете присваивание = в своем операторе if вместо сравнения == В основном вам нужно сделать:

mysource=""
samples=("")


if [ "$1" == "country" ]; then
   mysource="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

IE:

~$ source /tmp/foo.sh country
~$ echo $samples 
US Canada Mexico...

Ты этого хочешь?

...