Ce înseamnă acest $ {@: 2} în scripturile shell

Văd asta într-un script shell.

variable=${@:2} 

Ce face?

Comentarii

  • Exact așa a arătat în script? Sintaxa arată ca o matrice, dar lipsesc unele piese. Puteți, vă rog, să postați câteva linii în jurul acestei linii din script?
  • Aceasta este o variabilă care începe de la a doua literă. var="my_value"; echo var="${var[@]:2}"; echo "$var" Vedeți diferența?

Răspuns

Este „s afișarea conținutului variabilei speciale $@, în Bash. Conține toate argumentele liniei de comandă, iar această comandă preia toate argumentele din a doua și le stochează într-o variabilă , variable.

Exemplu

Iată un script examp.

#!/bin/bash echo ${@:2} variable=${@:3} echo $variable 

Exemplu de rulare:

./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5 

Referințe

Comentarii

  • Rețineți că tehnica afișată combină argumentele date într-un singur şir. Dacă trebuie să le păstrați ca argumente separate, utilizați o matrice: vars=( "${@:2}" )
  • @glennjackman – vă mulțumim că ați arătat acest lucru.
  • De asemenea, rețineți utilizarea parantezelor cretate. Ar trebui să folosiți întotdeauna paranteze cretate, dar Bash vă permite să le omiteți atunci când contextul este lipsit de ambiguitate. Prin urmare, $@ și ${@} sunt identice, deși acesta din urmă este " mai corect " sintaxă. Trebuie să utilizați parantezele cu ${@:2}, deoarece $@:2 este ambiguu și, prin urmare, ar fi interpretat ca ${@}:2, care nu este același lucru.

Răspuns

Că „sa ksh caracteristică găsită și în bash și versiunile recente ale zsh.

În ksh și bash, puteți accesa mai multe elemente ale unui tablou utilizând sintaxa ${array[@]:first:length}, care se extinde până la length (sau toate dacă length este omis) elemente din array array (în lista elementelor matricei sortate numeric pe indexuri), începând cu primul cu index mai mare sau egal cu first. Când se află în context scalar (ca aici într-un atribuirea unei variabile scalare) lista elementelor este unită cu spațiul ch caractere cu bash și ksh93 și cu primul caracter al $IFS (sau nimic dacă $IFS este gol sau spațiu dacă nu este setat) cu zsh.

De exemplu:

$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d> 

$@ este un caz special. $@ este matricea de parametri poziționali ($1, $2 …). Dar când este utilizat cu :, este inclus și $0. Deci, ${@:1} este același lucru cu $@, nu ${@:0} ca pentru alte tablouri.

În zsh, este ușor diferit. zsh a adăugat ksh sintaxă doar recent pentru compatibilitate, dar are propria sa sintaxă pentru selectarea intervalelor de elemente.

Contrar ksh și bash, zsh matricele sunt un tip de variabilă diferit de variabilele scalare, nu sunt rare (zsh are tablouri asociative ca alt tip de variabilă) și începe la indexul 1 în loc de 0.

Pentru zsh, accesați intervalele elementelor matricei cu $a[first,last] (unde last poate fi, de asemenea, negativ pentru a număra înapoi de la sfârșit).

În zsh,

a[23]=a a[5]=b a[235]=c a[45]=d 

creează o matrice cu 235 de elemente, majoritatea goale. $a[12,50] s-ar extinde la elementele 12 – 50 și ${a[@]:12:2} s-ar extinde doar la (gol) $a[12] și $a[13] elemente. Ca un caz special și din nou pentru portabilitate cu ksh93 și bash, zsh acceptă, de asemenea, un 0 primul element pentru $@ și tratează acest lucru ca $0.

Deci, puteți utiliza ${a[@]:x:n} și ${@:x:n} portabil pe toate cele 3 cochilii, dar numai pentru matricele care nu sunt rare și să acordați atenție valoarea IFS.

Comentarii

  • Vă mulțumim că ați explicat sintaxa indexării matricei

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *