Ответ 1
Не забывайте про пробелы:
source=""
samples=("")
if [ $1 = "country" ]; then
source="country"
samples="US Canada Mexico..."
else
echo "try again"
fi
Я делаю несколько bash script, и теперь у меня есть один вызов переменной 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
но когда я запустил свой script source countries.sh country
, он не сработал.
Что я делаю неправильно?
Не забывайте про пробелы:
source=""
samples=("")
if [ $1 = "country" ]; then
source="country"
samples="US Canada Mexico..."
else
echo "try again"
fi
Для сравнения строк в 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).
Я надеюсь, что это поможет!
Кажется, что вы пытаетесь проанализировать аргументы командной строки в bash script. Я искал это недавно. Я натолкнулся на следующее, которое, я думаю, поможет вам разобрать аргументы:
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 server -p password -v
На первый взгляд вы выполняете присваивание =
в своей инструкции 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...
Это то, что вы хотите?