Передача текстового параметра unix shell (необязательно) без расширения

384
ihatesh

Я хочу написать сценарий unix / linux updategit.shс параметром по умолчанию для фиксации в git. updategit.shдолжен быть POSIX-совместимым. Я надеюсь, что POSIX решит некоторые из худших несовместимостей оболочек Unix / Linux.

Синтаксис: updategit.sh {$1}

{$1}означает, что параметр $1является необязательным.

1) Если параметр не передан, updategit.shпоследним действием в скрипте должно быть:

git commit -m 'Patches #1023, #1016.4 .. .17 reapplied. See e-mail from Paul (paul@sh.ts) send at 2016-01-26 08:56' 

Достаточно ли передать его в одинарных кавычках, если в тексте нет ни одной кавычки?

2) Должна быть обеспечена возможность передавать дополнительный параметр $1в updategit.sh. Естественный синтаксис заключался бы в том, чтобы заключить параметр в двойные кавычки. Я думаю, что это будет невозможно. Я хочу получить как можно больше, чтобы updategit.shоболочка не разрушила входной параметр и команда не сработала из-за того, что оболочка не работает с вводом.

Естественный синтаксис будет примерно таким:

$ ./updategit.sh "New template GetShape()" $ ./updategit.sh "Patch #312.5 applied. See Eve's email (eve@stoneage.nix) from 2016-02.29 09:43" $ ./updategit.sh "Round to .5 fixed" $ ./updategit.sh 

Понятно, что оболочка будет портить ввод. Насколько близко я мог бы прийти к «естественному» синтаксису без git commit -m $1сбоев? AFAIK команда git commit -m $1должна быть переписана на что-то более надежное.

0

1 ответ на вопрос

1
Ouroborus

Technically all arguments to shell scripts are optional. It's up to the script to determine if there are missing arguments and what to do about it. This can be done in several ways depending on your needs. For a script that has only one argument which is optional, something like this would work:

#!/usr/bin/env sh if [ ${#1} -eq 0 ] then git commit -m "default message" else git commit -m "$1" fi 

This checks if the length of the first argument is zero and acts accordingly. If the first argument is missing, it counts as having zero length. You could also check against number of arguments by comparing against $#.

A shorter variation of the above script, which takes advantage of empty argument substitution, is:

#!/usr/bin/env sh git commit -m "$" 

This sort of thing is described here under "2.6.2 Parameter Expansion".

Более простой версией будет `if [! "$ 1"] `. Обратите внимание на пробелы вокруг `[` и `]` - это _команда_, а не какой-то магический синтаксис. grawity 8 лет назад 1
@ Grawity Исправлено ... Ouroborus 8 лет назад 0

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