Как я использую $* при исключении определенных входных переменных как 1$ и 2$ в сценарии удара?

Например,

elif [[ $append = $1 ]]
then
  touch ~/directory/"$2".txt
  echo "$variable_in_question" >> ~/directory/"$2".txt

любому создают текстовый файл, содержащий весь вход после "$2" , или добавьте файл существующего текста со всем входом после "$2", что я использовал бы вместо "$variable_in_question" в строке 4?

Я в основном хочу "$*", но исключение "$1" и "$2".

15
задан 4 March 2018 в 09:05

3 ответа

Можно использовать bash Расширение параметра для определения диапазона это работает с позиционными параметрами также. Для $3$n это было бы:

"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"

Знайте это оба $@ и $* проигнорируйте первый аргумент $0. Если Вы задаетесь вопросом который использовать в Вашем случае: очень вероятно, что Вы хотите заключенный в кавычки $@. Не использовать $* если Вы явно не хотите, чтобы аргументы были заключены в кавычки индивидуально.

Можно испытать его следующим образом:

$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6

Обратите внимание на это в первом примере $0 заполнено первым аргументом 0 в то время как при использовании в сценарии $0 вместо этого заполнено названием сценария, как вторые шоу в качестве примера. Название сценария к bash конечно, первый аргумент, просто что он обычно не чувствовал как таковой – то же идет для сценария, сделанного исполняемым файлом и названный “непосредственно”. Таким образом в первом примере мы имеем $0=0, $1=1 и т.д., в то время как во втором это $0=script_file, $1=0, $2=1 и т.д.; ${@:3} выбирает каждый аргумент, запускающийся с $3.

Некоторые дополнительные примеры для возможных диапазонов:

 # two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
 # every argument starting with the second to last one
 # a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
 # two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3

Дальнейшее чтение:

32
ответ дан 23 November 2019 в 02:38

Вы можете использовать встроенную функцию shift:

$ help shift
shift: shift [n]
    Shift positional parameters.

    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
    not given, it is assumed to be 1.

    Exit Status:
    Returns success unless N is negative or greater than $#.

Пример. учитывая

$ cat argtest.bash 
#!/bin/bash

shift 2

echo "$*"

затем

$ ./argtest.bash foo bar baz bam boo
baz bam boo
27
ответ дан 23 November 2019 в 02:38

Обычно можно скопировать позиционные параметры в массив, удалить произвольные индексы массива и затем использовать массив для расширения до точно тех индексов, которые Вы хотите, не теряя Ваши исходные аргументы.

Например, если я хотел весь args кроме первого, четвертого и пятого:

args=( "$@" )
unset args[0] args[3] args[4]
echo "${args[@]}"

В копии индексы смещаются на 1 с тех пор $0 не часть $@.

13
ответ дан 23 November 2019 в 02:38

Другие вопросы по тегам:

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