Способы установки позиционных параметров в bash

Попробуйте следующее:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

Первый grep ищет passwd строки с uid, равным четырем или более цифр. Второй grep отфильтровывает строку с uid 1000. Статус выхода будет равен 0, если остались строки, и 1, если нет.

4
15.07.2017, 00:56
2 ответа

Разница между --и -заключается в том, что при использовании -параметры -xи -vтакже не устанавливаются.

$ set -vx
$ echo "$-"
himvxBHs                # The options -v and -x are set.

$ set - a b c
$ echo "$-  <>  $@"     # The -x and -v options are turned off.
himBHs  <>  a b c

Это обычный способ, которым оболочки принимают -, однако в POSIX эта опция «не указана»:

If the first argument is '-', the results are unspecified.

Довольно часто используется разница между set --и обычным set.
Это ясно объяснено в руководстве:

-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the args, even if some of them begin with a -.

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

$ set -- -a -b -e -f arg1
$ echo "$@"
-a -b -e -f arg1

Вместо:

$ set -a -b -e -f arg1
$ echo "$@"
arg1

Но также изменились некоторые параметры оболочки.

Неиспользование любого из -или --позволит установить параметры набора с переменными, которые расширяются до имен параметров (, даже если они заключены в кавычки):

$ echo "$-"
himBHs

$ a='-f'
$ set "$a"

$ echo "$-"
fhimBHs
12
27.01.2020, 20:46

Разница между set argumentи set -- argumentхарактерна для многих других команд.

Иногда у вас есть аргумент, начинающийся с -, но на самом деле вы не можете его использовать, потому что команда считает, что (, поскольку он начинается с -), на самом деле является параметром команды.

То, что --говорит, фактически :«Достаточно! Все, что следует, даже если оно начинается с -, является фактическим аргументом».

Обычно (в соответствии со страницами руководства )для этой цели одиночный -эквивалентен --.

Пример

Вы можете использовать:

set -- -a -b file1 file2  

для установки $1, $2, $3и $4на -a, -b, file1и file2соответственно. --не сохраняется -, это просто индикатор; без этого,-aи -bбудут интерпретироваться как возможные варианты для самой команды set.

8
27.01.2020, 20:46

Теги

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