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


225

Я делаю некоторый сценарий 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он не работал. Что я делаю не так?


2
как это не работает? Когда вы запускаете его, вы получаете сообщение об ошибке, или оно говорит «попробуйте снова», или что-то еще?
злой отто

2
да, вы можете подумать «вопрос очень простой». но вы думали об этом некоторое время. Пожалуйста, отредактируйте ваш вопрос, включив в него требуемые результаты и любые сообщения об ошибках, которые вы получаете. +1 за то, что действительно пробовал что-то и хорошее форматирование вопроса. удачи.
Shellter

Почему этот код совпадает с предложенным и принятым решением? Это сбивает с толку ... Я предполагаю, что в первоначальном вопросе не было пробелов сразу после открывающей скобки и перед закрывающей скобкой предложения if?
Стеф

6
@ Стеф, если присмотреться, $1="country"против$1 = "country"
Уилл

Ответы:


413

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

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

121
Я не могу поверить, что я потратил три часа на это, и была только проблема пробелов !!!! ... СПАСИБО @Alex
Alejandro

1
Почему вы используете samples="US Canada Mexico..."после введения создания массива раньше samples=(US Canada Mexico...)?
пользователь неизвестен

10
У меня возникли проблемы с этим, когда переменная слева была пустой строкой. Исправить было if [ "$1" = "country" ]; then.
andrewb

8
Хорошо, вот и все. Bash официально получил мой голос за то, что был самым устаревшим, но все еще используемым командным языком. Синтаксис настолько неинтуитивен, что причиняет боль. На самом деле нет места для этого в 2016+. @Systemd авторов: не могли бы вы сделать "создание оболочки Linux, которая не сосет" ваш следующий проект? Я брошу на тебя деньги.
Маси

3
@masi Иногда я думаю, что первоначальная цель Unix заключалась в том, чтобы «обеспечить работу через мрак». если бы инструменты были загадочными для использования, трудными для понимания и, как правило, недоступными для великого немытого без внутреннего знания, передаваемого от мастера к падвану, это гарантировало бы, что для тех, кто «в курсе», всегда найдется работа. эта философия очевидна во всей конструкции "RFC" и в изящном языке, используемом в документах man, который, в то время как технически говорит вам, как использовать инструменты, на самом деле был только для того, чтобы выполнить требование о документировании инструментов. мало что изменилось
несинхронизировано

184

Вы можете использовать операторы "=" или "==" для сравнения строк в 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).

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


12

Похоже, что вы хотите проанализировать аргументы командной строки в вашем 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.