Bash'de bir komut satırı argümanı nasıl değiştirilir?


98

Bash komut dosyasında komut satırı bağımsız değişkenlerini değiştirmenin bir yolu var mı? Örneğin, bir Bash betiği şu şekilde çağrılır:

./foo arg1 arg2  

Komut dosyasında arg1'in değerini değiştirmenin bir yolu var mı? Gibi bir şey:

$1="chintz"

Yanıtlar:


154

Tüm bağımsız değişkenleri sıfırlamalısınız. Örneğin değiştirmek için $3:

$ set -- "${@:1:2}" "new" "${@:4}"

Temel olarak, değiştirmek istediğiniz argümanlar dışındaki tüm argümanları mevcut değerlerine ayarlarsınız . POSIX 7 tarafından da belirtilmiştir .set --

"${@:1:2}"Gösterimi (dolayısıyla iki genişletilir 2gösterimde) başlanarak konumsal argümanlar ofset 1(örneğin $1). Bu, "$1" "$2"bu durumda için bir kısaltmadır , ancak örneğin, değiştirmek istediğinizde çok daha kullanışlıdır "${17}".


1
yani 3 doları değiştirmek için 1 doları ve 2 doları da değiştirmem gerekiyor, değil mi? Ve onları neye değiştirecek? "Sıfırlama" ne anlama geliyor?
Sriram

Hile için teşekkürler! Gömülü boşluklar içeren dosya adları için bunu kullanmakta zorlandım. Böyle bir sorun haline çalışabilir herkesten için koymayı deneyin evalbaşına sıranın en önünde bu .
cxw

2
Değiştirmek istediğiniz parametrenin konumunu bildiğinizde bu tamamdır. Ya gerçekten bilmiyorsanız ve dinamik olarak değiştirmeniz gerekiyorsa? $ Set - "$ {: 1: $ pivot}" ile denedim ama orada bir değişken kabul etmiyor.
Daniele Segato

1
Aynı şeyi bir işlevin içinden nasıl yapabilirim? Çözümünüz bir işlevin içinden çağrıldığında işe yaramıyor gibi görünüyor.
Hashken

3
Bir komut dosyasının konumsal parametrelerini bir işlevin içinden değiştiremezsiniz - işlevin kendi bağımsız değişkenleri onları gizler. Bununla birlikte, bunları bir dizide saklayabilir ve bunun üzerinde işlem yapabilirsiniz.
thkala

23

Okunabilirliği ve bakımı için optimize, sen atama daha iyi olabilir $1ve $2(Bilmiyorum, daha anlamlı değişkenlere input_filename = $1ve output_filename = $2falan) o zaman ve bu değişkenlerden birini (üzerine yazarak input_filename = 'chintz'o durumda,) değişmeden komut girişini bırakarak başka yerde gerekli.


Girdi argümanlarından birini değiştirebileceğim bir yaklaşım istedim. Komut dosyasından bir değer döndürmek istediğim için bunu yapmam gerekiyordu. Thkala tarafından önerilen cevap iyi çalıştı. Cevabınız için teşekkürler !!!
Sriram

3
@Johnsyweb Kabul edildi. Okunabilirlik uğruna, sizinki daha iyi bir yöntemdir.
Dss

1
"Durumun daha iyi" her zaman sağlanmayan kullanım durumuna bağlıdır.
Him

2
@Scott 7 yaş büyük ve bu cevabı yazdığımdan daha tecrübeli olduğum için size katılıyorum.
Johnsyweb

Bunun işe yaramayacağı örnek ($ FIRST_PARAMETER gibi bir şey kullanmak dışında): gerçek değere bağlı olarak parametrenin kullanımına ve anlamına sahip olmak.
Igor Stoppa

0

Bunun eski bir soru olduğunu biliyorum ama thkala'nın cevabını çok yararlı buldum , bu yüzden bu fikri kullandım ve tanımlanmamış herhangi bir argüman için varsayılanlar eklememe olanak sağlamak için biraz genişlettim - örneğin:


    # set defaults for the passed arguments (if any) if not defined.
    #
    arg1=${1:-"default-for-arg-1"}
    arg2=${2:-"default-for-arg-2"}
    set -- "${arg1}" "${arg2}"
    unset arg1 arg2

Umarım bu başka biri için faydalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.