Аргументы в вашем скрипте bash. [Дубликат]

Попробуйте переключить отображение a на block, а затем используйте любой желаемый стиль. Элемент a заполнит элемент li, и вы сможете изменить его внешний вид по своему желанию. Не забудьте установить li дополнение на 0.

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}
76
задан William Perron 28 October 2016 в 23:00
поделиться

5 ответов

Аргументы, которые вы предоставляете bashscript, будут отображаться в переменных $1 и $2 и $3, где число ссылается на аргумент. $0 - это сама команда.

Аргументы разделены пробелами, поэтому, если вы предоставите команды -from и -to в команде, они тоже попадут в эти переменные, поэтому для это:

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

Вы получите:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

Может быть проще опустить -from и -to, например:

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

Тогда у вас будет:

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

Недостатком является то, что вам нужно будет поставить его в правильном порядке. Существуют библиотеки, которые упрощают анализ именованных аргументов в командной строке, но обычно для простых сценариев оболочки вы должны просто использовать простой способ, если это не проблема.

Тогда вы можете сделать:

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Двойные кавычки вокруг $1 и $2 не всегда необходимы, но рекомендуются, потому что некоторые строки не будут работать, если вы не ставите их между двойными кавычками.

90
ответ дан rednaw 19 August 2018 в 05:43
поделиться

Используйте переменные "$1", "$2", "$3" и т. д. для доступа к аргументам. Чтобы получить доступ ко всем из них, вы можете использовать "$@" или получить количество аргументов $# (может быть полезно проверить слишком мало или слишком много аргументов).

25
ответ дан Alexey Grigorev 19 August 2018 в 05:43
поделиться

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

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

Обоснование: я включил скрипт launcher.sh, так как целая операция имела несколько шагов, которые были квазинезависимы друг от друга (я говорю «квази», потому что, хотя каждый скрипт можно запускать сам по себе, они, как правило, все работали вместе), и через два дня я узнал, что около половины моих коллег, будучи программистами и всеми, были слишком хороши, чтобы использовать файл запуска, следовать «использованию» или читать ПОМОЩЬ, которая отображалась каждый раз, когда они делали что-то неправильно, и они делали беспорядок в целом , запускать скрипты с аргументами в неправильном порядке и жалуясь, что скрипты не работают должным образом. Я холерик, я решил перестроить все свои сценарии, чтобы убедиться, что они являются коллегами. Первый сегмент кода был первым.

15
ответ дан CJBS 19 August 2018 в 05:43
поделиться
  • 1
    Мне это нравится. Я добавляю раздел в конце `else echo & quot; Invalid argument: $ {! I} & quot; ((i ++)) fi ` – CJBS 21 January 2015 в 20:30
  • 2
    Я предпочитаю это решение. его читаемый и простой в использовании. – Christian Noel 13 May 2015 в 04:53

В bash $1 - первый аргумент, переданный скрипту, $2 второй и т. д.

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Итак, вы можете использовать:

./your_script.sh some_source_file.png destination_file.txt

Объяснение на двойных кавычках

рассмотрите три сценария:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

Теперь вызывается:

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

Когда вы вызываете foo.sh "a b", он вызывает bar.sh a b (два аргумента), а с помощью foo2.sh "a b" он вызывает bar.sh "a b" (1 аргумент). Всегда имейте в виду, как параметры передаются и расширяются в bash, это сэкономит вам много головной боли.

6
ответ дан Jakub M. 19 August 2018 в 05:43
поделиться

Если вы не полностью привязаны к использованию «от» и «к» в качестве имен ваших опций, это довольно просто реализовать с помощью getopts :

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts - это программа, которая обрабатывает аргументы командной строки и удобно анализирует их для вас.

f:t: указывает, что вы ожидаете 2 параметра, которые содержат значения (обозначенные двоеточием). Что-то вроде f:t:v говорит, что -v будет интерпретироваться только как флаг.

opts - это где текущий параметр сохраняется. Инструкция case - это то, где вы будете обрабатывать это.

${OPTARG} содержит значение, следующее за параметром. ${FROM_VAL}, например, получит значение /home/kristoffer/test.png, если вы запустили свой скрипт следующим образом:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Как показывают другие, если вы впервые пишете bash скрипты, которые вы должны действительно читать по некоторым основам. Это было просто краткое руководство по работе getopts.

55
ответ дан Manny D 19 August 2018 в 05:43
поделиться
  • 1
    Это кажется читаемым решением. Как бы вы указали два флага? – Zelphir 6 May 2016 в 12:51
  • 2
    @Zelphir, вы можете указать два или более флагов, просто опустив & quot;: & quot; после флага. Например, f:t:vs будет -f some_f -t some_t -v -s – h_s 18 July 2017 в 13:21
Другие вопросы по тегам:

Похожие вопросы: